{"version":3,"sources":["vendor/ember-cli/app-prefix.js","connections-ui/adapter.js","connections-ui/adapters/application.js","connections-ui/adapters/call-forwarding.js","connections-ui/adapters/callv2.js","connections-ui/adapters/coded-geolocation.js","connections-ui/adapters/conversation.js","connections-ui/adapters/division.js","connections-ui/adapters/externalcontacts/contact.js","connections-ui/adapters/externalcontacts/external-organization.js","connections-ui/adapters/geolocation-settings.js","connections-ui/adapters/geolocation.js","connections-ui/adapters/grant.js","connections-ui/adapters/group-policy.js","connections-ui/adapters/group.js","connections-ui/adapters/library.js","connections-ui/adapters/location.js","connections-ui/adapters/meeting.js","connections-ui/adapters/person.js","connections-ui/adapters/public-api-user.js","connections-ui/adapters/purecloud-user.js","connections-ui/adapters/purecloud.js","connections-ui/adapters/queue.js","connections-ui/adapters/recorded-call.js","connections-ui/adapters/recording.js","connections-ui/adapters/response.js","connections-ui/adapters/role.js","connections-ui/adapters/station.js","connections-ui/adapters/user.js","connections-ui/adapters/voicemail-message.js","connections-ui/app.js","connections-ui/application-loading/template.js","connections-ui/attach-media-stream/util.js","connections-ui/audio-visualizer/component.js","connections-ui/authenticators/directory.js","connections-ui/authenticators/test.js","connections-ui/authorizers/directory.js","connections-ui/cldrs/ar.js","connections-ui/cldrs/cs.js","connections-ui/cldrs/da.js","connections-ui/cldrs/de.js","connections-ui/cldrs/en.js","connections-ui/cldrs/es.js","connections-ui/cldrs/fi.js","connections-ui/cldrs/fr.js","connections-ui/cldrs/he.js","connections-ui/cldrs/hi.js","connections-ui/cldrs/it.js","connections-ui/cldrs/ja.js","connections-ui/cldrs/ko.js","connections-ui/cldrs/nl.js","connections-ui/cldrs/no.js","connections-ui/cldrs/pl.js","connections-ui/cldrs/pt.js","connections-ui/cldrs/ru.js","connections-ui/cldrs/sv.js","connections-ui/cldrs/th.js","connections-ui/cldrs/tr.js","connections-ui/cldrs/uk.js","connections-ui/cldrs/zh.js","connections-ui/components/accessible-checkbox/component.js","connections-ui/components/admin-ui-modal/component.js","connections-ui/components/admin-ui-modal/template.js","connections-ui/components/alert-message/component.js","connections-ui/components/analog-clock/component.js","connections-ui/components/analog-clock/template.js","connections-ui/components/anchor-tag/component.js","connections-ui/components/anchor-tag/template.js","connections-ui/components/app-img/component.js","connections-ui/components/app-img/template.js","connections-ui/components/audio-player-v2/component.js","connections-ui/components/audio-player-v2/participant/component.js","connections-ui/components/audio-player-v2/timeline/component.js","connections-ui/components/audio-player-v2/waveform-graph/component.js","connections-ui/components/audio-player/component.js","connections-ui/components/audio-player/seek-bar/component.js","connections-ui/components/audio-player/seek-bar/template.js","connections-ui/components/audio-player/template.js","connections-ui/components/audio-recorder/component.js","connections-ui/components/audio-recorder/template.js","connections-ui/components/auth-loading/component.js","connections-ui/components/auth-loading/template.js","connections-ui/components/basic-dropdown.js","connections-ui/components/basic-dropdown/content-element.js","connections-ui/components/basic-dropdown/content.js","connections-ui/components/basic-dropdown/trigger.js","connections-ui/components/card-tree/card-tree-entry/component.js","connections-ui/components/card-tree/card-tree-entry/template.js","connections-ui/components/card-tree/component.js","connections-ui/components/card-tree/template.js","connections-ui/components/card-view/component.js","connections-ui/components/card-view/template.js","connections-ui/components/characters-used/component.js","connections-ui/components/characters-used/template.js","connections-ui/components/chat-settings/component.js","connections-ui/components/chat-settings/template.js","connections-ui/components/click-outside.js","connections-ui/components/create-entity-menu/component.js","connections-ui/components/create-entity-menu/template.js","connections-ui/components/date-picker/component.js","connections-ui/components/date-picker/template.js","connections-ui/components/desktop-notification/component.js","connections-ui/components/document-title.js","connections-ui/components/drag-drop-container/component.js","connections-ui/components/drag-drop-container/template.js","connections-ui/components/drag-drop-item/component.js","connections-ui/components/drag-drop-item/template.js","connections-ui/components/drop-down/component.js","connections-ui/components/dropdown-menu/component.js","connections-ui/components/dropdown-menu/template.js","connections-ui/components/duration-format/component.js","connections-ui/components/edit-profile-picture/component.js","connections-ui/components/edit-profile-picture/template.js","connections-ui/components/ember-modal-dialog-positioned-container.js","connections-ui/components/ember-modal-dialog/-basic-dialog.js","connections-ui/components/ember-modal-dialog/-in-place-dialog.js","connections-ui/components/ember-modal-dialog/-liquid-dialog.js","connections-ui/components/ember-modal-dialog/-liquid-tether-dialog.js","connections-ui/components/ember-modal-dialog/-tether-dialog.js","connections-ui/components/ember-tether.js","connections-ui/components/ember-wormhole.js","connections-ui/components/emergency-location/component.js","connections-ui/components/emergency-location/template.js","connections-ui/components/emoji-dom/component.js","connections-ui/components/entity-contact-group-v2/component.js","connections-ui/components/entity-contact-group-v2/template.js","connections-ui/components/entity-contact-group/component.js","connections-ui/components/entity-contact-queue/component.js","connections-ui/components/entity-contact/component.js","connections-ui/components/entity-contact/template.js","connections-ui/components/entity-favorite/component.js","connections-ui/components/entity-field-section/-section-footer/template.js","connections-ui/components/entity-field-section/-section-header/template.js","connections-ui/components/entity-field-section/add-new/component.js","connections-ui/components/entity-field-section/add-new/template.js","connections-ui/components/entity-field-section/component.js","connections-ui/components/entity-field-section/entity-contact-info/component.js","connections-ui/components/entity-field-section/entity-contact-info/contact-group-choices/component.js","connections-ui/components/entity-field-section/entity-contact-info/contact-group-choices/template.js","connections-ui/components/entity-field-section/entity-contact-info/contact-info-group.js","connections-ui/components/entity-field-section/entity-contact-info/template.js","connections-ui/components/entity-field-section/entity-education/component.js","connections-ui/components/entity-field-section/entity-groups/component.js","connections-ui/components/entity-field-section/entity-groups/template.js","connections-ui/components/entity-field-section/entity-location/component.js","connections-ui/components/entity-field-section/entity-relationships/component.js","connections-ui/components/entity-field-section/entity-relationships/relationship-field/component.js","connections-ui/components/entity-field-section/entity-relationships/relationship-field/template.js","connections-ui/components/entity-field-section/entity-relationships/relationship-group.js","connections-ui/components/entity-field-section/entity-relationships/relationship-label/component.js","connections-ui/components/entity-field-section/entity-relationships/relationship-label/template.js","connections-ui/components/entity-field-section/entity-relationships/relationship-search/component.js","connections-ui/components/entity-field-section/entity-relationships/template.js","connections-ui/components/entity-field-section/template.js","connections-ui/components/entity-fields/address-field/component.js","connections-ui/components/entity-fields/address-field/template.js","connections-ui/components/entity-fields/boolean-field/component.js","connections-ui/components/entity-fields/boolean-field/template.js","connections-ui/components/entity-fields/date-field/component.js","connections-ui/components/entity-fields/date-field/template.js","connections-ui/components/entity-fields/email-field/component.js","connections-ui/components/entity-fields/email-field/template.js","connections-ui/components/entity-fields/history-field/component.js","connections-ui/components/entity-fields/history-field/template.js","connections-ui/components/entity-fields/image-field/component.js","connections-ui/components/entity-fields/location-field/component.js","connections-ui/components/entity-fields/location-field/template.js","connections-ui/components/entity-fields/multiline-text-field/component.js","connections-ui/components/entity-fields/multiline-text-field/template.js","connections-ui/components/entity-fields/person-field/component.js","connections-ui/components/entity-fields/person-field/template.js","connections-ui/components/entity-fields/phone-field/component.js","connections-ui/components/entity-fields/phone-field/template.js","connections-ui/components/entity-fields/select-field/component.js","connections-ui/components/entity-fields/select-field/template.js","connections-ui/components/entity-fields/tag-field/component.js","connections-ui/components/entity-fields/tag-field/tag-editor/component.js","connections-ui/components/entity-fields/tag-field/tag-editor/template.js","connections-ui/components/entity-fields/tag-field/tag-wrapper/component.js","connections-ui/components/entity-fields/tag-field/template.js","connections-ui/components/entity-fields/text-field/component.js","connections-ui/components/entity-fields/text-field/template.js","connections-ui/components/entity-fields/validators.js","connections-ui/components/entity-fields/validators/address.js","connections-ui/components/entity-fields/validators/boolean.js","connections-ui/components/entity-fields/validators/date.js","connections-ui/components/entity-fields/validators/email.js","connections-ui/components/entity-fields/validators/history.js","connections-ui/components/entity-fields/validators/image.js","connections-ui/components/entity-fields/validators/location.js","connections-ui/components/entity-fields/validators/multiline-text.js","connections-ui/components/entity-fields/validators/person.js","connections-ui/components/entity-fields/validators/phone.js","connections-ui/components/entity-fields/validators/select.js","connections-ui/components/entity-fields/validators/tag.js","connections-ui/components/entity-fields/validators/text.js","connections-ui/components/entity-fields/validators/weblink.js","connections-ui/components/entity-fields/weblink-field/component.js","connections-ui/components/entity-fields/weblink-field/template.js","connections-ui/components/entity-hover-card-v2/component.js","connections-ui/components/entity-hover-card-v2/template.js","connections-ui/components/entity-hover-card/component.js","connections-ui/components/entity-image-v2/component.js","connections-ui/components/entity-image-v2/template.js","connections-ui/components/entity-image/component.js","connections-ui/components/entity-location/component.js","connections-ui/components/entity-mini/component.js","connections-ui/components/entity-mini/default/component.js","connections-ui/components/entity-mini/default/template.js","connections-ui/components/entity-mini/entity-details/component.js","connections-ui/components/entity-mini/entity-details/template.js","connections-ui/components/entity-mini/external-contact/component.js","connections-ui/components/entity-mini/external-contact/template.js","connections-ui/components/entity-mini/queue/component.js","connections-ui/components/entity-mini/queue/template.js","connections-ui/components/entity-mini/template.js","connections-ui/components/entity-picture-content/component.js","connections-ui/components/entity-picture-content/delete-pictures/component.js","connections-ui/components/entity-picture-content/delete-pictures/template.js","connections-ui/components/entity-picture-content/template.js","connections-ui/components/entity-profile/add-section/component.js","connections-ui/components/entity-profile/add-section/template.js","connections-ui/components/entity-profile/component.js","connections-ui/components/entity-profile/permissions.js","connections-ui/components/entity-profile/profiles/field-data.js","connections-ui/components/entity-profile/profiles/profile.js","connections-ui/components/entity-profile/profiles/section-info.js","connections-ui/components/entity-profile/section-icon/component.js","connections-ui/components/entity-profile/section-icon/template.js","connections-ui/components/entity-profile/template.js","connections-ui/components/entity-search/component.js","connections-ui/components/entity-search/template.js","connections-ui/components/entity-status/component.js","connections-ui/components/entity-status/template.js","connections-ui/components/entity-v2/activity-indicator/component.js","connections-ui/components/entity-v2/component.js","connections-ui/components/entity-v2/contact-group/component.js","connections-ui/components/entity-v2/favorite/component.js","connections-ui/components/entity-v2/hover-card/component.js","connections-ui/components/entity-v2/image/component.js","connections-ui/components/entity-v2/location/component.js","connections-ui/components/entity-v2/presence-indicator-dot/component.js","connections-ui/components/entity-v2/presence-label/component.js","connections-ui/components/entity-v2/presence-selector-dropdown/component.js","connections-ui/components/expander-plugin/component.js","connections-ui/components/expander-plugin/template.js","connections-ui/components/field-label/component.js","connections-ui/components/field-label/template.js","connections-ui/components/fixtable-column-header.js","connections-ui/components/fixtable-column-label.js","connections-ui/components/fixtable-empty-state.js","connections-ui/components/fixtable-footer.js","connections-ui/components/fixtable-grid.js","connections-ui/components/fixtable-row-toggle.js","connections-ui/components/fixtable-row.js","connections-ui/components/flashy-webrtc-troubleshooter/component.js","connections-ui/components/floorplan-editor/component.js","connections-ui/components/floorplan-editor/template.js","connections-ui/components/floorplan-popover/component.js","connections-ui/components/floorplan-popover/template.js","connections-ui/components/font-icon/component.js","connections-ui/components/group-contact-modal/component.js","connections-ui/components/group-contact-modal/inline-number-input/component.js","connections-ui/components/group-contact-modal/inline-number-input/template.js","connections-ui/components/group-contact-modal/template.js","connections-ui/components/group-profile/component.js","connections-ui/components/group-profile/dynamic-rules/component.js","connections-ui/components/group-profile/dynamic-rules/condition-display/component.js","connections-ui/components/group-profile/dynamic-rules/condition-display/skill-search/component.js","connections-ui/components/group-profile/dynamic-rules/condition-display/skill-search/template.js","connections-ui/components/group-profile/dynamic-rules/condition-display/template.js","connections-ui/components/group-profile/dynamic-rules/template.js","connections-ui/components/group-profile/group-contact-panel/component.js","connections-ui/components/group-profile/group-contact-panel/group-ring-settings/component.js","connections-ui/components/group-profile/group-contact-panel/group-ring-settings/inline-number-input/component.js","connections-ui/components/group-profile/group-contact-panel/group-ring-settings/inline-number-input/template.js","connections-ui/components/group-profile/group-contact-panel/group-ring-settings/template.js","connections-ui/components/group-profile/group-contact-panel/ring-sequence/component.js","connections-ui/components/group-profile/group-contact-panel/ring-sequence/template.js","connections-ui/components/group-profile/group-contact-panel/template.js","connections-ui/components/group-profile/group-list/component.js","connections-ui/components/group-profile/group-list/list-item/component.js","connections-ui/components/group-profile/group-list/list-item/template.js","connections-ui/components/group-profile/group-list/template.js","connections-ui/components/group-profile/membership-entry/component.js","connections-ui/components/group-profile/membership-entry/template.js","connections-ui/components/group-profile/membership-listing/component.js","connections-ui/components/group-profile/membership-listing/template.js","connections-ui/components/group-profile/membership-rule-entry/component.js","connections-ui/components/group-profile/membership-rule-entry/template.js","connections-ui/components/group-profile/membership-search/component.js","connections-ui/components/group-profile/membership-search/template.js","connections-ui/components/group-profile/membership-tag-search/component.js","connections-ui/components/group-profile/membership-tag-search/template.js","connections-ui/components/group-profile/roles-edit/component.js","connections-ui/components/group-profile/roles-edit/fixtable/bulk-actions/selected-elements/component.js","connections-ui/components/group-profile/roles-edit/fixtable/bulk-actions/selected-elements/template.js","connections-ui/components/group-profile/roles-edit/fixtable/custom-footer/component.js","connections-ui/components/group-profile/roles-edit/fixtable/custom-footer/template.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/component.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/select-footer/component.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/select-footer/template.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/selected-division/component.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/selected-division/template.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/template.js","connections-ui/components/group-profile/roles-edit/fixtable/division-view/component.js","connections-ui/components/group-profile/roles-edit/fixtable/division-view/template.js","connections-ui/components/group-profile/roles-edit/fixtable/is-assigned-toggle/component.js","connections-ui/components/group-profile/roles-edit/fixtable/is-assigned-toggle/template.js","connections-ui/components/group-profile/roles-edit/fixtable/item-range/component.js","connections-ui/components/group-profile/roles-edit/fixtable/item-range/template.js","connections-ui/components/group-profile/roles-edit/fixtable/list-remove/component.js","connections-ui/components/group-profile/roles-edit/fixtable/list-remove/template.js","connections-ui/components/group-profile/roles-edit/fixtable/search-field/component.js","connections-ui/components/group-profile/roles-edit/fixtable/search-field/template.js","connections-ui/components/group-profile/roles-edit/template.js","connections-ui/components/group-profile/template.js","connections-ui/components/grouped-facet-term/component.js","connections-ui/components/grouped-facet-term/template.js","connections-ui/components/headset-status/component.js","connections-ui/components/headset-vendor-picker/component.js","connections-ui/components/horizontal-collection.js","connections-ui/components/icon-bootstrap/component.js","connections-ui/components/icon-bootstrap/template.js","connections-ui/components/in-viewport.js","connections-ui/components/infinite-scroll/component.ts","connections-ui/components/infinite-scroll/template.js","connections-ui/components/integration-badge/component.js","connections-ui/components/integration-badge/template.js","connections-ui/components/integration-badges/component.js","connections-ui/components/integration-badges/template.js","connections-ui/components/interaction-annotation/component.js","connections-ui/components/light-gallery-modal/component.js","connections-ui/components/light-gallery-modal/template.js","connections-ui/components/link-to-external.js","connections-ui/components/loading-indicator/component.js","connections-ui/components/loading-indicator/template.js","connections-ui/components/location-display/component.js","connections-ui/components/location-display/template.js","connections-ui/components/login-oauth/component.js","connections-ui/components/login-oauth/template.js","connections-ui/components/logoff-link/component.js","connections-ui/components/media-providers/video-dropdown/component.js","connections-ui/components/media-providers/video-dropdown/template.js","connections-ui/components/mini-card/component.js","connections-ui/components/mini-card/template.js","connections-ui/components/modal-component/component.js","connections-ui/components/modal-component/template.js","connections-ui/components/modal-dialog-overlay.js","connections-ui/components/modal-dialog.js","connections-ui/components/modal-dialog/component.js","connections-ui/components/navigation-sub-menu/component.js","connections-ui/components/new-group/component.js","connections-ui/components/new-group/template.js","connections-ui/components/occludable-area.js","connections-ui/components/pc-style-icon-example.js","connections-ui/components/person-card/component.js","connections-ui/components/person-card/template.js","connections-ui/components/person-graph/component.js","connections-ui/components/person-graph/template.js","connections-ui/components/person-icon/component.js","connections-ui/components/person-icon/template.js","connections-ui/components/pikaday-input.js","connections-ui/components/pikaday-inputless.js","connections-ui/components/popover-on-component.js","connections-ui/components/popover-on-element.js","connections-ui/components/power-select-multiple.js","connections-ui/components/power-select-multiple/trigger.js","connections-ui/components/power-select.js","connections-ui/components/power-select/before-options.js","connections-ui/components/power-select/options.js","connections-ui/components/power-select/placeholder.js","connections-ui/components/power-select/power-select-group.js","connections-ui/components/power-select/search-message.js","connections-ui/components/power-select/trigger.js","connections-ui/components/pre-render.js","connections-ui/components/presence-label/component.js","connections-ui/components/presence-label/person-activity/component.js","connections-ui/components/presence-selector-dropdown/component.js","connections-ui/components/profile-dropdown-menu/component.js","connections-ui/components/progress-underlay/component.js","connections-ui/components/queue-toggle-switch/component.js","connections-ui/components/radio-input/component.js","connections-ui/components/resizable-content/component.js","connections-ui/components/resizable-content/template.js","connections-ui/components/resize-detector.js","connections-ui/components/search-facet-group/component.js","connections-ui/components/search-facet-group/template.js","connections-ui/components/search-facet-term/component.js","connections-ui/components/search-facet-term/template.js","connections-ui/components/search-page/component.js","connections-ui/components/search-page/template.js","connections-ui/components/search-result-context/component.js","connections-ui/components/search-result-context/template.js","connections-ui/components/sms-message-icon/component.js","connections-ui/components/sms-message-icon/template.js","connections-ui/components/station-disassociate-link/component.js","connections-ui/components/tags-input/label/template.js","connections-ui/components/telephone-input/component.js","connections-ui/components/tether-dialog.js","connections-ui/components/tether-popover-on-component.js","connections-ui/components/tether-popover-on-element.js","connections-ui/components/tether-tooltip-on-component.js","connections-ui/components/tether-tooltip-on-element.js","connections-ui/components/time-elapsed/component.js","connections-ui/components/time-elapsed/template.js","connections-ui/components/time-machine-confirmation/component.js","connections-ui/components/time-machine-confirmation/template.js","connections-ui/components/toggle-switch/component.js","connections-ui/components/tooltip-on-component.js","connections-ui/components/tooltip-on-element.js","connections-ui/components/upload-picture/component.js","connections-ui/components/upload-picture/helpers.js","connections-ui/components/upload-picture/template.js","connections-ui/components/uploaded-image/component.js","connections-ui/components/uploaded-image/template.js","connections-ui/components/vertical-collection.js","connections-ui/components/vertical-item.js","connections-ui/components/volume-input/component.js","connections-ui/components/webrtc-debug-modal/component.js","connections-ui/components/webrtc-issues/component.js","connections-ui/components/webrtc-settings/component.js","connections-ui/components/webrtc-troubleshooter/component.js","connections-ui/components/wrap-urls.js","connections-ui/components/wrap-urls/link.js","connections-ui/components/wrap-urls/url.js","connections-ui/components/x-option.js","connections-ui/components/x-select.js","connections-ui/config/asset-manifest.js","connections-ui/controllers/admin.js","connections-ui/controllers/application.js","connections-ui/controllers/array.js","connections-ui/controllers/card/detail.js","connections-ui/controllers/card/tree.js","connections-ui/controllers/chat-room.js","connections-ui/controllers/chat/participants.js","connections-ui/controllers/contacts.js","connections-ui/controllers/engage/embedded.js","connections-ui/controllers/feedback.js","connections-ui/controllers/maintenance.ts","connections-ui/controllers/object.js","connections-ui/controllers/permissions.js","connections-ui/controllers/person/detail.js","connections-ui/controllers/region-chooser.js","connections-ui/controllers/relate/externalcontact.js","connections-ui/controllers/relate/externalorganization.js","connections-ui/controllers/relate/index.js","connections-ui/controllers/reset-password.js","connections-ui/controllers/search.js","connections-ui/controllers/time-machine.js","connections-ui/enums/plantronics-call-events.js","connections-ui/field-config/entities/external-contact.js","connections-ui/field-config/entities/group.js","connections-ui/field-config/entities/org.js","connections-ui/field-config/entities/person.js","connections-ui/field-config/field-config.js","connections-ui/field-config/field-object.js","connections-ui/field-config/field-section.js","connections-ui/field-config/field.js","connections-ui/formats.js","connections-ui/group/store-mixin.js","connections-ui/helpers/-label-for-activity.js","connections-ui/helpers/abs.js","connections-ui/helpers/acos.js","connections-ui/helpers/acosh.js","connections-ui/helpers/add.js","connections-ui/helpers/address-format.js","connections-ui/helpers/and.js","connections-ui/helpers/app-version.js","connections-ui/helpers/array-contains.js","connections-ui/helpers/asin.js","connections-ui/helpers/asinh.js","connections-ui/helpers/atan.js","connections-ui/helpers/atan2.js","connections-ui/helpers/atanh.js","connections-ui/helpers/await.js","connections-ui/helpers/can-add-group-ring-member.js","connections-ui/helpers/can-edit.js","connections-ui/helpers/cancel-all.js","connections-ui/helpers/cbrt.js","connections-ui/helpers/ceil.js","connections-ui/helpers/chat-time.js","connections-ui/helpers/clz32.js","connections-ui/helpers/cos.js","connections-ui/helpers/cosh.js","connections-ui/helpers/css-classify.js","connections-ui/helpers/dasherize.js","connections-ui/helpers/div.js","connections-ui/helpers/ember-power-select-is-group.js","connections-ui/helpers/ember-power-select-is-selected.js","connections-ui/helpers/ember-power-select-true-string-if-present.js","connections-ui/helpers/emoji-text.js","connections-ui/helpers/empty.js","connections-ui/helpers/eq.js","connections-ui/helpers/equals.js","connections-ui/helpers/escape.js","connections-ui/helpers/exp.js","connections-ui/helpers/expand-line-breaks.js","connections-ui/helpers/expm1.js","connections-ui/helpers/facet-label.js","connections-ui/helpers/facet-term-label.js","connections-ui/helpers/first.js","connections-ui/helpers/flair.js","connections-ui/helpers/floor.js","connections-ui/helpers/format-date.js","connections-ui/helpers/format-filesize.js","connections-ui/helpers/format-html-message.js","connections-ui/helpers/format-link.js","connections-ui/helpers/format-message.js","connections-ui/helpers/format-number.js","connections-ui/helpers/format-relative.js","connections-ui/helpers/format-time.js","connections-ui/helpers/fround.js","connections-ui/helpers/full-name.js","connections-ui/helpers/gcd.js","connections-ui/helpers/get-select-options.js","connections-ui/helpers/group-ring-name.js","connections-ui/helpers/gt.js","connections-ui/helpers/gte.js","connections-ui/helpers/has-group-number.js","connections-ui/helpers/help-article-icon.js","connections-ui/helpers/html-safe.js","connections-ui/helpers/hypot.js","connections-ui/helpers/icon-for-activity.js","connections-ui/helpers/ignore-children.js","connections-ui/helpers/imul.js","connections-ui/helpers/initial-letter.js","connections-ui/helpers/intl-get.js","connections-ui/helpers/is-after.js","connections-ui/helpers/is-array.js","connections-ui/helpers/is-before.js","connections-ui/helpers/is-between.js","connections-ui/helpers/is-empty.js","connections-ui/helpers/is-equal.js","connections-ui/helpers/is-favorite.js","connections-ui/helpers/is-fulfilled.js","connections-ui/helpers/is-pending.js","connections-ui/helpers/is-rejected.js","connections-ui/helpers/is-same-or-after.js","connections-ui/helpers/is-same-or-before.js","connections-ui/helpers/is-same.js","connections-ui/helpers/is-selected-call-route.js","connections-ui/helpers/join-strings.js","connections-ui/helpers/l.js","connections-ui/helpers/lcm.js","connections-ui/helpers/localize-realtime-presence.js","connections-ui/helpers/log-e.js","connections-ui/helpers/log10.js","connections-ui/helpers/log1p.js","connections-ui/helpers/log2.js","connections-ui/helpers/lt.js","connections-ui/helpers/lte.js","connections-ui/helpers/max.js","connections-ui/helpers/meeting-date.js","connections-ui/helpers/min.js","connections-ui/helpers/mod.js","connections-ui/helpers/moment-add.js","connections-ui/helpers/moment-calendar.js","connections-ui/helpers/moment-diff.js","connections-ui/helpers/moment-duration.js","connections-ui/helpers/moment-format.js","connections-ui/helpers/moment-from-now.js","connections-ui/helpers/moment-from.js","connections-ui/helpers/moment-subtract.js","connections-ui/helpers/moment-to-date.js","connections-ui/helpers/moment-to-now.js","connections-ui/helpers/moment-to.js","connections-ui/helpers/moment-unix.js","connections-ui/helpers/moment.js","connections-ui/helpers/mult.js","connections-ui/helpers/multi-line-value.js","connections-ui/helpers/not-eq.js","connections-ui/helpers/not.js","connections-ui/helpers/now.js","connections-ui/helpers/or.js","connections-ui/helpers/perform.js","connections-ui/helpers/phone-integrations.js","connections-ui/helpers/pluralize-text.js","connections-ui/helpers/pluralize.js","connections-ui/helpers/pow.js","connections-ui/helpers/promise-all.js","connections-ui/helpers/promise-hash.js","connections-ui/helpers/promise-rejected-reason.js","connections-ui/helpers/random.js","connections-ui/helpers/render-markdown.js","connections-ui/helpers/round.js","connections-ui/helpers/route-action.js","connections-ui/helpers/short-chat-time.js","connections-ui/helpers/show-emoji.js","connections-ui/helpers/sign.js","connections-ui/helpers/sin.js","connections-ui/helpers/singularize.js","connections-ui/helpers/sort-field-data.js","connections-ui/helpers/sqrt.js","connections-ui/helpers/string-or-promise.js","connections-ui/helpers/sub.js","connections-ui/helpers/sum.js","connections-ui/helpers/t.js","connections-ui/helpers/tag-lookup.js","connections-ui/helpers/tan.js","connections-ui/helpers/tanh.js","connections-ui/helpers/task.js","connections-ui/helpers/time-duration.js","connections-ui/helpers/title-for-entity-property.js","connections-ui/helpers/trunc.js","connections-ui/helpers/unix.js","connections-ui/helpers/utc.js","connections-ui/helpers/value-for-choice.js","connections-ui/helpers/xor.js","connections-ui/hosted-context/util.js","connections-ui/index.js","connections-ui/initializers/add-modals-container.js","connections-ui/initializers/app-version.js","connections-ui/initializers/application-service.js","connections-ui/initializers/authentication-setup.js","connections-ui/initializers/authenticators.js","connections-ui/initializers/chat-service.js","connections-ui/initializers/clock.js","connections-ui/initializers/component-styles.js","connections-ui/initializers/container-debug-adapter.js","connections-ui/initializers/data-adapter.js","connections-ui/initializers/device-profiles-v2-service.js","connections-ui/initializers/ember-concurrency.js","connections-ui/initializers/ember-data-change-tracker.js","connections-ui/initializers/ember-data.js","connections-ui/initializers/ember-simple-auth.js","connections-ui/initializers/engines.js","connections-ui/initializers/export-application-global.js","connections-ui/initializers/extend-ember-computed.js","connections-ui/initializers/field-config.js","connections-ui/initializers/injectStore.js","connections-ui/initializers/main.js","connections-ui/initializers/media-providers.js","connections-ui/initializers/phone-service.js","connections-ui/initializers/preferences-service.js","connections-ui/initializers/route-styles.js","connections-ui/initializers/service-discovery.js","connections-ui/initializers/session-service.js","connections-ui/initializers/set-application-theme.js","connections-ui/initializers/setup-webrtc-components.js","connections-ui/initializers/store.js","connections-ui/initializers/transforms.js","connections-ui/initializers/webrtc-sdk-service.js","connections-ui/initializers/webrtc-service.js","connections-ui/initializers/webrtc-settings-service.js","connections-ui/instance-initializers/attach-application-controller.js","connections-ui/instance-initializers/attach-application-session.js","connections-ui/instance-initializers/backburner-debug.js","connections-ui/instance-initializers/conversation-service.js","connections-ui/instance-initializers/embedded-service.js","connections-ui/instance-initializers/ember-data.js","connections-ui/instance-initializers/ember-intl.js","connections-ui/instance-initializers/ember-simple-auth.js","connections-ui/instance-initializers/ember-tooltips.js","connections-ui/instance-initializers/entity-contact-group.js","connections-ui/instance-initializers/entity-favorite.js","connections-ui/instance-initializers/entity-hover-card.js","connections-ui/instance-initializers/entity-image.js","connections-ui/instance-initializers/entity-location.js","connections-ui/instance-initializers/inject-owner.js","connections-ui/instance-initializers/load-asset-manifest.js","connections-ui/instance-initializers/presence-label.js","connections-ui/instance-initializers/recording-service.js","connections-ui/instance-initializers/reopen-component.js","connections-ui/instance-initializers/reopen-route.js","connections-ui/instance-initializers/set-application-service-values.js","connections-ui/instance-initializers/set-application-values.js","connections-ui/instance-initializers/setup-application.js","connections-ui/instance-initializers/setup-apps-api-handlers.js","connections-ui/instance-initializers/setup-error-handling.js","connections-ui/instance-initializers/webrtc.js","connections-ui/media-providers/provider.js","connections-ui/media-providers/purecloud.js","connections-ui/media-providers/teams.js","connections-ui/media-providers/utils/auth.js","connections-ui/media-providers/zoom.js","connections-ui/mixins/acd-attachment-url-mixin.js","connections-ui/mixins/acd-utilities.js","connections-ui/mixins/acd/after-call-work.js","connections-ui/mixins/acd/participants.js","connections-ui/mixins/acd/session-share.js","connections-ui/mixins/auth-controller.js","connections-ui/mixins/authenticated-authorized-route-mixin.js","connections-ui/mixins/batch-data-requests.js","connections-ui/mixins/cache-chat-rooms.js","connections-ui/mixins/change-serializer.js","connections-ui/mixins/chat-message-media.js","connections-ui/mixins/chat-message-mixin.js","connections-ui/mixins/chat-service/chat-events.js","connections-ui/mixins/chat-service/message-notifications.js","connections-ui/mixins/chat-service/message-splitting.js","connections-ui/mixins/chat-user.js","connections-ui/mixins/click-outside.js","connections-ui/mixins/conversation-analysis.js","connections-ui/mixins/conversation-uri-builder.js","connections-ui/mixins/conversation-v2/chats-service.js","connections-ui/mixins/conversation.js","connections-ui/mixins/create-group.js","connections-ui/mixins/device-enumeration.js","connections-ui/mixins/embedded-message-event-handler.js","connections-ui/mixins/entity-controller.js","connections-ui/mixins/entity-image-defaults.js","connections-ui/mixins/entity-presence.js","connections-ui/mixins/entity.js","connections-ui/mixins/evaluations.js","connections-ui/mixins/external-contacts.js","connections-ui/mixins/faxes.js","connections-ui/mixins/field-component.js","connections-ui/mixins/flag.js","connections-ui/mixins/in-viewport.js","connections-ui/mixins/interaction/session-share.js","connections-ui/mixins/interaction/tooltips.js","connections-ui/mixins/job.js","connections-ui/mixins/logger.js","connections-ui/mixins/model-route.js","connections-ui/mixins/paging.js","connections-ui/mixins/phone-service/active-call.js","connections-ui/mixins/phone-service/call-controls.js","connections-ui/mixins/phone-service/call-forward.js","connections-ui/mixins/phone-service/conversation-manager.js","connections-ui/mixins/phone-service/events.js","connections-ui/mixins/phone-service/notifications.js","connections-ui/mixins/phone-service/ring.js","connections-ui/mixins/phone-service/station.js","connections-ui/mixins/promise-loading.js","connections-ui/mixins/purecloud-model.js","connections-ui/mixins/relate/relate-features.js","connections-ui/mixins/search.js","connections-ui/mixins/searchV2.js","connections-ui/mixins/sort-chat-users.js","connections-ui/mixins/style-namespacing-extras.js","connections-ui/mixins/unprotected-route-mixin.js","connections-ui/mixins/viewport.js","connections-ui/mixins/webrtc-action-utils.js","connections-ui/models/annotation.js","connections-ui/models/app-api-call.js","connections-ui/models/app-instance.js","connections-ui/models/app-pool.js","connections-ui/models/app.js","connections-ui/models/call-communication.js","connections-ui/models/call-forwarding.js","connections-ui/models/callback-communication.js","connections-ui/models/callv2.ts","connections-ui/models/chat-communication.js","connections-ui/models/chat-message.js","connections-ui/models/chat-room.js","connections-ui/models/chat-video-participant.js","connections-ui/models/coaching-appointment.js","connections-ui/models/coded-geolocation.js","connections-ui/models/conversation-legacy.js","connections-ui/models/conversation.js","connections-ui/models/division.js","connections-ui/models/email-communication.js","connections-ui/models/ember-intl-translation.js","connections-ui/models/evaluation.js","connections-ui/models/external-contact.js","connections-ui/models/externalcontacts/channel-record.js","connections-ui/models/externalcontacts/channel.js","connections-ui/models/externalcontacts/contact.js","connections-ui/models/externalcontacts/external-organization.js","connections-ui/models/externalcontacts/facebook-id.js","connections-ui/models/externalcontacts/line-id.js","connections-ui/models/externalcontacts/twitter-id.js","connections-ui/models/externalcontacts/whatsapp-id.js","connections-ui/models/fax.js","connections-ui/models/geolocation-settings.js","connections-ui/models/geolocation.js","connections-ui/models/github-item.js","connections-ui/models/grant.js","connections-ui/models/group-policy.js","connections-ui/models/group.js","connections-ui/models/internally-hosted-app.js","connections-ui/models/library.js","connections-ui/models/location.js","connections-ui/models/meeting.js","connections-ui/models/message-communication.js","connections-ui/models/org.js","connections-ui/models/participant.js","connections-ui/models/person.js","connections-ui/models/presence.js","connections-ui/models/public-api-user.js","connections-ui/models/queue.js","connections-ui/models/recorded-call.js","connections-ui/models/recording.js","connections-ui/models/resource-article.js","connections-ui/models/response.js","connections-ui/models/role.js","connections-ui/models/screenshare-communication.js","connections-ui/models/social-communication.js","connections-ui/models/split-message.js","connections-ui/models/station.js","connections-ui/models/unrecoverable-app-failure.ts","connections-ui/models/user.js","connections-ui/models/video-communication.js","connections-ui/models/voicemail-message.js","connections-ui/models/wfm-notification.js","connections-ui/phone/template.js","connections-ui/resolver.js","connections-ui/router.js","connections-ui/routes/admin.js","connections-ui/routes/application.js","connections-ui/routes/card/detail.js","connections-ui/routes/card/tree.js","connections-ui/routes/custom-fields-contacts-redirect.js","connections-ui/routes/custom-fields-orgs-redirect.js","connections-ui/routes/group/detail.js","connections-ui/routes/index.js","connections-ui/routes/login-oauth.js","connections-ui/routes/login.js","connections-ui/routes/maintenance.ts","connections-ui/routes/no-access.js","connections-ui/routes/performance-summary-queues.js","connections-ui/routes/person/detail.js","connections-ui/routes/search.js","connections-ui/routes/third-party/app-embed.js","connections-ui/routes/time-machine.js","connections-ui/search/adapter-mixin.js","connections-ui/search/request-builder.js","connections-ui/search/service.js","connections-ui/search/store-mixin.js","connections-ui/serializers/application.js","connections-ui/serializers/call-communication.js","connections-ui/serializers/call-forwarding.js","connections-ui/serializers/callback-communication.js","connections-ui/serializers/callv2.js","connections-ui/serializers/chat-communication.js","connections-ui/serializers/coded-geolocation.js","connections-ui/serializers/conversation-v2.js","connections-ui/serializers/conversation.js","connections-ui/serializers/division.js","connections-ui/serializers/email-communication.js","connections-ui/serializers/externalcontacts/contact.js","connections-ui/serializers/externalcontacts/external-organization.js","connections-ui/serializers/externalcontacts/facebook-id.js","connections-ui/serializers/externalcontacts/line-id.js","connections-ui/serializers/externalcontacts/twitter-id.js","connections-ui/serializers/externalcontacts/whatsapp-id.js","connections-ui/serializers/geolocation-settings.js","connections-ui/serializers/geolocation.js","connections-ui/serializers/grant.js","connections-ui/serializers/group-policy.js","connections-ui/serializers/group.js","connections-ui/serializers/library.js","connections-ui/serializers/location.js","connections-ui/serializers/meeting.js","connections-ui/serializers/message-communication.js","connections-ui/serializers/participant.js","connections-ui/serializers/person.js","connections-ui/serializers/public-api-user.js","connections-ui/serializers/purecloud-user.js","connections-ui/serializers/purecloud.js","connections-ui/serializers/queue.js","connections-ui/serializers/recorded-call.js","connections-ui/serializers/recording.js","connections-ui/serializers/response.js","connections-ui/serializers/role.js","connections-ui/serializers/screenshare-communication.js","connections-ui/serializers/skillgroup.js","connections-ui/serializers/social-communication.js","connections-ui/serializers/station.js","connections-ui/serializers/user.js","connections-ui/serializers/video-communication.js","connections-ui/serializers/voicemail-message.js","connections-ui/services/addressformat.js","connections-ui/services/ajax.js","connections-ui/services/analytics.js","connections-ui/services/application.js","connections-ui/services/apps-api-handlers/directory-nav-handler.js","connections-ui/services/apps-api-handlers/resource-center-handler.js","connections-ui/services/apps-api-handlers/toast-handler.js","connections-ui/services/apps.js","connections-ui/services/asset-loader.js","connections-ui/services/batch-data-requests.js","connections-ui/services/chat.js","connections-ui/services/clock.js","connections-ui/services/communication.js","connections-ui/services/conversation.js","connections-ui/services/cookies.js","connections-ui/services/device-profiles-v2.js","connections-ui/services/embedded.js","connections-ui/services/emergency-location.js","connections-ui/services/events.ts","connections-ui/services/external-contacts.js","connections-ui/services/favorites.js","connections-ui/services/feature.js","connections-ui/services/file-upload.js","connections-ui/services/fullscreen.js","connections-ui/services/geolocation.js","connections-ui/services/group-assigned-roles.js","connections-ui/services/headset.js","connections-ui/services/help.js","connections-ui/services/iframe-state.js","connections-ui/services/in-viewport.js","connections-ui/services/integrations-presence.js","connections-ui/services/interaction.js","connections-ui/services/interval.js","connections-ui/services/intl.js","connections-ui/services/media-providers.js","connections-ui/services/modal-dialog.js","connections-ui/services/moment.js","connections-ui/services/names.js","connections-ui/services/notification-proxy.js","connections-ui/services/notification.js","connections-ui/services/org-settings.js","connections-ui/services/permissions.js","connections-ui/services/phone-integrations.js","connections-ui/services/phone.js","connections-ui/services/pigeon.js","connections-ui/services/preferences.js","connections-ui/services/presence-subscription.js","connections-ui/services/presence.js","connections-ui/services/purecloud-oauth.js","connections-ui/services/relate.js","connections-ui/services/resize-detector.js","connections-ui/services/screen-media.ts","connections-ui/services/scroll-activity.js","connections-ui/services/session.js","connections-ui/services/settings.js","connections-ui/services/sound.js","connections-ui/services/stash-logger.js","connections-ui/services/store.js","connections-ui/services/streaming.js","connections-ui/services/text-measurer.js","connections-ui/services/user-activity.js","connections-ui/services/user-idle.js","connections-ui/services/validations.js","connections-ui/services/vendor-implementations/jabra-chrome.js","connections-ui/services/vendor-implementations/jabra-native.js","connections-ui/services/vendor-implementations/plantronics.js","connections-ui/services/vendor-implementations/sennheiser.js","connections-ui/services/video-activity.js","connections-ui/services/video-idle.js","connections-ui/services/webrtc-sdk.ts","connections-ui/services/webrtc-settings.ts","connections-ui/services/webrtc.js","connections-ui/session-stores/application.js","connections-ui/templates/agent-ui.js","connections-ui/templates/call-forwarding-partial.js","connections-ui/templates/card/detail.js","connections-ui/templates/card/tree.js","connections-ui/templates/chat-room.js","connections-ui/templates/components/document-title.js","connections-ui/templates/components/webhooks-collapsible.js","connections-ui/templates/components/webhooks.js","connections-ui/templates/components/x-select.js","connections-ui/templates/group/detail.js","connections-ui/templates/index.js","connections-ui/templates/login-oauth.js","connections-ui/templates/maintenance.js","connections-ui/templates/no-access.js","connections-ui/templates/partials/-no-station-notification.js","connections-ui/templates/person/detail.js","connections-ui/templates/purecloud/partials/conversation-controls-menu.js","connections-ui/templates/reset-password.js","connections-ui/templates/search.js","connections-ui/templates/third-party/app-embed.js","connections-ui/templates/time-machine.js","connections-ui/transforms/iso-date.js","connections-ui/transforms/json.js","connections-ui/transforms/object.js","connections-ui/types/agent-assist.type.js","connections-ui/types/conversation.type.js","connections-ui/types/index.ts","connections-ui/types/maybe.type.js","connections-ui/types/pigeon.type.js","connections-ui/types/webrtc-settings.type.js","connections-ui/utils/acd-ts.ts","connections-ui/utils/acd-v2.ts","connections-ui/utils/acd.js","connections-ui/utils/acdParticipantStatuses.js","connections-ui/utils/analytics-keys.js","connections-ui/utils/analytics-routing.ts","connections-ui/utils/app-provider.js","connections-ui/utils/apps-v2-api-handlers.ts","connections-ui/utils/apps.ts","connections-ui/utils/async.ts","connections-ui/utils/boolean-expressions.js","connections-ui/utils/browser.js","connections-ui/utils/code-utils.js","connections-ui/utils/conversation.ts","connections-ui/utils/dates.js","connections-ui/utils/debug-backburner.js","connections-ui/utils/debug-rsvp.js","connections-ui/utils/display-geolocation.js","connections-ui/utils/email-types/draft-type.js","connections-ui/utils/email-types/email-type.js","connections-ui/utils/email.js","connections-ui/utils/ember-types.js","connections-ui/utils/emergency-location-util.js","connections-ui/utils/emoji-json-helper-expanded.js","connections-ui/utils/emoji-json-helper-v1.js","connections-ui/utils/emoji-json-helper.js","connections-ui/utils/emoji.js","connections-ui/utils/entity-fields.js","connections-ui/utils/error-white-list.js","connections-ui/utils/escape.js","connections-ui/utils/exponential-interval-generator.js","connections-ui/utils/external-contact-messaging.js","connections-ui/utils/feature-toggles.ts","connections-ui/utils/file-extensions-type.ts","connections-ui/utils/focus-management.js","connections-ui/utils/geolocation.js","connections-ui/utils/giphy.js","connections-ui/utils/gsm7.js","connections-ui/utils/hosted-context.js","connections-ui/utils/instagram/instagram-properties.js","connections-ui/utils/intl/missing-message.js","connections-ui/utils/jid-helpers.js","connections-ui/utils/keystroke.ts","connections-ui/utils/log-e164-info.js","connections-ui/utils/logger.js","connections-ui/utils/markdown.js","connections-ui/utils/masonry.js","connections-ui/utils/message-channels.js","connections-ui/utils/names.ts","connections-ui/utils/net.js","connections-ui/utils/newrelic-legacy.js","connections-ui/utils/newrelic.ts","connections-ui/utils/objects.js","connections-ui/utils/phone-number.ts","connections-ui/utils/presence-label-util.ts","connections-ui/utils/presence-utils.js","connections-ui/utils/presence.js","connections-ui/utils/promise-array.js","connections-ui/utils/query-parser.js","connections-ui/utils/queued-processing-chain.js","connections-ui/utils/request.ts","connections-ui/utils/routing-status.js","connections-ui/utils/safeSet.js","connections-ui/utils/serial-processing-chain.ts","connections-ui/utils/simple-cache.ts","connections-ui/utils/sms/sms-properties.js","connections-ui/utils/sound-recorder.js","connections-ui/utils/supported-messaging-subtypes.ts","connections-ui/utils/testing.ts","connections-ui/utils/theme-loader.js","connections-ui/utils/timeout-promise.js","connections-ui/utils/transform-panels.ts","connections-ui/utils/ttl-cache.ts","connections-ui/utils/twitter/twitter-properties.js","connections-ui/utils/types.ts","connections-ui/utils/uri-builder.ts","connections-ui/utils/uuid-generator.js","connections-ui/utils/uuid.js","connections-ui/utils/video-frame-checker.js","connections-ui/utils/webmessaging/webmessaging-properties.js","connections-ui/validators/alias.js","connections-ui/validators/belongs-to.js","connections-ui/validators/collection.js","connections-ui/validators/confirmation.js","connections-ui/validators/date.js","connections-ui/validators/dependent.js","connections-ui/validators/ds-error.js","connections-ui/validators/exclusion.js","connections-ui/validators/format.js","connections-ui/validators/has-many.js","connections-ui/validators/inclusion.js","connections-ui/validators/length.js","connections-ui/validators/messages.js","connections-ui/validators/number.js","connections-ui/validators/presence.js","connections-ui/video-participant-v2/model.js","connections-ui/video-participant/model.js","connections-ui/views/card/tree.js","connections-ui/webrtc-conversation/model.js","vendor/ember-cli/app-config.js","vendor/ember-cli/app-boot.js"],"names":["f","exports","_typeof","module","define","amd","g","window","global","self","this","adapter","r","e","n","t","o","i","c","require","u","a","Error","code","p","call","length","1","SDPUtils","writeMediaSection","transceiver","caps","type","stream","dtlsRole","sdp","writeRtpDescription","kind","writeIceParameters","iceGatherer","getLocalParameters","writeDtlsParameters","dtlsTransport","mid","rtpSender","rtpReceiver","trackId","_initialTrackId","track","id","msid","sendEncodingParameters","ssrc","rtx","localCName","getCommonCapabilities","localCapabilities","remoteCapabilities","commonCapabilities","codecs","headerExtensions","fecMechanisms","findCodecByPayloadType","pt","parseInt","payloadType","preferredPayloadType","rtxCapabilityMatches","lRtx","rRtx","lCodecs","rCodecs","lCodec","parameters","apt","rCodec","name","toLowerCase","forEach","clockRate","JSON","parse","stringify","numChannels","Math","min","push","rtcpFeedback","filter","fb","j","parameter","lHeaderExtension","rHeaderExtension","uri","isActionAllowedInSignalingState","action","signalingState","offer","setLocalDescription","setRemoteDescription","answer","indexOf","maybeAddCandidate","iceTransport","candidate","alreadyAdded","getRemoteCandidates","find","remoteCandidate","foundation","ip","port","priority","protocol","addRemoteCandidate","makeError","description","NotSupportedError","InvalidStateError","InvalidAccessError","TypeError","undefined","OperationError","edgeVersion","addTrackToStreamAndFireEvent","addTrack","dispatchEvent","MediaStreamTrackEvent","fireAddTrack","pc","receiver","streams","trackEvent","Event","setTimeout","_dispatchEvent","RTCPeerConnection","config","_eventTarget","document","createDocumentFragment","method","bind","canTrickleIceCandidates","needNegotiation","localStreams","remoteStreams","_localDescription","_remoteDescription","iceConnectionState","connectionState","iceGatheringState","usingBundle","bundlePolicy","rtcpMuxPolicy","iceTransportPolicy","iceServers","hasTurn","server","urls","url","console","warn","isString","validTurn","filterIceServers","_iceGatherers","iceCandidatePoolSize","RTCIceGatherer","gatherPolicy","_config","transceivers","_sdpSessionId","generateSessionId","_sdpSessionVersion","_dtlsRole","_isClosed","Object","defineProperty","prototype","configurable","get","onicecandidate","onaddstream","ontrack","onremovestream","onsignalingstatechange","oniceconnectionstatechange","onconnectionstatechange","onicegatheringstatechange","onnegotiationneeded","ondatachannel","event","_emitGatheringStateChange","getConfiguration","getLocalStreams","getRemoteStreams","_createTransceiver","doNotAdd","hasBundleTransport","recvEncodingParameters","associatedRemoteMediaStreams","wantReceive","transports","_createIceAndDtlsTransports","alreadyExists","s","_maybeFireNegotiationNeeded","RTCRtpSender","addStream","getTracks","clonedStream","clone","idx","clonedTrack","addEventListener","enabled","removeTrack","sender","stop","map","splice","removeStream","getSenders","getReceivers","_createIceGatherer","sdpMLineIndex","shift","value","writable","bufferedCandidateEvents","bufferCandidates","end","keys","state","_gather","onlocalcandidate","removeEventListener","evt","sdpMid","cand","component","ufrag","usernameFragment","serializedCandidate","writeCandidate","assign","parseCandidate","toJSON","sections","getMediaSections","getDescription","join","complete","every","RTCIceTransport","onicestatechange","_updateIceConnectionState","_updateConnectionState","RTCDtlsTransport","ondtlsstatechange","onerror","_disposeIceAndDtlsTransports","_transceive","send","recv","params","encodings","rtcp","cname","compound","rtcpParameters","receive","sessionpart","Promise","reject","splitSections","mediaSection","parseRtpParameters","isIceLite","matchPrefix","rejected","isRejected","remoteIceParameters","getIceParameters","remoteDtlsParameters","getDtlsParameters","role","start","_updateSignalingState","resolve","receiverList","iceOptions","substr","split","lines","splitLines","getKind","direction","getDirection","remoteMsid","parseMsid","getMid","generateIdentifier","parseRtpEncodingParameters","parseRtcpParameters","isComplete","cands","setTransport","setRemoteCandidates","hasRtx","MediaStream","default","RTCRtpReceiver","getCapabilities","codec","isNewTrack","nativeTrack","removeTrackFromStreamAndFireEvent","sid","item","close","newState","states","new","closed","checking","connected","completed","disconnected","failed","connecting","createOffer","numAudioTracks","numVideoTracks","offerOptions","arguments","mandatory","optional","offerToReceiveAudio","offerToReceiveVideo","writeSessionBoilerplate","remoteCodec","hdrExt","remoteExtensions","rHdrExt","getLocalCandidates","desc","RTCSessionDescription","createAnswer","mediaSectionsInOffer","localTrack","getAudioTracks","getVideoTracks","reducedSize","addIceCandidate","candidateString","trim","getStats","selector","MediaStreamTrack","senderOrReceiver","promises","all","then","allStats","results","Map","stats","stat","set","ortcObjectName","obj","nativeGetstats","apply","nativeStats","mapStats","inboundrtp","outboundrtp","candidatepair","localcandidate","remotecandidate","methods","nativeMethod","args","error","2","random","toString","blob","line","parts","part","index","prefix","substring","address","relatedAddress","relatedPort","tcpType","toUpperCase","parseIceOptions","parseRtpMap","parsed","channels","writeRtpMap","parseExtmap","writeExtmap","headerExtension","preferredId","parseFmtp","kv","writeFmtp","param","parseRtcpFb","writeRtcpFb","parseSsrcMedia","sp","colon","attribute","parseSsrcGroup","semantics","ssrcs","parseFingerprint","algorithm","fingerprints","setupType","fp","concat","iceParameters","password","mline","rtpmapline","fmtps","maxptime","extension","secondarySsrc","encodingParameters","hasRed","hasUlpfec","primarySsrc","flows","encParam","codecPayloadType","fec","mechanism","bandwidth","maxBitrate","remoteSsrc","rsize","mux","spec","planB","msidParts","sessId","sessVer","sessUser","sessionId","version","user","parseMLine","fmt","slice","parseOLine","username","sessionVersion","netType","addressType","isValidSDP","charAt","3","adapterFactory","./adapter_factory.js","4","utils","dependencies","opts","options","shimChrome","shimFirefox","shimEdge","shimSafari","key","hasOwnProperty","logging","log","browserDetails","detectBrowser","chromeShim","edgeShim","firefoxShim","safariShim","commonShim","extractVersion","disableLog","disableWarnings","browser","shimPeerConnection","browserShim","shimCreateObjectURL","shimGetUserMedia","shimMediaStream","shimSourceObject","shimOnTrack","shimAddTrackRemoveTrack","shimGetSendersWithDtmf","shimSenderReceiverGetStats","fixNegotiationNeeded","shimRTCIceCandidate","shimMaxMessageSize","shimSendThrowTypeError","shimRemoveStream","shimSenderGetStats","shimReceiverGetStats","shimRTCDataChannel","shimReplaceTrack","shimRTCIceServerUrls","shimCreateOfferLegacy","shimCallbacksAPI","shimLocalStreamsAPI","shimRemoteStreamsAPI","shimTrackEventTransceiver","./chrome/chrome_shim","./common_shim","./edge/edge_shim","./firefox/firefox_shim","./safari/safari_shim","./utils","5","filterStats","result","outbound","streamStatsType","filteredResult","trackStats","trackIdentifier","trackStat","walkStats","base","resultSet","has","endsWith","webkitMediaStream","_ontrack","enumerable","origSetRemoteDescription","_ontrackpoly","te","wrapPeerConnectionEvent","shimSenderWithDtmf","dtmf","_dtmf","createDTMFSender","_pc","_senders","origAddTrack","origRemoveTrack","origAddStream","origRemoveStream","origGetSenders","senders","origGetReceivers","receivers","srcElement","origGetStats","err","DOMException","URL","HTMLMediaElement","_srcObject","src","revokeObjectURL","createObjectURL","shimAddTrackRemoveTrackWithNative","_shimmedLocalStreams","streamId","existingSenders","newSenders","newSender","origGetLocalStreams","nativeStreams","_reverseStreams","_streams","newStream","replaceInternalStreamId","internalId","externalStream","internalStream","replace","RegExp","replaceExternalStreamId","oldStream","isLegacyCall","origSetLocalDescription","origLocalDescription","getOwnPropertyDescriptor","isLocal","streamid","hasTrack","webkitRTCPeerConnection","pcConfig","pcConstraints","iceTransports","generateCertificate","successCallback","errorCallback","fixChromeStats_","response","standardReport","reports","report","standardStats","timestamp","names","makeMapStats","successCallbackWrapper_","promise","RTCIceCandidate","nativeAddIceCandidate","target","shimGetDisplayMedia","getSourceId","navigator","getDisplayMedia","constraints","sourceId","video","chromeMediaSource","chromeMediaSourceId","maxFrameRate","frameRate","mediaDevices","getUserMedia","../utils.js","./getusermedia","6","constraintsToChrome_","cc","ideal","exact","max","oldname_","oc","mix","advanced","shimConstraints_","func","audio","remap","b","face","facingMode","matches","getSupportedFacingModeLies","getSupportedConstraints","enumerateDevices","devices","d","dev","some","match","label","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","message","constraint","constraintName","onSuccess","onError","webkitGetUserMedia","getUserMediaPromise_","kinds","getSources","device","groupId","echoCancellation","height","width","origGetUserMedia","cs","7","NativeRTCIceCandidate","nativeCandidate","parsedCandidate","augmentedCandidate","nativeCreateObjectURL","nativeRevokeObjectURL","newId","deprecated","delete","dsc","srcObject","nativeSetAttribute","setAttribute","RTCSctpTransport","_sctp","sctpInDescription","mLine","getRemoteFirefoxVersion","getCanSendMaxMessageSize","remoteIsFirefox","canSendMaxMessageSize","getMaxMessageSize","maxMessageSize","isFirefox","canSendMMS","remoteMMS","Number","POSITIVE_INFINITY","sctp","origCreateDataChannel","createDataChannel","dataChannel","wrapDcSend","channel","dc","origDataChannelSend","data","size","byteLength","readyState","8","shimRTCPeerConnection","origMSTEnabled","ev","RTCDtmfSender","RTCDTMFSender","RTCPeerConnectionShim","replaceTrack","setTrack","../utils","./filtericeservers","rtcpeerconnection-shim","9","10","catch","11","RTCTrackEvent","mozSrcObject","mozRTCPeerConnection","newIceServers","newServer","credential","mozRTCSessionDescription","mozRTCIceCandidate","modernStatsTypes","nativeGetStats","onSucc","onErr","DataChannel","RTCDataChannel","preferredMediaSource","mediaSource","12","InternalError","SecurityError","The operation is insecure.","getUserMedia_","constraintsToFF37_","mozGetUserMedia","orgEnumerateDevices","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","13","_localStreams","getStreamById","_remoteStreams","_addTrack","tracks","_onaddstream","_onaddstreampoly","failureCallback","withCallback","cb","errcb","OrigPeerConnection","RTCTransceiver","origCreateOffer","audioTransceiver","getTransceivers","setDirection","addTransceiver","videoTransceiver","14","logDisabled_","deprecationWarnings_","uastring","expr","pos","eventNameToWrap","wrapper","proto","nativeAddEventListener","nativeEventName","wrappedCallback","modifiedEvent","_eventMap","nativeRemoveEventListener","unwrappedCb","bool","oldMethod","newMethod","userAgent","versions","people","groups","locations","users","messages","notifications","ApplicationAdapter","DS","RESTAdapter","extend","SearchAdapterMixin","logger","Ember","inject","service","session","application","defaultSerializer","namespace","shouldReloadAll","shouldBackgroundReloadRecord","normalizeErrorResponse","status","headers","payload","errors","_super","modelFor","pathForType","modelName","String","camelize","_emberInflector","pluralize","createRecord","store","record","snapshot","_createSnapshot","serializerFor","serialize","includeId","ajax","buildURL","updateRecord","serializeIntoHash","attr","urlForUpdateRecord","_directoryUrl","findRecord","FULL_PERSON","fl","traditional","findQuery","query","entityEndpoint","path","modelEndpoint","apiVersion","host","findMultiEntity","requestType","limit","_entity","facets","returnFields","_toConsumableArray","BASE_PERSON","BASE_GROUP_FIELDS","performSearch","RSVP","findFavorites","findFavoritesPublicApiV2","_this","pcV2Uri","deferred","defer","_findFavoritesPublicApiV2","res","_handleFavorites","page","pageNumber","pageSize","cache","collection","_this2","entities","nextPage","currentCount","forwardVoicemail","voicemail","recipient","voicemailMessageId","userId","_findDirectReports","count","offset","_handleReports","_this3","findDirectReports","_this4","findSuperiors","computed","reads","serializer","adapterOptions","patch","urlForFindRecord","handleResponse","requestData","useExternalContactExpand","paging","queryDefaults","currentInterval","_dates","previousInterval","subtract","typeClass","findLatestCalls","_fetchLatestCalls","_fetchHistory","guid","interval","toISOString","add","getHistoryPath","meta","_","merge","incrementPageNumber","decrementWeek","pcUri","Geolocation","PurecloudAdapter","divisionLimit","findAll","sinceToken","snapshotRecordArray","objectCount","limitUrl","$","LoggerMixin","RelateFeaturesMixin","relate","addressformat","permissions","cannotViewExternalContacts","not","clearCachedAdapter","originator","urlAndModel","expand","timeout","deleteRecord","returnValue","queryParams","addressFormat","searchTerm","expandField","sortOrder","subType","hasValidSearchTerm","isValidPhoneNumber","isValidNumber","containsOnlyPhoneNumberChars","test","isExactSearch","_newrelic","addPageAction","orgId","formatAddress","useLookupService","lookupVal","term","encodeURI","q","decodeURI","bypassCache","findMatchingExternalContacts","getCachedAdapter","TIME_OUT","EXPAND","dataType","saveBulk","roleId","subjectIds","divisionIds","ajaxOptions","hash","ajaxSuccess","jqXHR","_baseUrl","groupPolicy","title","details","buildQuery","baseUrl","endpoint","urlForFindMany","urlForDeleteRecord","fields","gProfile","general","memberCount","individuals","owners","groupSerializer","group","policy","generateGroupProfilePayload","jIdNumber","getJidIdNumber","contactInfo","chat","jid","getDeletedGroup","findMany","ids","snapshots","uuids","jIds","urlWithAppendedIds","urlDeletedWithAppendedIds","activeResults","getDeletedGroups","deleteUrl","groupsResults","deletedGroups","normalizeDeletedGroup","_this5","getUrl","deletedGroup","adapterFor","findGroupMembership","ceil","json","vmPolicy","organizationId","mt","membershipDraft","needsCommit","exchangeSync","links","cleanGroupLinkIds","email","Array","isArray","groupNumber","phone","labelKey","hasGroupPhone","groupAlertType","numberInfo","hasNumber","number","hasExtension","groupType","jabberId","BASE_LOCATION_FIELDS","urlForHasMany","location","floors","init","urlForFindAll","meeting","meetingId","urlForQuery","urlForCreateRecord","ajaxService","integrationsPresenceSvc","usingIntegrationSource","integrationPresenceSource","snapshotsOrOptions","guids","jids","_findMany","superiors","mapBy","directReports","baseRequestData","_store","batchEntityIds","_defineProperty","raw","contentType","retry","_ref","_ref2","flat","integrationSource","_loadActivities","findBelongsTo","link","relationship","modelClass","snapshotOrQuery","detail","contextId","objId","_asyncToGenerator","regeneratorRuntime","mark","_callee","fetchDivisions","wrap","_context","prev","next","divisionAgnostic","myQueuesOnly","fetchDivisionsForTargetQueueSearch","sent","entity","divisionId","abrupt","getDivisionLimits","_callee2","_context2","permission","divisionAware","_exports","_recording","currentPage","currentPageSize","libraryId","head","aggregatePayload","records","_getPage","pageCount","sort","roleA","roleB","UserAdapter","sortQueryParams","sortBy","_genesysSparkComponents","registerElements","iframeCoordinator","registerCustomElements","_loader","defineCustomElements","APP","LOG_RUNLOOP_STACKTRACE","run","backburner","DEBUG","LOG_BINDINGS","Application","_defineModifier","App","cookies","stashLogger","applicationService","customEvents","pageChanged","itemsPerPageChanged","favoriteEvent","contactEvent","navigateToProfileEvent","modulePrefix","podModulePrefix","Resolver","engines","emberEngineCustomFields","services","externalRoutes","personDetail","admin","entityTypes","currentRouteName","debug","initVersion","initContext","isImpersonating","proxyPersonId","read","iframed","top","libraries","register","ENV","LOG_VERSION","Logger","libs","forOwn","controllerFor","instance","lookup","serviceFor","componentFor","listAsync","resolveRegistration","logTimerQueue","logPendingPromises","promiseStackFor","lookupPromiseStack","_emberLoadInitializers","stackTraceLimit","HTMLBars","template","block","moduleName","_util","_component","oauthStoreParams","oauthStoreProps","Base","purecloudOauth","authClient","restore","accessToken","clientId","parent","access_token","_establishLocalSession","pick","Client","token_type","getToken","t0","failedStep","authenticate","scope","reason","deserializeRestoreState","finalOptions","expires_in","token_expiry_time_millis","_getCurrMillis","token_expiry_time_iso_string","Date","SESSION_BOOTSTRAP_ERROR_TYPE","authUrl","_buildAuthUrl","invalidate","allSettled","_destroyLocalSession","authorizer","getOwner","deauthorizeAllDomainRequests","extractAuthData","reduce","accumulator","currPair","tokens","currToken","decodeURIComponent","buildAuthorizeUrl","stateParam","org","buildLogoutUrl","cleanCustomBrowserStorage","clear","localSessionDeferred","authorizeAllDomainRequests","authenticateWithSession","removeAuthCookie","legacyInvalidSessionToken","ensureLogsSent","_x","ajaxGet","finally","login","stateParamValue","targetOrg","baseAuthUri","oauthParams","response_type","client_id","enableRegionSwitching","redirectUri","origin","pathname","lastIndex","redirect_uri","_this6","_callee3","_context3","immediateSaveLogs","now","DirectoryAuthenticator","SEMVER_PARSER","_authData","_ajaxPrefilters","_ajaxErrors","appContextHeaderTokens","headerTokens","semver","semverParseResult","exec","_semverParseResult","_slicedToArray","pkgVersion","buildNumber","gitBranch","gitCommit","curr","replaceAll","isHosted","Callbacks","ajaxPrefilter","fire","ajaxError","authorize","authData","fnToAuthorize","_buildHeaders","_addHeadersPrefilter","empty","original","crossDomain","_isWhitelistedUrl","_isAbsPathOfProxiedEnv","excludeAuthHeaderForFax","isFaxUpload","Authorization","headerValue","headerName","setRequestHeader","_isGcPublicApiUrl","REQUEST_TELEMETRY_APP_SUBSECTIONS","subsection","subsectionTokens","remoteData","includes","pubApiBase","pubApiProxyBase","currBase","envDetails","environment","local","tgtEnvDetails","netUtils","getEnvDetails","env","unknownEnv","_handleUnauthorizedRequests","settings","thrownError","skipPurecloudUnauthorizedCheck","_sendXhrErrorDetails","unauthorized","ININ-Client-Path","_handleClientUnauthorizedError","msg","_sendErrorMessage","_errors","isUnauthorizedError","xhr","correlationId","getResponseHeader","messageData","post","beforeSend","app","appId","appVersion","traces","level","time","topic","locale","pluralRuleFunction","ord","n100","year","displayName","relative","0","-1","relativeTime","future","zero","one","two","few","many","other","past","month","day","-2","hour","minute","second","v0","parentLocale","n10","i10","i100","on","Component","classNames","notification","sendClose","sendAction","toast","notificationType","markdownToHtml","shouldShowPopup","shouldPlaySound","handleMessageEvent","sameHost","sameName","startMessageListener","elementId","stopMessageListener","off","classNameBindings","attributeBindings","intl","utcOffset","staticMoment","showSecondHand","autoIncrement","_analogSupported","Modernizr","csstransforms","_displayedMoment","_invalidTime","_currTimeLabel","_pendingTick","willRender","_cancelTimers","formatStr","invalid","isNaN","isValid","format","willDestroyElement","didRender","hourElement","minuteElement","secondAngle","minuteAngle","hourAngle","hourRule","minuteRule","secondRule","style","transform","secondElement","later","rerender","timerName","currTimer","cancel","AnchorTagComponent","tagName","httpRegex","decorateLabel","text","htmlSafe","Handlebars","Utils","escapeExpression","anchor","encodeURIComponent","observer","_email","isValidEmailAddress","IMG_TYPE_CFG_MAP","icon","assetBasePath","closestSizeMaxMultiplierDelta","minSupplimentalRes","maxSupplimentalRes","tile","RASTER_IMG_KEY_REG_EXP","TITLE_MODES","titleMode","assert","showTooltip","equal","appName","imgType","imgWidth","imgHeight","_sortedRasterMultipliers","cfg","allRasterImgs","rasterUrl","rasterKey","rasterMatch","currRasterWidth","currRasterMultiplier","multiplier","_vectorImgUrl","svgasimg","defaultImgUrl","vectorImgUrl","allRasters","lowestDelta","currDelta","abs","imgSrcSet","srcset","supImgs","reverse","svgSpriteHref","svgPropPath","imgClasses","classesPath","guxIcon","guxIconPropsPath","guxIconProps","Howl","Howler","clock","webrtc","attrs","source","markAsRead","playing","didEnd","loading","loadingError","registerStopVoicemailHandler","sound","playFromSelectedOutput","playbackVolume","callVolume","decimalValue","selectedOutputDevice","defaultOutputDevice","outputDeviceUpdate","restartSound","stopPlaying","newOutputDeviceId","setOutputDevice","play","actions","togglePlay","outputDeviceId","volume","pause","seek","seekSound","didReceiveAttrs","registerHandler","setupSound","paths","getAttr","sources","useHtml5","html5","duration","floor","currentTime","loadingAudio","howlOptions","defaultOptions","onload","onLoad","onplay","onPlay","onpause","onPause","onend","onEnd","_checkSoundDuration","Infinity","ontimeupdate","_duration","notifyPropertyChange","newAttrs","oldAttrs","position","left","css","click","offsetX","totalSeconds","recorder","startTime","showOptions","file","uploadImmediately","playerOptions","reset","audioFileReady","startRecording","stopRecording","hasSupport","and","audioBlob","audioSource","recording","hasMediaRecorder","MediaRecorder","showUploadButton","didInsertElement","scheduleOnce","setupRecording","destroy","didUpdateAttrs","Recorder","create","ownerInjection","_basicDropdown","_contentElement","_content","_trigger","canViewChat","person","isChild","isSuperior","toggleExpand","toggleProperty","children","PromiseArray","orderedPeople","getNextPerson","manager","getFieldValue","nextPerson","hasChildren","gt","hasSuperiors","directReportsLabel","showTotalReports","totalReportsLabel","totalReports","attachTextInputListeners","removeTextInputListeners","stopPropagation","presenceSubscription","canMove","flipster","currentPerson","currentPersonId","selfAndSiblings","currentPosition","reportTracker","setCurrentPerson","moveToManager","currentPersonManager","content","getPosition","tracker","setHierarchy","makeCoverFlow","moveToReports","currentPersonDirectReports","isEmpty","trackedReport","setPerson","attachNavigationListener","willClearRender","removeListeners","allPeople","isFulfilled","promises2","haveScrolled","peerCount","siblings","_getPosition","contents","unwrap","removeClass","startPosition","itemContainer","itemSelector","fadeIn","spacing","scrollwheel","keyboard","touch","nav","buttons","onItemSwitch","to","debounce","changeCurrentPerson","toElem","card","entityId","findBy","onKeyDownHandler","_this7","ns","_keystroke","eventToString","is","isNavigation","model","maxCount","charactersUsed","characterCount","activeRoom","check","activeJid","muted","any","toggleRoomMute","roomJid","areNotificationsDisabled","setRoomMuted","ClickOutsideComponent","showCreateGroup","canInvitePeople","canCreateGroups","canCreateLocations","showMenu","or","adminModalSrc","launchCreateGroup","cancelCreateGroup","showAdminModal","closeAdminModal","minViewMode","days","months","years","srOnly","placeholder","minDate","maxDate","inputMode","minView","isoLocale","monthYearLocaleFormat","moment","localeFormat","creationData","longDateFormat","datepickerValue","dateObject","date","initDatepicker","removeBehavior","datepicker","changes","setupDatepicker","localeData","_longDateFormat","L","language","orientation","todayHighlight","clearBtn","container","startDate","toDate","endDate","dates","fn","selectedLanguage","setData","picker","addClass","val","str","valueOf","clearValue","view","_placeholder","DocumentTitle","dragClass","dragLeave","preventDefault","dragOver","drop","ariaLabel","draggable","dragStart","dataTransfer","toggleMenu","handleKeyDown","parents","targetOutside","targetInput","listItem","prop","editing","canUploadPicture","canEditProfilePicture","canEditInformalPicture","canEditAgentImage","showingProfile","showingInformal","openCaption","currentInformal","upload","select","changeType","showInformalPhotos","showProfilePictures","showAgentPhotos","uploadImage","selectUploadedImage","image","active","deleteUploadedImage","removeAgentImage","imageId","overwrite","forceBrowserNotification","tag","section","saveSection","scrollActiveImageIntoView","activeImg","picturesContainer","scrollTop","parentNode","offsetTop","setupTabListeners","tabId","originalEvent","activeTab","offsetParent","activeElement","blur","focus","teardownTabListeners","emptyProfilesText","emptyInformalsText","profileInstructionText","informalInstructionText","agentImage","x200","x800","x1024","_positionedContainer","_basicDialog","_inPlaceDialog","_liquidDialog","_liquidTetherDialog","_tetherDialog","_emberTether","_emberWormhole","COUNTRY_OPTIONS","editingElocation","eLocation","showTitle","showResetButton","showTitleIcons","showTitleInEditMode","personId","primaryVoice","saving","countryOptions","A","street1","street2","city","zipcode","country","street1ReadOnly","street2ReadOnly","cityReadOnly","stateReadOnly","zipcodeReadOnly","countryReadOnly","isAddressEmpty","showNumberInTitle","notEmpty","updatedAddress","previewAddress","previewAddressIsEligible","previewAddressError","toolTipArrowId","toolTipHelpId","toolTipAlertInfoId","isEligibleForE911","eLocationInlineWarning","hasELocationInlineWarning","setField","field","updateElocationOnChange","countryTranslated","entry","perform","setUpdatedAddress","_emberConcurrency","task","eLocationCopy","waitForQueue","_cloneDeep","restartable","layout","canViewVideo","videoTooltipTitle","linkProfile","showFavorite","showImages","compact","phoneServiceEnabled","phoneAvailable","isOneToOneOfflineOrBusy","isChatEnabled","isWebrtcEnabled","isVideoButtonEnabled","onContact","callEntity","toggleFavorite","useMediaProviders","makeCall","_lodash2","groupExtension","phoneNumber","bubbleAction","actionContext","startChat","sendLove","launchWebrtc","showGallery","isPerson","isGroup","linkToProfileRoute","isSelf","hasImages","personHasImage","groupHasImage","hasPhone","_lodash","PromiseObject","fieldPath","mailto","tel","rel","e164","emailEnabled","phoneEnabled","showPhone","EntityContact","FlagMixin","phoneService","layoutName","makingCall","queue","callPromise","PersonModel","flagInteraction","flagInteractionAction","EntityContactComponent","PromiseLoadingMixin","favorites","showChat","showEmail","shouldTether","contact","callId","shouldDisplayDropdown","showDropdown","callConnecting","flaggingSupportEnabled","isRedial","tether","toggleDropdown","recordRecentContact","sendToProfile","entityData","isFavorite","isEntityFavoriteDecompEnabled","readOnly","callConnected","activeCall","activeCallId","componentCallIsActiveCall","phoneNumberDetails","formatAddressForDisplay","chatEnabled","favoriteEnabled","isExternal","isExternalContact","setExternalContactInfo","setupGroupPhoneNumber","setGroupNumber","enableFavoriteEvent","personIsDeleted","hideChat","phones","getContactFieldValuesByType","emails","displayDropdown","hasEmail","canDisplay","isContact","callTitle","attachListeners","detectOutsideClick","setupTether","Tether","element","attachment","targetAttachment","pin","removeTether","remove","isDestroyed","isDestroying","once","items","primary","primaryItem","notifyError","show","hideAfter","actionHandlers","reportError","fieldValues","disableDropdown","toggleAddValue","addNewEntry","hide","attachClickListener","removeClickListener","EXCLUDE_TYPES","filterExcludedField","excludedFields","tabindex","sectionInfo","hideHeader","editingProfile","scrollOnAddNew","excludedEditingFields","removeSection","sectionName","sectionKey","editingSection","alias","showModal","cancelling","hideEmptyValues","showInstructionText","disableAddValueDropdown","showRemoveSectionModal","fallbackToEmptyLabel","hideFooterRemoveButton","timer","isEditing","toggleInstructionText","editSection","updateMasonry","readableFields","getReadableFieldPathsForSection","writeableFields","getEditableFieldPathsForSection","_focusManagement","doFocus","cancelEditElocation","animate","valueReference","pop","fieldData","FieldData","pushObject","scrollToNewField","removeEntry","removeEntryFromFieldData","removeContactSection","confirmRemoveSection","cancelRemoveSection","fieldList","_isEmpty","filterBy","getFieldPath","removeObject","_groupedFieldData","_newFields","sectionData","fullPath","setupCacheValues","setProperties","instructionTextTooltipOnInsert","isViewMode","ownProfile","profile","Profile","getProfileForModel","filteredFields","isSuper","excludedFieldsFilter","_curry","readableFieldPaths","addObjects","getFieldEntries","groupedFieldData","groupedData","_groupBy","_map","instructionText","getI18nKey","fieldValuesToAdd","fieldSectionHasData","canEditSection","hideAddNew","disableSave","validFields","_reject","showEditAction","showHeaderLock","showAddNew","onEditingChange","onValidityChange","disableModal","repeatable","values","v","handleEditingChange","reconcileNewFields","reload","info","statusCode","errorTitle","errorMessage","fieldPaths","currentValue","tempValues","tempId","_id","elem","parentTop","setupInstructionText","tooltip","placement","_updateMasonry","_masonry","rerunLayouts","_this8","keyForField","EntityFieldSection","updatedElocationAddress","previewAddressisEligible","_groupedContactInfo","editElocation","primaryContactSection","latestPrimaryContactInfo","reconcilePrimaryContact","errorField","saveElocation","refreshAllEmergencylocationInfo","errObject","softError","hardError","hardErrorMessage","defaultErrorMessage","removePrimaryContact","setPrimaryCallback","getEmergencyLocation","EmergencyLocationUtil","getErrorString","setEditingSection","groupedContactInfo","handleData","missingData","missingFields","difference","chain","groupBy","setOwner","ContactInfoGroup","primaryContactCollection","rejectBy","_storePrimary","setPrimaryContact","fieldDataId","equalFieldIds","fieldId","equalFieldPaths","isNewFieldValue","valueNumber","primaryNumber","ref","currentLabel","fieldChoices","keyPath","addNewLabel","emptyFields","containsRepeatable","repeatableField","isPhone","isEmail","isIm","isAddress","showHeadings","canAddNew","empties","changeGroups","toggleMore","allKeys","activeKey","showMore","flowTabsInline","fieldConfig","hasOfficialField","getFieldByKey","hasSocialField","getGroups","flatten","tabs","titleWidth","tabWidth","tab","acc","activeGroups","shouldShowMore","_cachedGroupFieldData","_cachedLocations","currentEntry","entries","locationId","viewingMore","_relationships","fieldValue","last","updatedField","relationshipGroup","fieldKey","addObject","removePerson","saveReports","clearDirectReportsCache","updatedLabel","management","assistants","defaultReports","defaultSiblings","relationships","cachedGroups","RelationshipGroup","otherRelationships","findByIds","allRelationships","otherRelationshipValues","labelkey","filteredReports","filteredSiblings","sibling","canAddMultiple","showingMore","onUpdateLabel","onUpdateField","selectPerson","addPerson","removeRelationship","shouldRemove","confirm","valuesToRemove","removeObjects","_forEachRight","toggleShowing","newLabel","oldLabel","_uniqBy","canEdit","canRemove","isManagerField","updatePeople","cachedPeople","hasMore","haveManager","hideSection","reportsToSave","lookupKey","isManagerRelationship","isReportRelationship","isAssistantsRelationship","isOtherRelationship","addManager","currentManager","removeManager","newManager","showLabelChoices","updateLabel","focusInput","selectLabel","toggleChoices","trigger","hasLabelChoices","canShowLabelChoices","labelChoices","i18nKey","labelKeys","setLabelKey","handleTooltip","input","EntitySearch","searchLimit","selectResult","resultsLoaded","FieldComponentMixin","ensurePopulatedField","isFieldEmpty","setValues","complexField","complexValueFields","selectDate","getDate","getMonth","getFullYear","timers","populateFieldOnRender","isComplexFieldEmpty","copy","formattedValue","i18n","previousMonth","nextMonth","_months","weekdays","_weekdays","weekdaysShort","_weekdaysShort","dateFormat","currentTooltip","isActive","hasError","setPrimary","isPrimary","entryId","valid","canSetPrimary","focusOut","saveHistoryEntry","cancelHistoryEntry","cancelAddNew","focusNewField","added","$input","ensureDateObjectsExist","where","calculateValidityOnInsert","validityChanged","resetData","cleanFieldForSave","useEducationLabels","isNewField","what","notes","whereLabel","datesLabel","whatLabel","notesLabel","whereErrorChanged","dateErrorChanged","TextField","parentLocation","floorLocation","googleMapsHref","showFloorplan","filterLocationsHelper","focusFieldOnInsert","selectParentLocation","selectFloorLocation","saveNewLocation","cancelNewLocation","selectLocation","coordinates","x","y","removeNewParentLocation","noop","toggleFloorplan","hideFloorplan","save","resp","responseText","parentLocationName","selectedFloor","haveParent","haveFloor","locationData","emptyPromise","locationAddress","isRichAddress","parentLocations","getRecord","canShowEdit","locationChoices","choiceText","selectedParentLocation","editText","attachmentId","setGoogleMapsLinkInfo","street","parentLocationUpdated","dropdown","toggleFlash","locationIds","peekRecord","showFloorPlan","selectPersonFromPicker","requireFields","setPrimarySMS","toggleSMS","updateNumber","updateExtension","_setupData","addBehavior","setupTooltips","_setupInput","dialableNumber","isPrimarySMS","checkPrimaryForType","dialCode","initialCountry","intlTelInput","errorMsg","iso2LocaleCountry","iso2","errorCode","intlTelInputUtils","validationError","INVALID_COUNTRY_CODE","TOO_SHORT","TOO_LONG","NOT_A_NUMBER","isRequiredPhone","isRequiredError","isNumberError","errorClass","_setFieldDataValidity","hasErrorCode","countryData","toLocaleUpperCase","emptyData","acceptsSMS","orgCountryCode","countryCode","nationalMode","utilsScript","choice","setValue","defaultValue","_find","allowedValues","translatedAllowedValue","translatedValue","valueKey","addTag","tags","removeTag","showDuplicateError","linkable","sortedTags","recordChange","search","tagValue","currentRequest","initTagInput","$typeahead","typeahead","highlight","hint","async","displayKey","syncResults","asyncResults","addTagFromTypeahead","clearInput","request","types","suggestions","suggestion","keyDown","abort","flash","flashTag","requiredFieldPaths","embedded","onProfile","isGeneralField","saveField","keyCode","notifyUserGeneralFieldUpdated","showPlaceholder","textValidator","watchValidityToDisableModal","disable","placeholderText","setMinWidth","span","append","ensurePopulatedWhenEditing","setWidth","getFieldError","maxLength","history","boolean","weblink","multiline-text","multiline","cleanFieldForEntity","isGroupField","haveStartDate","haveEndDate","isMoment","isEmptyValue","isRequired","numberMaxLength","extensionMaxLength","isValidUrl","baseKey","_s","customLabel","validator","placeholderImages","isInitialized","isNameLatin","feature","hoverParent","applicationUrlPrefix","isPlaceholderImage","useInitialsPlaceholder","enableMiniCard","microCard","showMiniCard","showQueueToggle","showPresenceDropdown","showLogOffButton","isGeolocationEnabled","imageLoadError","isHoveringCard","isHoveringImage","hoverTimer","isFirstHover","haveMediaProviders","mediaProviderComponent","useIntegrationBadges","integrationBadgesComponent","tetherConstraints","hovercardOffset","triggerShowMiniCard","_displayHoverCard","mouseEnterCard","onHoverChanged","mouseLeaveCard","_attachListeners","_removeListeners","isHovering","isOnline","chatPresence","chatPresenceClass","tetherSelector","tetherElementId","uniqueId","entityType","cardImageUrl","getProfilePicture","nameInitials","commaIndex","spaceIndex","leftInitial","rightInitial","initialsPlaceholderSupported","isPlaceholderImageAndUseInitials","showPresenceAndChatEnabled","entityIsGroup","entityDeleted","isSelfEntity","placeholderImage","baseUri","profilePicture","deviceSize","sizeForDevice","exactMatch","sizes","ratio","devicePixelRatio","mouseEnter","mouseLeave","_createPopper","el","targetEl","querySelector","cardEl","_popper","Popper","modifiers","flip","behavior","arrow","preventOverflow","padding","_destroyPopper","Image","scheduleUpdate","clickedHoverCard","checkHoverState","isLinkable","subscribeToPresence","showStatusQuote","showPresence","_managePresenceSubscription","$img","_removePresenceSubscription","managePresenceSubscription","displayStatusQuote","imageUrl","_animationRun","_currentPresence","isStatusAnimating","animateOnPresenceChange","nextPresence","prevPresence","entityIsContact","modifyPlaceholderImage","autoSubscribe","showDepartment","showActions","clickToProfile","isSearchResult","geolocation","phoneTooltip","entityTypeClass","dasherize","entityIsPerson","entityIsQueue","entityIsMe","canContactEntity","isPresenceLabelToggleEnabled","useInitials","showOrganization","entityRoutePath","isClickable","_subscribePresence","subscribe","conversationSummary","socialExpression","totalMessages","contactCenter","enterprise","_presenceLabelUtil","activityCounter","totalSocialExpression","region","selfLocation","entityLocationData","presenceLabelData","showStatus","showActivity","eActivityPresenceClass","totalCalls","totalChats","totalEmails","presenceLabel","eChatStatus","isShowingActivitySummary","ViewportMixin","requiredPermission","hasRequiredPermission","perms","agentHasOnQueue","agentHasRequiredPermission","isTesting","_subscribeToPresence","didEnterViewport","didExitViewport","_unsubscribeFromPresence","externalContact","showPhones","showEmails","showAcceptsSMS","acdOutboundWhatsApp","_getEmailTypes","modelKey","_getPhoneTypes","dropdownTitle","externalContactHasNoEmailAddresses","phoneType","canUseNonE164","phoneTypeTranslated","phoneTypeId","typeName","externalContactHasNoPhoneNumbers","emailType","hasMultipleEmails","hasMultiplePhoneRecords","selectEntityWithEmail","selectEntityWithPhone","onPreventClick","queueService","isDetailsLoaded","isDetailsLoading","canViewQueueDetails","getQueueData","waitTimePromise","getQueueEstimatedWaitTime","callWaiting","callbackWaiting","chatWaiting","emailWaiting","messageWaiting","joinedData","joinedPromise","waitTimeResults","getMetricCount","array","metricName","metricData","metric","getOnQueueCounts","routingStatus","partial","datum","qualifier","property","sum","joined","queueId","mediaType","callData","callbackData","chatData","emailData","onQueueCount","idleCount","waitStr","queueData","agentData","callCount","callbackCount","chatCount","emailCount","messageCount","bestWaitTime","bestTime","formula","estimatedWaitTimeSeconds","getWaitTime","wait","hr","hours","minutes","sec","seconds","waitTime","imageMappings","informal","activeProfilePictureSection","open","askToDelete","showUploadModal","uploadPicture","confirmUpload","pictures","picture","entityJid","edit","setProfilePicture","notifyUpdateProfileImage","firstObject","updatedSection","images","newImage","profilePictureSection","cancelUploadModal","cancelDeleteModal","doneDeleting","_showing","showing","isPersonOwner","hasAccessToPicture","canEditProfiles","done","selectImage","current","selected","total","currentSelection","deleteImages","imageType","uploads","currentSelected","imagesToSave","addingSection","emptySections","addSection","toggleAddingSection","_this$attrs","attachHandler","EntityControllerMixin","ProfilePermissionsMixin","mediaProviders","resizeDetector","emergencyLocation","emergencyLocationOn","editEmergencyLocation","lastEntity","showCardView","compactLayout","excludedContactFields","iconHoverText","scrollToBottom","scrollHeight","toggleEditProfile","editProfilePicture","editContactInfo","setContactInfo","$section","focusTarget","toggleCardView","componentUpdated","resize","handleResize","notify","allSections","canEditStatus","isPurecloudSource","_presenceUtils","department","fieldSections","emptyWriteableSections","sectionKeys","isEditingSection","videoProviders","getVideoProviders","haveVideoMediaProviders","_mediaProviders","hasSupplementalVideoProvider","profileChanged","editingSectionChange","handleProfileChange","lastId","handleEditingSectionChange","masonryEl","_useMasonry","enableMasonry","_masonryId","_isInDOM","fieldSectionsUpdate","attachMasonry","masonry","columnWidth","fitWidth","registerLayout","rerun","throttle","detachMasonry","deregisterLayout","startMasonry","stopMasonry","Mixin","canEditProfile","canEditName","canEditTitle","canEditDepartment","canReadHR","onOwnProfile","gallery","canReadGroups","groupsFieldConfig","getSectionByKey","canEditGeneralInfo","canEditContactInfo","canViewLocations","locationsField","canViewInformals","photos","PERMISSIONED_FIELD_PATHS","POSSIBLE_INTEGRATION_FIELDS","findIndex","generateGuid","_sectionLocation","fieldPathClass","writeable","BUILTIN_SECTIONS","myOwnProfile","customKeys","_profile","customSectionKeys","removeable","removable","integrationManaged","integration","Validators","isPrimaryField","primaryFieldId","isNewValue","PROFILE_CACHE","EXCLUDED_SECTIONS","ADMIN_SECTIONS","builtins","_cache","readWritePermissions","writeableSections","readableSections","canReadProfiles","write","profileSections","SectionInfo","canEditProfilePictures","canReadSection","reopenClass","owner","customSections","adding","componentName","hasCustomComponent","emptyValues","ThenableSearchMixin","filterFunction","searchQuery","userInput","debouncedScheduleQueryUpdate","disabled","ensurePluralType","_scheduleSearchQueryUpdate","maxWait","selectNext","selectPrevious","cancelInput","chooseSelected","setUserInput","_updateSearchQuery","submit","clearSearch","entityFilter","_buildResults","wrappedSearchResults","searchResults","haveResults","noResultsKey","plural","nowSelected","nextSelected","scrolling","previousSelected","areaScroll","entityHeight","clearInputs","chosen","each","isEnter","presence","editable","savedStatus","isLoading","debounceTime","isInvalid","changeStatus","updateStatus","changeStatusEventually","setUsersStatus","showUpdateError","ExpanderPluginComponent","expandText","collapseText","$el","expander","userCollapseText","afterExpand","afterCollapse","fallbackToEmpty","showHistoryYearRange","choices","choicesHidden","customLabelText","for","toggleChoicesView","selectChoice","setupCustomLabelText","hasCustomLabelKey","labelForHistoryField","customLabels","customLabelTextChanged","clickId","pickerParent","containerParent","attachTooltip","html","keyPress","hasStartDate","hasEndDate","_locale","monthYearFmt","startDateFmt","endDateFmt","mStartDate","mEndDate","endOf","diff","humanize","formattedStartDate","formattedEndDate","_fixtableColumnHeader","_fixtableColumnLabel","_fixtableEmptyState","_fixtableFooter","FixtableGrid","_fixtableRowToggle","_fixtableRow","saveLocation","coordinatesRatio","selectFloorplan","setCurrentFloor","floorplans","currentLocation","saveFloorplan","closeFloorplan","loadInitialPinLocation","img","coords","getRatioCoordinates","attachPinForXY","floorplanImageUrl","resolution","imageUri","locationFloors","parentFloors","loadFloors","updateCoordinatesRatio","updateCoordinatesOnLocation","clientX","pageXOffset","offsetY","clientY","pageYOffset","operation","naturalHeight","naturalWidth","heightDiff","widthDiff","currentPin","floorSorter","sorted","hidePopover","popoverEl","attachClickHandler","removeHandlers","AUDIO_FORMAT","BrowserUtils","getSuggestedAudioTypeFrom","GroupContactModalComponent","saveContactInfo","originalExtension","voicemailFile","showVoicemailOptions","resetGreeting","rotateCallSecondsError","numberOfRotationsError","saveForm","updateRotateCalls","updateRotations","toggleVoicemail","toggleEmailNotification","toggleOptions","selectVoicemailFile","triggerUpload","chooseFile","fileReader","FileReader","onloadend","arr","Uint8Array","isOpus","isWav","isAiff","readAsArrayBuffer","isOggFileType","recordingReady","resetRecording","resetFile","resetCurrentGreeting","audioPlayerError","setupInput","initNumber","numberOfRotations","rotateCallSeconds","_voicemailOn","voicemailOn","emailNotificationOn","haveExtensionError","isExtensionResourceInUse","isExtensionNotInPool","editingVoicemailDisabled","ringTimeMs","rotations","_this$getProperties","getProperties","ext","invalidExtension","invalidPhoneNumber","haveNumberAndExtension","callNotice","showGroupEmail","greetingOptions","hasGreeting","greeting","greetingAudioSource","audioFile","selfUri","formatId","mediaFileUri","showEmailNotification","setConfirmDisabled","inputElem","extElem","uploadGreeting","uploadPath","FormData","XMLHttpRequest","onreadystatechange","DONE","uploadComplete","_this$getProperties2","setNumberData","showExtensionErrorNotification","haveError","rotateCallsSecs","stopRingingAfterRotations","sendEmailNotifications","handler","update","disableInput","GroupProfileComponent","showContactInfo","saves","groupRoom","showMembers","showLinkDropdown","displayIndices","hasLinks","hasInformals","displayWarningModal","excludedFieldSections","excludedMembershipFields","toggleLoading","generalExcludedEditingFields","selectTab","toggleCallsEnabled","saveCallsEnabledState","toggleEditing","changeEditingMode","editGeneralInfo","cancelEditContactInfo","editPrivacyRules","toggleLinks","goToLink","href","confirmGeneral","closeAllModals","job","handleJob","cancelGeneral","metadataFor","deleteGroup","cancelDelete","confirmDelete","back","groupData","setHasLinks","confirmWarningModal","closeWarningModal","toggleGroupProfileEditPopover","getGrants","isShowingDeleteModal","isShowingPrivacyModal","isShowingGeneralModal","ensureCorrectLinksState","membersTabSelected","settingsTabSelected","generalFieldConfigSection","fieldSection","FieldSection","privacyFieldConfigSection","linksFieldSection","callsEnabled","hasRules","phoneRef","groupVisibility","membershipVisible","includeOwners","groupTypeIcon","groupOwners","membershipHeader","groupRolesHeader","canEditLeftRailInfo","canEditInformation","namedPermissions","isOwner","canEditGroups","canEditGroupTelephonySettings","disableToggleCalls","canEditRoles","hasRolesView","hasPermissionAndDivision","hasGrantsEdit","hasPermission","canDeleteGroup","updateLinksChange","setHasInformals","informals","checkMembers","exclusions","inclusions","canEditMembership","disableAction","unloadRecord","setInterval","getJobData","jobId","retryJobId","clearInterval","commitRevertHandler","adapterDidCommit","showSaveModal","showCancelModal","previewValue","expressionDisplay","conditions","display","con","lastCondition","opAnd","saveDisabled","maximumExpressions","skills","numberPreview","addCondition","exp","condition","rules","skill","comparator","proficiency","lastRule","removeCondition","removeAt","conditionOperation","op","saveData","prepareExpression","success","skillConditions","put","previewUrl","preview","userCount","openCancelModal","closeCancelModal","parseExpression","closeSaveModal","output","routingSkillConditions","languageSkillConditions","rule","skillPropName","ruleType","newObj","childConditions","comparators","class","compPlace","updateConditionDisplay","addRule","removeRule","ruleOperation","skillChanged","_step","orWrap","_iterator","_createForOfIteratorHelper","skillResults","languageResults","showSearchResults","searchvalue","placeHolder","skillSelected","searchInputUpdated","updateSearchOnChange","attachOutsideHandler","removeOutsideHandler","runSearch","languageSearch","skillSearch","skl","langs","lang","LIST_TYPES","OWNERS","MEMBERS","slideInList","personSearch","orgVoicemailPolicy","listType","routeSelection","ringRotations","isSequential","isRotary","reasons","isMissing","loadOrgVoicemailPolicy","scheduleRemoveAnimation","appendSave","removeSave","rollbackAttributes","changeListType","toastTitle","toastMessage","voicemailGroupId","_state","greetingData","ringSequenceData","saveModelData","savePolicy","saveGreeting","callback","greetings","VOICEMAIL","recordingFile","orgIndividuals","addedDelta","removedDelta","addIndividuals","deleteIndividuals","individualsOperation","memberIds","_emberAjax","pigeon","originalNumber","showVoicemailGreetingOptions","pigeonEventHandler","disableReplaceOverflowBtn","disableRingInputs","forwardingOn","overflowGroup","duplicateNumberError","inputErrorClass","routeTypes","translation","routeSelectionType","routeDescription","selectedRouteType","rotateCallsDisplayText","stopRingingDisplayText","searchText","displaySpinner","enablesHipaa","disablesEmailNotifications","disablesPiiInEmailNotifications","disablesVMTranscription","disablesVoicemails","voicemails","transcriptionToggle","transcriptionDropDown","_getLanguagePreference","transcriptionLanguages","languagesObj","emailNotifications","piiInEmailNotifications","saveFunction","handlePigeonEvent","registerToPigeonTopic","_setupInputs","previousEntity","rotationsChanged","toggleCallForwarding","selectOverflowGroup","replaceOverflowGroup","toggleVoicemails","toggleEmailNotifications","togglePiiInEmailNotifications","toggleShowVoicemailGreetingOptions","toggleTranscriptions","selectTranscriptionLanguage","badNumber","badExtension","editingObserver","groupTopic","registerPriorityTopic","overflowGroupId","finishedSaving","succeeded","BatchDataRequestMixin","searchInput","sequenceContainer","resultsContainer","resizeListener","listDirty","_editing","isOwners","cachedEditing","sequenceList","individualsSequenceList","_sequenceListForPeople","ownersSequenceList","renderedList","_appendRotationListData","searchLabel","searchPlaceholder","addMemberPlaceholder","inputEntered","togglePersonSearch","handleListeners","listModified","_handleResizeEvent","listLength","listModel","beginningOutOfRange","outOfRange","endOutOfRange","popupDismissed","batchPromises","getUser","personArray","fuseOptions","shouldSort","threshold","distance","maxPatternLength","minMatchCharLength","getFn","groupList","selectedIndex","queryAvailable","Fuse","removeItem","_recalculateIndices","notifyParentOfListChange","changePosition","from","_changePosition","isInteger","groupArray","insertAt","input_value","hovercardArrowOffset","scrollIntoView","outOfRotationRange","displayRotationRangePopup","newIndex","popupTarget","indexChanged","changeIndex","dismissPopup","setIndexChanged","submitIndexChange","membership","deletePerson","isLoggedInUser","sessionPerson","cannotDeleteMember","isOwnerAndSelf","multipleOwners","canViewRules","visible","hasPermissions","memberType","isPersonIndividual","memberTypeList","isRule","isAddedIndividual","isCurrentMember","PagingMixin","JobMixin","searchService","filterChoices","string","inclusionFilter","exclusionFilter","showRules","loadedAll","ignoreScroll","rateLimited","currentlySearching","currentMembershipRequest","membershipQuery","memberListLimitSize","retryTimeout","retyTimeOutDuration","toggleRules","updateContentOnChange","selectFilter","updateSearch","searchCriteriaChanged","editMembership","selectKeyword","keyword","addKeyword","addedIndividuals","removedIndividuals","setRulesOnGroup","addJob","handleJobFinish","saveIndividuals","initMembership","loadMembershipList","loadMoreMembersOnInit","inclusionQueries","addedInclusions","exclusionQueries","addedExclusions","membershipRules","isEditingRules","expression","displayEditingFooter","rolesEnabled","isSearching","shouldShowRules","showingFilterChoices","editingFilterChoices","membershipCount","extraParams","generalQuery","queryGroup","cancelEditOnGroupChange","debouncedSearchCriteriaChanged","reloadPageOnGroupChange","loadMore","_args2","reloadPageOnGroupReload","_individualsOperation","Content-Type","loadOwners","loadPathFieldMembers","loadIndividuals","_callee4","_context4","displayClassification","isIndividual","addedRules","rels","personQuery","latestAdded","_this9","singularize","currentFilter","keypath","ruleData","loadContentOnScroll","_callee5","listing","scroll","filterKey","_this10","_context5","loadSearchMembers","newMembership","_this11","searchMembership","peopleIds","pushObjects","incrementProperty","_this12","member","filteredResults","isError","allMemberships","uniqBy","setObjects","_this13","updateOffset","aName","bName","loadRules","_callee6","isPending","_context6","loadAll","_callee7","_context7","builder","requestBuilder","addQuery","performCustomSearch","listingEl","containerHeight","groupedRelationships","toggleRelationship","_$last","deleteRule","isKeyword","relationshipGroups","relationshipSelected","oid","graph","buildGraphFromRelationships","ancestors","descendants","SearchMixin","searchValue","mode","resetPersonSearch","isRules","iconClass","dismissed","currentIds","removeDuplicates","currentSearchRequestUpdated","previousFilter","performPersonSearch","resetSearch","editingStateChanged","addAggregations","aggregates","aggregate","SEARCH_FACET_KEYPATHS","groupAssignedRoles","isEditingRoles","displayRoleRemoveModal","rolesToDelete","displayRulesRolesWarningModel","unsavedGrants","roles","_hasUnsavedGrants","hasUnsavedGrants","grantId","grantModel","recalculateHasUnsavedGrants","addAllFutureDivisions","_ref3","removeAllFutureDivisions","grantMaps","grantMap","groupRolesViewColumns","nameColumn","header","cellClass","typeColumn","descriptionColumn","divisionsViewColumn","hideLabel","groupRolesEditColumns","divisionsEditColumn","assignmentColumn","editRoles","toggleRolesEnabled","_toggleRolesEnabled","_enableRoles","closeRulesRolesWarningModal","getGroupRoles","_getGroupRoles","deleteRoles","_deleteRoles","openConfirmModelSingleRole","grantRole","grantRoles","openConfirmModelMultipleRole","divisionRoles","divisionRole","rolesToUpdate","grantsToDelete","_ref4","undeletedGrant","destroyRecord","_stopEditingRoles","_isTooManyGrantsError","searchAssignedRoles","filteredRoles","roleDivision","searchAllRoles","updateUnsavedGrants","selectedDivisions","previouslySelectedDivisions","_updateUnsavedGrants","confirmHasRolesWarningModal","_disableRoles","closeHasRolesWarningModal","toggleRoleAssignment","isAssigned","addRole","removeRole","trySet","division","stillSelectedDivision","divisions","_removeRole","getRoleWithDivisions","grantRecord","previousVersion","attempt","grants","assignedRolesMap","unloadAll","grant","subjectId","normalize","setMap","turnOnRoles","_toggleRolesOn","_toggleRolesOff","hadRules","selectionIsEmpty","selectedDataRows","isFirstPage","isLastPage","listedPages","totalPages","neighbors","pagesToFirst","pagesToLast","shortageL","shortageR","lowerIndex","upperIndex","pages","isCurrent","firstPageListed","secondPageListed","penultimatePageListed","finalPageListed","showPaginationControls","showRangeLabel","bulkAction","showPage","showNextPage","showPreviousPage","containsRole","rowHasToggled","wasAssigned","homeDivision","peekAll","_updateDivisions","previouslySelected","allFutureDivisionsSelected","updateDivisions","previousSelection","allFutureDivision","_loadDivisions","_setSelectedDivisions","roleDivisions","allDivisions","selectedDivision","rolesEditComponent","allDivisionsSelected","optionsWithoutSpecial","allFutureDivisions","_allFutureDivisionsObserver","powerSelectAPI","_selectAll","selectAll","deselectAll","removeObserver","addObserver","divisionsDisplayList","displayString","objectAt","toggle","dash","firstItemIndex","lastItemIndex","isSingleItem","disabledMessage","queryChanged","triggerSearch","positionSubclass","removeSelectedTerm","terms","removeSingleTerm","facet","isSingleTerm","facetName","_horizontalCollection","bootstrapIcons","_inViewport","hideScrollbars","scrollBottomThreshold","onscroll","onScroll","scrollBottom","clientHeight","scrollThreshold","checkInfiniteScroll","infiniteScroll","isSmall","useLightIcon","iconUri","phoneIntegrations","LightGalleryModal","escaped","initGallery","caption","lightGallery","loop","speed","closable","escKey","allPhotos","_linkToExternalComponent","isAuthenticated","offerMobileApp","onMobileOfferDecline","mobileOfferDeclined","room","attachTo","_displayDropdown","selectProvider","provider","providerId","launchVideoProviderWithPersonById","_targetEl","setup","arrowElement","handleClick","handleOutsideClick","isAttachTarget","componentParents","attachTargetParents","showingVideo","showingPurecloudVideo","showingMediaProvider","providers","chatRoom","isGroupRoom","MiniCardComponent","managerCount","isManager","managerCountText","translucentOverlay","containerClassNames","overlayClassNames","headerText","confirmText","cancelText","showHeader","showFooter","wrapContent","enforceModality","extraClassNames","confirmDisabled","noCancel","trap","sendConfirm","ret","sendCancel","backdropDismiss","setText","confirmAction","cancelAction","attachClassToBody","modalContainerElement","focusTrap","createFocusTrap","escapeDeactivates","allowOutsideClick","activate","removeClassFromBody","deactivate","_modalDialogOverlay","_modalDialog","ModalDialog","_initEscListener","CreateGroupMixin","setHandlers","setAttr","createGroup","checkNameLength","isTooLong","_occludableArea","_pcStyleIconExample","WebrtcActionUtilsMixin","EntityImageDefaults","needsServices","checkUnusedFields","entityContactGroupData","linkToProfile","emailAddress","telephoneNumber","initialFieldsCheck","moveToPerson","setEntityContactGroupData","router","profileId","transitionTo","openChat","openVideo","PersonGraphComponent","paper","mini","trueColor","trueStrokeColor","falseColor","falseStrokeColor","disabledColor","disabledStrokeColor","disabledSegments","baseAttrForPath","segmentChanged","segName","segment","attrForSegment","disabledSegmentsChanged","segs","setupGraph","drawGraphics","destroyGraphics","triggerAction","isDisabled","Raphael","drawSegment","renderfix","safari","xform","pathForSegment","stroke-width","node","fill","stroke","cursor","ancestorsPath","parentPath","selfPath","siblingsPath","childrenPath","descendantsPath","ancestorsSmallPath","parentSmallPath","selfSmallPath","siblingsSmallPath","childrenSmallPath","descendantsSmallPath","PersonIconComponent","PikadayInputComponent","_pikadayInputless","_popoverOnComponent","_popoverOnElement","_powerSelectMultiple","_powerSelect","_beforeOptions","_options","_powerSelectGroup","_searchMessage","_preRender","checked","onClick","ariaLabelledby","isChecked","isMouseDown","minimized","minHeight","maxHeight","toggleSize","attachCurrentHeight","minimizedChanged","_resizeDetector","parentId","selectedTerms","accordianParentId","panelId","isSelected","selectTerm","selectedTermsChanged","keypathRegex","profileSkills","hobbies","interests","certifications","languages","FacetTerm","searchField","reverseLookup","View","attachScrollListener","loadNextPage","createDebouncedLoadNextPage","loadResultsToFillPage","scrollToTopOnPageZero","Controller","integrationsPresence","_searchQuery","queryFacets","saveHistory","totalResults","lastSearchFavoritesCount","onFavoriteChanged","runSearchQuery","changeSearchType","currentActive","termObj","notifyTooManySearchFilters","updateQueryOnTermsChange","atPageLimit","remainingResults","hasMoreResults","moreResults","groupedSelectedTerms","currentGroup","isGroups","isLocations","isExternalContacts","isExternalContactsEmpty","isFavoritesEmpty","haveSelectedTerms","displayFacets","updateQueryParameters","queryParameters","newHash","sendNavigationEvent","searchInitial","searchOnChange","startsWith","termStrings","keywordStrings","_baseSearch","_baseAggregations","order","_valueQuery","_facetQuery","_baseSearchForEntity","aggregations","MULTI_ENTITY_FIELDS","BASE_PERSON_EXPANDS","BASE_PERSON_FIELDS","_buildSearch","favoriteIds","valueQuery","chunks","chunk","operator","_normalizeSearch","models","modelResults","_processFacets","rawFacets","keyOrder","getFavoriteIds","getLoadedFavorites","favorite","isLoadMore","iterations","fetch","buildSelectedTerms","_ref5","userResults","alterUsersWithIntegration","searchKeywords","addSelectedTerm","keywordFacetName","directedSearchTerms","directedSearch","_directedSearch$split","_directedSearch$split2","_toArray","searchSplit","SearchResultContextComponent","searchResultContextVisible","_scrollToPreviousTop","$messagePane","$lastMessage","targetHeight","outerHeight","closeOnContextSwitch","replyToMessage","loadHistoryAfterLast","loadMoreHistoryAfter","loadHistoryBeforeFirst","first","loadMoreHistoryBefore","subMessageTypeClass","subMessageType","_deprecatedTetherDialog","_tetherPopoverOnComponent","_tetherPopoverOnElement","_tetherTooltipOnComponent","_tetherTooltipOnElement","timeSince","_calculateElapsedTime","durationInMs","asDays","_formatDuration","unit","cnt","msSince","HOUR","MINUTE","tickingDuration","escapedBuildTag","rawBuildTag","isPresent","updRandTime","currTime","currMinutes","currBin","nextMinutes","nextBin","hourMultiplier","_tooltipOnComponent","_didUpdateTimeoutLength","TooltipOnElement","AutoSaveDevicesMixin","fileUpload","currentFile","currentFileInfo","currentCoords","currentXHR","currentImageId","selectedCamera","cameraPending","cameraError","startingMedia","imageUrlData","uploadingImageUrl","autoTakePicture","uploadType","createDropZone","uploadError","x2","y2","showPictures","addIndicatorForPromise","uploadImageUrl","_helpers","displayImage","setupFileFromUrl","clearImage","startCamera","isWebRtcSdkDisabled","attachMediaStream","mirror","requestAudio","requestVideo","camera","createMedia","media","takePicture","canvas","createElement","videoWidth","videoHeight","ctx","getContext","drawImage","dataUrl","toDataURL","asBlob","dataURLtoBlob","pictureInfo","fileName","asFile","File","onTookPicture","cancelCamera","cameraStream","switchCamera","updateDefaultDevices","canUseCamera","getImageDataFromXhr","initCrop","aspectRatio","Jcrop","onSelect","handleCropChange","onChange","setSelect","santizedResult","normalizeSingleResponse","attributes","dimensions","fileInfo","$image","FileAPI","imageCategory","displaywidth","cropProportion","gId","imgData","boundingBox","groupImageType","formData","Blob","uId","userImageType","dataUri","getInfo","handleFileInfo","currentTarget","dropzone","Dropzone","acceptedFiles","uploadMultiple","maxFiles","clickable","autoProcessQueue","addRemoveLinks","maxFilesize","dictInvalidFileType","dictRemoveFile","dictFileTooBig","dictCancelUpload","dictUploadCanceled","files","removeFile","autoplay","disableContextMenu","oncontextmenu","styleName","isSafari","processData","profilePaths","editingCaption","canAddCaption","showImage","addCaption","saveCaption","imageList","initCaption","ownImage","isGroupOwner","closeCaption","canDelete","populated","imagePath","currentImage","getReferencedField","_verticalCollection","_verticalItem","_wrapUrls","_link","_url","XOption","XSelect","metaName","nodeName","_require","rawConfig","getAttribute","unescape","isNonEmptyStringQueryParam","paramStr","isBlank","appsService","panels","initialPanel","updateCurrentRouteName","panelsOverrideObject","panelsOverride","initialPanelOverride","transitionToRoute","openPreferencesModal","_default","managePresenceSubscriptions","subscribeTo","inviteUserToRoom","isOneToOneRoom","promoteToAdhocRoom","inviteToRoom","toggleParticipants","collapseChat","oneToOneTarget","makeNewEmptyRoom","ContactsController","favoritesNameFilter","personBinding","isOnlyFavorite","canSearch","removeFavorite","addFavorite","recents","apiEndpoint","getJSON","idOnly","setLocalFavorites","favoritesFilterChanged","debouncedFavoritesFilterChanged","createDebouncedFavoritesFilterChanged","_filterChanged","filtered","setFavorites","countFavorites","list","checkSearchVisibility","EngageController","engageService","route","replaceRoute","setEngageActive","setEngageInactive","navigationEvent","navRoute","engageRouteToCollaborateRoute","redirectEvent","newRoute","MaintenanceController","hasDesc","messageKeys","titleKey","descKey","actionKey","showMobile","loadingFieldSections","showGridMode","stackedMode","gridMode","treeMode","showStackedMode","showTreeMode","toggleLeftRail","queryParamObserver","syncQueryParamsWithHost","currentLocalHash","currentHostHash","updatedHostHash","desktopRegionId","chooseRegion","context","sendRegionToDesktop","defaultDesktopRegionId","PUBLIC_ENVS","desktopId","RelateExternalContactController","IndexController","RelateExternalOrganizationController","relateService","redirectRoute","SignupController","_heading","_button","_plantronicsCallEvents","FieldConfig","ExternalContactModel","GroupModel","OrgModel","KEY_BLACKLIST","GROUP_BLACKLIST","ORG_BLACKLIST","PROFILE_BLACKLIST","_initModelWithType","blacklist","reopen","unknownProperty","splitFieldPath","splitField","getFieldListByType","getFieldsByType","getAllowedValues","isFieldRepeatable","isFieldReference","isFieldChoice","groupFieldConfig","getFieldConfig","personFieldConfig","extra","createFieldConfig","attachComputedEntries","boundTo","boundToEach","getEntriesFromEntity","getEntityType","serverKey","exists","Field","maxRepeat","i18nLabel","getI18nLabelKey","elemId","cleanForEntity","requirejs","_eak_seen","className","factory","lookupFactory","hhmmss","EUR","currency","minimumFractionDigits","maximumFractionDigits","USD","DEFAULT_PARAMETERS","normalizeArrayResponse","activityMessages","sms","voice","Helper","compute","activity","ts","_abs","_acos","acos","_acosh","acosh","_add","formatOrLookupAddressForDisplay","_and","hideSha","versionRegExp","hideVersion","shaRegExp","helper","_arrayContains","arrayContains","_asin","asin","_asinh","asinh","_atan","atan","atan2","_atanh","atanh","_await","promiseArray","permissionsService","_cancelAll","cancelAll","_cbrt","cbrt","_ceil","_clz","clz32","_cos","cos","_cosh","cosh","cssClassify","_dasherize","_div","div","_emberPowerSelectIsGroup","emberPowerSelectIsGroup","_emberPowerSelectIsSelected","emberPowerSelectIsSelected","_emberPowerSelectTrueStringIfPresent","emberPowerSelectTrueStringIfPresent","_emoji","emojifyString","_equal","_equals","equals","escape","_exp","recompute","_escape","_expm","expm1","namedArgs","splitName","fieldObj","lookupPath","_flairRegEx","hideIfText","color","emojiText","_floor","_formatDate","bytes","units","converted","pow","decimals","toFixed","_formatHtmlMessage","_formatMessage","_formatNumber","_formatRelative","_formatTime","_fround","fround","fullNameHelper","externalProfile","fullName","_gcd","gcd","_getSelectOptions","getSelectOptions","hasRecordForId","recordForId","_gt","_gte","gte","_hypot","hypot","activityIcons","_ignoreChildren","ignoreChildren","_imul","imul","_intlGet","_isAfter","_isArray","_isBefore","_isBetween","right","_isFulfilled","_isPending","_isRejected","_isSameOrAfter","_isSameOrBefore","_isSame","routes","station","routeIds","joinStrings","joinCharacter","rest","_l","_lcm","lcm","_this$get","localizePresence","_logE","logE","_log","log10","_log1p","log1p","log2","_lt","lt","_lte","lte","_max","_moment","isSame","_min","_mod","mod","_momentAdd","_momentCalendar","_momentDiff","_momentDuration","_momentFormat","_momentFromNow","_momentFrom","_momentSubtract","_momentToDate","_momentToNow","_momentTo","_unix","_mult","mult","_markdown","_notEqual","notEq","_not","_now","_or","_perform","onIntegrationConfigChange","integrationContactInfo","integrationConfigs","includeBadge","_pow","_promiseAll","promiseAll","_promiseHash","promiseHash","_promiseRejectedReason","_random","renderMarkdown","_round","round","_routeAction","emoji","isUnicode","isUnicodeLookAhead","emojifyStringUnicode","_sign","sign","_sin","sin","sortFieldData","_orderBy","_sqrt","sqrt","_sub","sub","_sum","_tan","tan","_tanh","tanh","_task","padZero","num","willDestroy","_scheduleRecompute","endTime","shouldTick","_setupObserver","titleForEntityPropertyHelper","entityPropertyType","getPhoneTitleFor","getEmailTitleFor","_trunc","trunc","_utc","utc","extLabel","_xor","xor","INCOMING_CALL","TERMINATED_CALL","MISSED_CALL","STOPPED_RINGING","PHONE_CONNECTED","WEBRTC_CONNECTION_INCOMING","WEBRTC_CONNECTION_ANSWERED","WEBRTC_CONNECTION_DECLINED","WEBRTC_CONNECTION_STARTED","WEBRTC_CONNECTION_ENDED","_emberUuid","unparse","v1","v4","initialize","_initializerFactory","after","ApplicationService","before","Route","AuthenticatedAuthorizedRouteMixin","UnauthenticatedRouteMixin","beforeModel","AuthenticatedRouteMixin","deprecateJqueryCookie","jQueryCookieDeprecation","until","cookie","deprecate","removeCookie","oauthProps","_netUtils$getEnvDetai","runtime","loadOauthProps","ChatService","singleton","Clock","StyleNamespacingExtras","ContainerDebugAdapter","WebrtcSdkService","setupContainer","registry","baseURL","rootURL","Configuration","load","_setupSession","_setupSessionService","_engines","exportApplicationGlobal","theGlobal","globalName","classify","throttled","debounced","_register","PersonFieldConfig","GroupFieldConfig","OrgFieldConfig","ExternalContactFieldConfig","MainInitializer","Orgspan","Debug","registerDeprecationHandler","Provider","ZoomProvider","PureCloudProvider","TeamsProvider","PhoneService","PreferencesService","_routeStyles","deferReadiness","authUri","instanceProperties","runtimePublicDomainName","publicDomainName","purecloudV2BaseUri","cobrowseUri","purecloudAppsUri","streamingServiceUri","advanceReadiness","SessionService","_themeLoader","setThemeClass","loadTheme","regex","packages","WebrtcService","WebrtcSettings","_backburnerDebug","_conversationService","applicationInstance","initializeStoreService","instanceInitializer","Intl","polyfill","cldrs","addLocaleData","localeSplit","localeName","addTranslations","_setupSessionRestoration","LazyRenderWrapper","enableLazyRendering","EntityContactGroupComponent","EntityFavoriteComponent","EntityHoverCard","EntityImageComponent","EntityLocationComponent","pushManifest","manifest","PresenceLabelComponent","preferences","parentView","routeTitle","updateRouteTitle","routeName","appRoute","orgName","HostedContext","_net","parseRuntimeCustom","isLink","$target","closest","pigeonService","reconnect","disconnect","urlPrefix","initializeEmojiRendering","initializeMarkdownRendering","apiHandlers","apiHandlerKeys","currHandlerKey","logout","_logged","nrOnError","URLSearchParams","hasQueryParam","TARGET_PRESENCE","freeze","BUSY","MEETING","OFFLINE","launchVideoImage","getTargetPresence","gcPresence","chatUserPresence","loadData","showRunErrorNotification","haveAccess","canRunAction","allowMultipleMeetings","getJid","originalAction","_action","_args","openChatRoomWithVideo","showingVideoChanged","apps","useCollaborateChat","haveEmbeddedClientAccess","meetingUrl","queryParamsToObject","keyValue","_keyValue","buildAuthUrl","authConfig","cancelTimer","iframe","body","appendChild","contentWindow","removeChild","clearTimeout","INTERNAL_DL_MATCHER","embeddedUrl","isExternalDomain","personGuid","modelSet","_displayApiError","fallbackMessageKey","_displayError","messageKey","messageKeyOption","_displayNotification","conversation","conversationIsDestroyed","getInteractionTypeFromCP","interaction","isCall","isFax","isChat","isCallback","isSms","myselfAgent","findLast","participants","party","partyIsUser","partyIsAgent","purpose","callbacks","calls","chats","handleMissedTimedBoxTimer","Interaction","conversationModel","tmpInteractionModel","interactionHasMissedTimer","windowInFocus","hosted","applicationHasFocus","hasFocus","timeDiff","timeCreated","selectedWrapupCode","wrapupNotSaved","oldWrapupCode","skipAfterCallWork","isAfterCallWorkTimerExpired","isWrapupCodeSet","isNotesSet","activeCallWorkCompleted","activeCallWorkNeeded","canUseCommunicationACW","canAgentRequestACW","useCommunicationACW","isAfterCallWorkCompleted","communicationMedia","communicationObj","isCommunicationAfterCallWorkCompleted","isCommunicationAfterCallWorkRequested","isAfterCallWorkMandatory","wrapupPrompt","isAfterCallWorkForcedTimeout","prompt","isAfterCallWorkTimeout","isNonDiscretionaryCompletion","isWrapupPromptAgentRequested","hasMissedTimer","MACHINE_PARTICIPANTS","CUSTOMER_PARTICIPANTS","MEDIA_TYPES","isCustomerParticipant","participant","isMachineParticipant","isAgentParticipant","isCurrentUserOrMachineParticipant","hostParticipant","customerParticipants","agentParticipants","otherParticipants","otherConnectedParticipants","isDisconnected","isMonitored","monitoredParticipantId","isCoached","coachedParticipantId","isBarged","bargedParticipantId","allHumanConnectedParticipants","allConferenceParticipants","connectingQueue","participantForCustomer","consultParticipantId","trueCustomerParticipant","participantCaller","customer","_findLast","isCurrentUser","isExternalCustomer","isInternalCustomer","nextConnectedParticipant","customerParticipant","_acd","getTrueCustomerIfMultipleCustomersExist","activeParticipantIds","externalContactId","participantsForCurrentUser","participantUserId","getFirstStuckParticipant","currentUserParticipants","stuckParticipant","hasActivePrimary","_doesParticipantHaveActivePrimaryMedia","hasActiveSessionShare","_doesParticipantHaveActiveSessionShare","participantForCurrentUser","lastAlertingParticipant","lastNonDisconnectedParticipant","lastCurrentUserNeedingWrapup","wrapupRequired","wrapup","_last","participantsForACD","participantForQueue","dialerParticipant","transferringToParticipant","activeTransfer","destination","PROVIDER_MEDIATYPE","aggregateMedia","screenShares","cobrowsesessions","videos","mediaObj","allMedia","getMediaObject","mediaArray","mediaWithlatestConnectedTime","_maxBy","connectedTime","unix","mediaWithlatestDisconnectedTime","disconnectedTime","maxConnectedTime","maxDisconnectedTime","activeMedia","isAfter","sessionShareCode","isSessionCodeRequired","isSessionSharing","isRequestingEndSessionShare","sessionShareDisconnectTimer","sessionShareExplicitlyInitiated","sessionShareActiveOnLoad","isCobrowseV2Disconnected","isCobrowseV2","canScreenShareOnCall","canScreenShareOnChat","canCobrowseOnCall","canCobrowseOnChat","isRequestingScreenShareOrCoBrowse","isRequestingVideo","sessionShareState","customerShareState","hasSessionShareCode","sessionShareActive","isRequestingSessionShare","isSessionShareConnected","isSessionShareDisconnected","isCustomerInSessionShare","isCustomerDisconnectedFromSharedSession","isAgentDisconnectedFromSharedSession","isWaitingForAgentToConnect","isWaitingForCustomerToConnect","hasCustomerJoinedSessionShareRoom","hasAgentJoinedSessionShareRoom","sessionShareRoomJid","_jidHelpers","isRoomJid","mostRecentAgentSessionShare","mediaObject","mostRecentCustomerSessionShare","sessionShareType","canScreenShare","canCobrowse","mediaTypeIsScreenShare","mediaTypeIsCobrowse","mediaTypeIsVideo","isScreenShare","isCoBrowse","isVideoShare","hasScreenSharePermissionError","hasCobrowsePermissionError","hasVideoPermissionError","hasShareError","sessionShareConnectedTime","sessionShareDuration","_privacyStatement","_securityDisclaimer","transition","BatchDataRequestsMixin","batchDataRequests","refreshUser","getChatUser","getGroup","useChatBetaCleanUp","initRoomCaching","getChatRoom","objectId","getEntityObjectId","isPersonJid","passedInJidIsPerson","isSupervisorJid","closeActiveRoom","personRoom","ChatRoom","rooms","setupRoomContextV2","setupRoomContext","roomMuted","addChatTargetAsParticipant","isGroupJid","loadGroup","addParticipantToRoom","loadRoomSubject","getStreamingRoomInfo","subject","updateRoomSubject","addRoomToCache","addAllParticipantsToRoom","participantJids","cachedParticipants","cachedParticipant","cachedParticipantJid","removeParticipantFromRoom","_keepOnlyChanged","imageRegex","timeStampRegex","audioRegex","giphyRegex","imgurRegex","youtubeRegex","vimeoRegex","ghGistRegex","ghRepoRegex","twitterRegex","googleSlidesRegex","soundcloudRegex","getImageShortName","pattern","parseTimeStamp","timeStamp","mediaItems","giphies","audios","gists","repos","tweets","googleSlides","soundcloud","union","getLinks","gifv","webm","mp4","identifier","youtubeLinks","videoUrl","vimeoLinks","modelData","GithubItemModel","gist","githubRepos","repo","tweetId","tweetInfo","tweet","acdChatUser","isYou","compareJids","isAcdChatUser","chatUserId","acdChatUserId","isLastMessage","messageTime","displayDateRelativeToToday","messageDisplay","correction","isCorrection","ChatEvents","Evented","initialDataLoaded","historyDirty","handleHiddenRooms","hiddenRooms","useChatSyncFix","MessageNotificationsMixin","sendMentionNotification","shouldShowMentionNotification","roomName","getRawDisplaySubject","soundId","getNotificationVolume","notificationOutputDeviceId","getNotificationOutputDeviceId","sendNotification","shouldShowNotification","messageBody","showPopup","playSound","getNotificationTitle","widgetType","rawMessage","sendEngageNotification","clickHandler","severity","isBusyUser","isDuplicate","duplicate","targetRoomIsMuted","isSupervisorRoom","messageAlreadySeen","fromLoggedInUser","groupNotificationsEnabled","coveredByMessageNotification","chatUser","personName","sendTestNotification","messageDelayDefault","messageDelay","maxDelay","_splitOverSizedMessage","messageQueue","_convertSplitMessagesToWidgets","uuid","stanza","sendSplitMessageQueue","_delayedMessageSender","unsentMessageQueue","_addFailedMessagesToRoom","splitWidget","_manuallyCreateStanzaForFailedMessage","ChatMessage","widget","sendError","checkForMentions","setMessageReadState","addMessage","childName","childPayload","findMessageById","messageId","messageCache","pendingMessage","pending","failedMessage","splitMessageData","splitMessageParent","splitMessageCache","sendMessageToRoom","chatService","oneToOneRoom","presenceSubscriptionCounter","chatField","chatStatus","hasChatStatus","hasMedia","mediaInfo","listener","hasMediaInActiveChatRoom","ClickOutsideMixin","_webrtcConversationAnalysis","acdNormalizedMessages","callsUri","communicationUri","createCommunicationUri","communicationsUri","participantId","mediaId","participantUri","communicationsByTypeUri","consultUri","disconnectMediaTypeUri","getConversationUri","mediaRequestUri","monitorUri","participantsUri","participantDetailsUri","participantWrapupUri","sessionShareCodeUri","expireSessionShareCodeUri","securityKey","participantWrapupCodesUri","participantCommunicationWrapupUri","communicationId","replaceUri","getQueryStr","scheduleCallbackUri","tagsUri","wrapUpUri","wrapUpCodesUri","messagesUri","sendChatMessageUri","conversationId","sendTypingUri","sendMessagingTypingUri","draftUri","draftAttachmentUri","smsUri","smsHistoryUri","smsMessageDetailUri","smsMessageBatchUri","sendSMSMessageUri","createMediaAttachmentUri","getMediaAttachmentUri","copyMediaAttachmentUri","requestACWUri","interactionId","agentCommunicationId","getSupportedContentUri","getDeploymentConfigUri","deploymentId","getSupportedContent","getIntegrationConfigUri","integrationId","getConversationSummaryFeedbackUri","summaryId","arrayParameterCollection","forIn","answerChat","defaultLogLevel","makeRequest","logRequest","correlation","logLevel","captureRequest","resolveRequest","isSuccessResponse","groupName","groupTypeDefault","groupVisibilityDefault","groupMembershipDefault","groupModal","nameLengthExceeded","creatingGroup","visibility","vis","rulesVisible","newPublicApiGroupData","canCreateGroup","isAdmin","adminGroup","groupTypeI18nLabel","newGroupTypeChoices","lookupType","groupVisibilityI18nLabel","newGroupVisibilityChoices","_deviceEnumeration","messageEvent","messageOptions","triggerMessageAction","messageHandlers","lastUploadedImage","editingPictures","viewingGallery","cancelEditProfilePicture","cancelUpload","cancelEditPictures","viewLightGallery","cancelViewLightGallery","setInitialFieldSections","excludedSections","getReadableSections","WebrtcActionUtils","getProvidersForUser","isPresence","presenceMap","definition","apiValue","presenceMapping","systemPresence","presenceService","outOfOffice","acdDivisionPresenceProfileToggle","primaryPresence","presenceList","currentPresenceSource","integrationPresence","currentPresence","existingPresence","pres","presSource","existingPresenceDate","modifiedDate","activitiesPresenceDate","isExistingPresenceLatest","isGCOffline","presenceDefinition","presenceModel","presences","outOfBandPresence","outOfBandPresences","findPresence","endOfTime","primaryPresenceSource","integrationLabel","secondaryPresenceLabel","secondaryPresence","fallbackLocale","languageLabels","_i","_Object$entries","_Object$entries$_i","formattedLocale","primaryStatusMessage","cityExists","regionExists","countryExists","hasGeolocation","isAvailable","isOffline","isAway","isBusy","isOutOfOffice","isOnQueue","isOfflineOrBusy","activityPresence","activityPresenceClass","profilePictureFieldKey","agent","missingFieldsCache","EntityMixin","_currentSection","_missingFieldsCache","volatile","pictureKey","profilePictureSizes","_sortBy","_keys","_parseInt","uploadedImages","stateString","_self","_missingFields","recordPropertyChange","changedSinceSave","changedProperties","referencedField","referencedLookup","fieldArray","reference","isFieldValueEmpty","removeFieldValue","currentFieldValue","object","currentState","stateName","onSaveSuccess","onSaveError","_internalModal","internal","_internalModel","responseJSON","publicApiError","currentVersion","currentField","fieldDef","getPermissableSections","getWriteableSections","getReadableFieldsForSection","getWriteableFieldsForSection","deleteField","del","EvaluationsMixin","evaluationsAjax","getEvaluations","agentEvaluations","evaluatorEvaluations","assigneeEvaluations","agentId","evaluationState","userType","isAssigneeFeatureEnabled","isDisputesFeatureEnabled","evaluatorUri","agentFinishedUri","agentInReviewUri","assigneeUri","evaluatorRequest","requestAgentFinished","requestAgentInReview","requestAssignee","_ref$entities","evaluation","changedDate","calibration","dateAssigneeChanged","assignedDate","linkContext","EvaluationModel","_ref2$entities","releaseDate","_ref3$entities","_ref4$entities","evaluationIdSet","resultData","totalResult","queryResult","readEvaluation","evaluationIsAdminContext","externalContacts","externalContactProfiles","consultAgentParticipant","consultParticipant","hasMultipleExternalContactMatches","isIncomingFromExternalContacts","isConnectedWithExternalContact","hasExternalContactProfiles","hasOneExternalContactProfile","_nameForInheritor","componentClassName","externalContactFullName","FaxesMixin","getFaxes","fax","FaxModel","readFax","changeFaxReadState","contentUri","sharingUri","contentLocationUri","markFaxesRead","faxes","markFaxesUnread","renameFax","deleteFaxes","deleteFax","downloadFax","allFieldData","showLabel","savingField","attachObserversForComplexFields","fieldTypeClass","notifyComplexPropertyChange","performNotification","didFlag","flagOperationInProcess","flaggedSelves","myParticipants","myGuid","myFlaggedParticipants","flaggedReason","allowFlagChange","minutesPassed","flagCallHistoryInteraction","customerBrowserDetails","customerDetails","isChrome","isEdgeChromium","hasChromeExtension","isStandAloneApplication","canScreenshare","cobrowseType","isCustomerConfiguredForCobrowse","isCustomerConfiguredForScreenShare","screenShareMisconfiguration","cobrowseMisconfiguration","canCobrowseChat","canCobrowseCall","isAgentAllowedToCobrowseCall","isAgentAllowedToCobrowseChat","isAgentAllowedToCobrowse","isAgentAllowedToScreenShareCall","isAgentAllowedToScreenShareChat","isAgentAllowedToScreenShare","sessionShareStartVideoTooltip","sessionShareStartTooltip","canScreenShareViaHawk","webMessagingCobrowseStartTooltip","disableShareButtonReason","isConfigured","disableVideoButton","disableShareButton","shouldShowSessionShareButton","enableAcdSessionShare","isInternalProvider","acdVoicemailTooltip","holdTooltipTitle","muteTooltipTitle","scriptToolTip","skipACWTooltipTitle","currentJobs","finishedJobs","_currentJobs","_finishedJobs","_logger","errorState","cachedTotal","loadPage","prevPage","decrementProperty","ensureCorrectProperties","currentPageDisplay","hasNextPage","hasPrevPage","haveContent","letterUpdate","letter","directory","isHeld","isMuted","isRecording","isActiveCallACD","isOutsideCall","myself","onCall","setActiveCall","cleanupActiveCall","headset","webrtcSdkService","attemptingToCall","shouldPromptForMerge","callToMergeInto","mergeData","deviceMuteEvent","mute","deviceHoldEvent","holdRequested","hold","deviceCallRejectedEvent","sendToVoicemail","enableHeadsets","changeHeadsetSource","headsetSource","callVoicemail","_handleValidationError","webrtcPhoneWithIssues","_validateCall","callingPerson","onbehalfOfQueue","noStation","_throttledHoldOtherConversations","_holdOtherActiveConversations","_makeCall","formatSipAddress","callFromQueueId","showErrorNotification","startSoftphoneSession","updateActiveConversationEntry","outgoingCall","callArgs","callPersonById","mergeCalls","conversations","callsToMerge","conferences","conversationIds","recordings","makeMergeRequest","toVoicemail","_throttledHandlePhoneStatusChange","_args3","handlePhoneStatusChange","endCall","clearMergeData","makeConferenceCall","parties","bulkAddParticipants","blindTransfer","isNumber","myselfId","participantEntity","isQueue","_handleCallTransferred","conversationsMadeByClient","placedConversation","consultTransfer","currentCallId","otherPartyId","initiateTransfer","addressee","changeSpeakerForConsult","speakTo","otherParty","endConsult","generateConversationsUrl","dialDtmfNumber","digits","_throttledAnswerWebrtc","_answerWebrtc","_throttledAnswer","_answer","_throttledAnswerSoftphoneConversation","acceptPendingSession","answerSoftphoneConversation","_findPendingSessionsByConversationId","validateActionSucceeded","checkForNonACD","_throttledMute","_mute","setMute","skipHoldAll","_held","held","otherConversations","otherConversation","_throttledHeld","_callee8","_context8","setHold","_throttledRecord","_callee9","_context9","_record","_this14","flagActiveInteraction","_this15","isFlagged","_makeFlagChange","_this16","endCallForAll","endCallById","_throttledEndCall","_callee10","_context10","_endCall","_throttledEndCallForAll","_callee11","_context11","_endCallForAll","_this17","_callee12","_context12","conversationWithError","removeConversationFromConversations","_endWebrtcCall","_this18","_callee13","_context13","conversationType","webrtcConversationTypes","SOFTPHONE","notAfter","_throttledEndWebrtcCall","_callee14","_context14","endConversation","_this19","generateConversationUrl","callbackConnected","generateCommunicationUrl","handleOtherParticipantStatusChange","_this20","callForwardingActive","callForwardingNumber","callForwardingExtension","fetchCallForwarding","getCallForwarding","_updateCallForwarding","hasPhoneNumber","_contactObservers","activeConversations","onMultipleCalls","activeAcdCalls","conv","callState","webrtcConversation","getConversation","callIsAlreadyConnnected","hasPendingSession","webrtcSessions","atLeastOneWebrtcConversation","isDefinedAndLengthGreaterThan","activeNonAcdCalls","connectedConversations","dialingOrContactingOrAlertingConversationsToProceed","thisClientMadeTheCall","waitingForSession","recentTransfers","thisBrowserIsTheOneToAnswerFrom","isDialing","isOutbound","disconnectedConversations","eligibleCallsToMerge","onConference","thisCallIsConference","_handleActiveConversationsUpdates","_throttledHandleActiveConversations","handleActiveConversationsUpdates","hasActiveCall","connectedNonAcdCalls","dialingOrIncomingConversation","newActiveCall","activeCallOngoing","dialingOutboundConversations","hasOutboundConversation","activeCallErrors","errorInfo","hasIncomingConversations","_setHasIncomingConversations","hasActiveNonAcdCalls","incomingConversations","incomingNonAcdConversations","isOnConnectedCall","mostRecentlyConnectedConferenceCalls","isConferenceCall","isConnectedCall","myTime","onlyConnectedConversations","recentDisconnectedAgentCalls","isAgentCall","recentDisconnectedNonAcdCalls","userCallSessionsWithErrors","_shouldRemoveNonAcdConversation","conversationMarker","conversationsToRemove","callErrorToRemove","conversationModelTemp","ConversationModel","_throttledRemoveDisconnectedConversations","_removeDisconnectedConversations","participantOnUpdatedConversation","conversationHasErrors","conversationMadeByClient","conversationAcceptedOnClient","conversationWasMadeOrAcceptedOnClient","participantsForUser","updatedParticipantCall","getParticipantCall","conversationWasTerminatedNotDisconnected","disconnectedCalls","timeOutToRemove","stationIsWebrtc","thereArePendingSessions","_debouncedRemoveConversationFromConversations","thereIsAConnectedConversation","updateConversationArray","conversationDetails","conversationExists","monitoredConversationsForErrors","nonAcdCalls","usersCallSessions","callSessions","participantIsUserAgent","participantIsCurrentUser","userParticipant","callsWithErrors","disconnectReasons","thereAreDisconnectReasons","re","disconnectErrors","disconnectTypeIsError","disconnectType","ERROR_WHITE_LIST","registerCPTopics","topics","_updateStationEvent","conversationData","currentCallState","participantOnExistingConversation","participantCall","participantOnCall","participantIsNotVoicemail","isActiveOnCall","newCallState","answerCall","_logConversationDetails","_updateModelForConsult","IGNORED_ERRORS","useNotificationProfileOutput","displayIncomingNotification","notificationOptions","fallbackToInBrowser","EVENTS","handleParticipantCallError","endMoment","isRecent","hasThrownError","showSipError","messageText","phrase","translateServerErrors","messageParams","messageWithParams","fetchStation","stationId","newCode","showFeedbackErrorNotification","showNoStationSelected","isAcdCall","ringerVolume","ringing","shouldRing","enableAlertablePresencesOverrides","features","getAlertRingTime","conversationToDisplayNotification","alertTime","groupRingId","getGroupAlertTime","getUserAlertTime","alertTimeoutSeconds","debuggerLog","needStation","updateStationEventTimeout","freeSeatPreference","isSelfStationFT","noStationSelected","defaultStation","associatedStationNotDefault","defaultStationNamePromise","selectedStation","guidFromUri","disassociateStation","disconnectPersistentConnection","endAllSoftphoneSessions","chooseDefault","chooseStation","doLoginAssociationLogic","isFreeSeatOrg","_loginAssociationFreeSeat","_loginAssociation","doLogoutAssociationLogic","associatedStation","lastAssociatedStation","lastAssociatedUser","defaultStationUser","userStationSettings","stationType","successHandler","errorHandler","eventBody","_debouncedUpdateStationEvent","_handleUpdateStation","metadata","newStation","newStationId","currentStationIsNewStation","stationUri","_testIsStationWebrtc","PurecloudModelMixin","hasRelateAccess","canShowCustomFields","contactRoute","queueSearchRequest","requestArray","queuePermission","relatePermission","queueSearchData","searchIntegrationKey","queueSearchQuery","userRequest","resultArray","userIds","performTagSearch","searchQueue","searchQueueOnly","searchOnEmpty","pendingSearchRequest","currentSearchRequest","TagSearchMixin","tagSearchQuery","tagSearchRequest","tagSearchResults","HelpMixin","_performHelpSearch","excerpt","performHelpSearch","TIMEOUT","PrepareResults","parsedResults","retrySearch","searchUser","searchRelate","userSearchFailed","queueSearchFailed","relateSearchFailed","userPending","queuePending","relatePending","queueResults","relateResults","debouncedSearch","performReload","searchQueues","searchUsers","userRequests","queueRequests","relateRequests","leading","trailing","presenceToRadixMapping","available","busy","away","idle","offline","on_queue","out_of_office","radixMapping","mapUserToSortable","userName","mapRoomToSortable","radix","SortChatUsersMixin","sortChatUsers","usersList","sortOneToOneRooms","_styleNamespacingExtras","getScrollParent","comp","enableViewport","enteredViewport","rect","windowHeight","windowWidth","bottom","exitedViewport","_teardown","_setup","_bindEvents","_updateBoundingClientRect","innerHeight","documentElement","innerWidth","clientWidth","scrollParent","scrollParentRef","windowRef","$scrollParent","resizeHandler","scrollHandler","getBoundingClientRect","_updateWindowSize","_scrollHandler","requestAnimationFrame","_resizeHandler","streaming","sessionService","_fixTooltips","videoTooltipTitleSr","numberOfParticipants","oneToOneChat","webrtcTarget","videoMediaProviders","haveNonPurecloudMediaProvider","videoTooltipKey","videoButtonEnabled","_annotation","eventType","_assign","customPayload","typeOf","PROTOCOL_FIELD_NAME","OUTBOUND_MSG_EVENT_TYPE_FIELD_NAME","currMetadataFieldName","messagePayload","requireProtocol","API_ACTION_FIELD_NAME","actionDetails","PROTOCOL_AGENT_FIELD_NAME","PROTOCOL_AGENT_VERSION_FIELD_NAME","fieldToPrune","AppApiCall","protocolAgentName","protocolAgentVersion","internalPcCall","srcApp","srcAppInstance","AppState","ordinal","compareTo","anotherState","getPrototypeOf","APP_STATES","LOADING","BOOTSTRAPPING","RUNNING","STOPPING","STOPPED","LIFECYCLE_HOOKS","BOOTSTRAP","FOCUS","BLUR","STOP","APP_LIFECYCLE_CALLBACKS","BOOTSTRAPPED","APP_UPDATED","APP_DELETED","LICENSE_UNAVAILABLE","STATE_CONFIGS","_STATE_CONFIGS","lifecycleDetails","maxDurationMillis","stateOptInPropName","broadcastHookName","appCallbackEventName","LIFECYCLE_ORDERED_APP_STATES","currStateName","state1","state2","AppInstance","instanceId","currState","_currStateStartTimestamp","problem","lastUserAccessTimestamp","_stateTimeoutTimer","attentionCount","guidFor","reportStoppedInteraction","_inAppInteraction","_appendAppInteraction","_startAppInteraction","_advanceState","loaded","bootstrapped","_triggerLifecycleHookEvent","stopped","setProblem","requestedState","requestedStateConfig","nextState","_getNextState","_convertStateToLifecycleEvent","_logInactiveAppStopped","hook","_monitorTransitionalState","currStateConfig","currStateEntryTimestamp","maxDuration","timeInState","currStateIndex","_interactionStartTimestamp","_latestInteractionTimestamp","lifecycleEvent","startTimestamp","_logAppInteraction","interactionStart","interactionDetails","timeSinceInteractionStart","timeSincePrevInteraction","interactionEnd","interactionDuration","commonAttrs","pcAppTypeId","pcAppId","pcAppInstanceId","pcAppDisplayType","pcAppInternallyHosted","InternallyHostedApp","pcAppFeatureCategory","pcAppProblemName","getURLTemplateQueryParams","queryParam","appState","POOL_STATES","IDLE","APP_NOT_FOUND","ALLOCATING_SPACE","SHOWING_APP","ALLOCATION_FAILED","LOAD_FAILED","AppPool","poolName","getMaxActive","fetchAppsFn","loadRetryBaseMillis","loadRetryMaxBackoffMillis","reloadAppsIntervalMillis","reloadAppsRetryBaseMillis","stoppedInstanceRemovalInterval","renderedAppInstances","_loadAppsPromise","_showFailureRestoreAppId","_loadRetryAttempts","_loadRetryScheduled","_reloadFailureCount","skipLongRunningTasks","appAttentionCounts","counts","runningInstances","_searchInstances","maxState","currInstance","totalAttentionCount","_apps","_renderedInstances","_fetchFailureLog","abortedCount","endpointFailureCount","instances","findAllApps","_loadApps","showApp","_findApp","_this3$_searchInstanc","_this3$_searchInstanc2","existingInstance","_setState","_allocateNewInstance","hideApp","_this4$_searchInstanc","_this4$_searchInstanc2","runningInstance","stopApp","_this5$_searchInstanc","_this5$_searchInstanc2","_monitorAppLifecycles","reloadApps","_reloadApps","internalLoadRetry","__fetchApps","latestApps","mergedApps","newApp","_isEqual","APP_PROBLEMS","currNewApp","_findIndex","loadResult","restoreAppId","_logPoolEvent","forceReload","autoLoadRetry","loadRetryAttempt","autoAttempt","_scheduleAppReload","autoRetry","loadRetryScheduled","_retryInitialAppLoad","retryBase","retryAttempts","retryInterval","maxRetryDuration","_loadRetryTask","timeoutVal","abortedAttempts","endpointAttempts","_decorateLogStatement","reloadInterval","reloadWait","reloadFailureCount","_reloadTimerTask","finish","typeOfApps","isAjaxError","isAbortError","pendingInstance","_allocateSpace","renderedInstances","existingInstances","sortedInstances","instanceToEvict","evictedAppId","_ref$instanceId","_ref$appId","_ref$states","_ref$maxState","instanceState","currInstanceState","specificInstance","_removeStopped","_monitorAppLifecyclesTask","stoppedInstances","logText","poolEvent","poolEventDetails","poolState","maxPoolSize","renderedApps","primitivePoolStateDetails","_omitBy","poolStateDetails","_reduce","_merge","Copyable","LIFECYCLE_DEFAULTS","ephemeral","hooks","bootstrap","STANDALONE","WIDGET","INTERAPPTION","DIRECTORY","CONTACT_CENTER_INSIGHTS","LANG_TAG_URL_REPLACEMENT_TOKEN","PC_ENV_URL_REPLACEMENT_TOKEN","PC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN","USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN","GC_LANG_TAG_URL_REPLACEMENT_TOKEN","GC_INTERACTION_ID_URL_REPLACEMENT_TOKEN","GC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN","GC_INTERACTION_TYPE_URL_REPLACEMENT_TOKEN","GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN","GC_HOST_ORIGIN_REPLACEMENT_TOKEN","GC_TARGET_ENV_REPLACEMENT_TOKEN","TOKEN_REPLACEMENTS","_TOKEN_REPLACEMENTS","queryParamName","replacementProp","replacementValue","interactionType","URL_REPLACEMENTS","replacementToken","_ref2$","regExp","INTERAPPTION_PRIMARY_MEDIA_TYPE_FILTERS","INTERAPPTION_MESSAGE_SUB_TYPE_FILTERS","INTERAPPTION_COMMUNICATION_TYPE_FILTERS","typeId","urlTemplate","langTag","envTld","usePopupAuth","displayType","featureCategory","permissionsPolicy","enabledQueueIds","enabledCommunicationTypes","gcHostOrigin","gcTargetEnv","currReplacement","rawValue","appUtils","buildLogMsg","deep","ownerMixin","sandbox","cloneDeep","assets","lifecycle","_callCommunication","Model","isExternalVoicemail","_callbackCommunication","hasSipErrors","codes","sipResponseCodes","conversationParticipants","conversationParties","missedCall","wasConference","wasCallback","wasOutboundCampaign","wentToVoicemail","callStart","sentToVoicemail","reachedVoicemail","callEnd","isMultiParty","allParticipants","myParticipant","nonVoicemail","me","internalParticipants","monitoredCallId","externalParticipants","ani","stationParticipants","voicemailParticipant","ivrParticipants","queueParticipants","otherParties","partyFromConversation","callParties","dnis","initiator","outboundParticipant","external","inboundExternal","disconnectReason","disconnectTypeKey","isIvrTransfer","isOutboundCampaign","isBlindTransfer","isConsultTransfer","isPersonalVoicemail","isQueueCall","invalidNumber","groupRingParticipant","isGroupRing","isOutboundGroupRing","groupRingGroup","backgroundReload","groupRingCaller","loadConversation","personParticipants","_chatCommunication","ChatMessageMedia","ChatMessageMixin","corrects","hasMentionLinks","unread","startOfBlock","endOfBlock","isYourLastMessage","splitMessageIndex","determineMessageEditability","isSplitMessage","isEditable","editableEndTime","meAction","startEditing","stopEditing","originalWidgetType","isEditableTimeout","animateChatIcon","rawSubject","pendingRoom","firstMessageTime","lastMessageTime","lastMessageTimeRadix","roomClosedTimeRadix","mentions","unseen","messageActivity","userActivity","loadingHistory","moreHistoryAvailable","moreForwardHistoryAvailable","activated","acdCustomerParticipant","inputCache","isInRoster","participantsVisible","invited","joinCallImmediately","joinScreenshareImmediately","deferredParticipants","roomOwners","setupProperties","authenticatedUserIsRoomOwner","resizeNewPopout","popout","resizeTo","moveTo","videoConversation","videoRoomFull","haveId","haveName","isApiFieldConfigName","mapCanRemoveParticipant","participantList","isMember","isRoomOwner","sortedParticipants","skipGroupDataCheckEnabled","isAdhocRoom","isAcdRoom","isAcdJid","isSoftphoneRoom","isSoftphoneJid","isOneToOne","allowUserRemoval","processRoomDetails","haveGroupData","clearMessageCache","pruneMessages","removeCachedItemsCount","takeRight","reconcileMessages","addHistoryMessages","processHistoryModels","filterSeenMessages","addSelfReference","insertHistory","sortChatMessages","processCorrections","processSplitMessageHistory","markConversationBlockBoundaries","updateFirstUnread","updateMessageTimes","bumpActivityCount","historyMessages","unshiftObjects","splitMessage","processSplitMessage","correctedMessage","m","shouldGroupMessages","splitMessageParentExists","SplitMessage","splitMessageId","addSplitMessage","msgId","isSupervisor","isAcd","lastMessage","yourLast","isBefore","oldMessage","newMessage","updateMessageTimeRadix","updateClosedTimeRadix","addParticipant","removeParticipant","clearUnreadMessages","isUserInRoom","userjid","clearPending","existingMessage","setSendError","addDeferredParticipant","loadDeferredParticipants","audioMuted","videoMuted","sharingScreen","major","domId","hasConnected","inLastN","screenStream","isV1","startedVideoMuted","associatedInteraction","zeroBitrateCount","positiveBitrateCount","noVideoTrack","speaking","mediaPresence","_getInteractionAvatarDisplay","showAvatar","noVideo","avatarDisplay","hasOfflinePresence","connectionStatus","canBeMuted","markedAsRead","actionType","dateStart","lengthInMinutes","appointment","isOverdue","maybeLowerCase","ExternalContactsMixin","maxParticipants","acwNotes","conversationIsAConsult","conversationInitiator","lastPartyTalkingTo","webrtcSession","hasDisplayedDesktopNotification","acceptedByClient","dialingTime","otherPartyJid","setOtherPartyJid","isOtherPartyPerson","connectedDuration","iAmInitiatorOfConsult","otherPartyThatIsNotTheInitiator","partyId","initiatorId","otherParticipantsThatAreNotTheInitiator","aniName","otherPartyThatIsNotTheInitiatorModel","_conversation","userGuidFromParticipant","setLastPartyTalkingTo","connectedParties","lastPartyTalkingToModel","consultOtherParty","initiatorModel","initiatorCall","initiatorConnected","otherPartyThatIsNotTheInitiatorCall","otherPartyThatIsNotTheInitiatorConnected","consultOtherPartyModel","participantModels","communication","isTerminated","isNotSelf","otherPartyModel","personFromStore","otherPartyNumber","doLookup","notTerminatedOrDisconnected","isMonitor","isCoach","isBarge","disconnectedParties","sortedDisconnectedParties","lastDisconnectedPartyModel","selfIsDisconnectedOrTerminated","myState","useDisconnectedParties","allParties","connectedOnConsult","confined","firstCall","sortedParties","callStateA","callStateB","arePartiesDisconnected","recomputeParties","otherDisconnectedParty","isConsult","isOngoing","isStation","isIvr","otherPartiesNoEndTime","otherDisconnectedPartyModel","isDisconnectedQueueCall","setConsultInitiator","nonInitiatorNumber","myConsultId","consultParty","nonInitiator","hasActiveAgent","isMe","isAgent","needsWrapup","isUser","isAlerting","myselfIsMonitor","myselfIsCoach","myselfIsBarged","bargedParticipant","myselfIsMCB","monitoredParticipant","coachedParticipant","monitoredParticipantPerson","coachedParticipantPerson","bargedParticipantPerson","isSelfMCB","peerDisconnectedCall","myselfDisconnectedCall","errorInfoMessage","isIncoming","isRinging","isDialingOrContacting","isContacting","justMyselfOnCall","iAmContacting","theOtherPartyWhileContacting","isMissed","segments","howEnded","lowType","endedWithDisconnect","isConfined","voicemailParties","isConnected","onConsult","others","consultParties","found","markCallAsConsult","consult","canUpdateConsult","consultInitiator","mostRecentEndTime","groupParticipant","currentTimestamp","_groupRingCaller","actualCaller","caller","connectedToStationAndNotConference","anotherPartyIsStation","isStandaloneStation","anotherPartyIsVoicemail","connectedMedia","conversationHasActiveSessionShare","hasActiveMedia","_emailCommunication","TranslationModel","addTranslation","getValue","agentHasRead","evaluationForm","evaluator","redacted","rescore","conversationDate","assignee","declinedReview","displayThumbnail","organization","channelIdProperty","isNewChannel","changesIgnoredByAgent","agentRespondedToPrompt","screenName","channelId","PreferredPhoneContactOrder","PreferredEmailContactOrder","schemaService","schemaType","externalDataSources","externalOrganizationId","createDate","modifyDate","firstName","middleName","lastName","workPhone","cellPhone","homePhone","otherPhone","workEmail","personalEmail","otherEmail","twitterId","lineId","facebookId","whatsAppId","surveyOptOut","schema","customFields","contactType","mergedTo","mergedFrom","canonicalContact","mergeSet","isCurated","isIdentified","canonicalId","divisionName","isCanonical","externalOrganization","belongsTo","externalSystemUrl","createdDate","lastUpdated","hasEmailAddresses","address1","address2","postalCode","twitter","isSalesForce","phoneName","featureKey","featureKeyExt","featureKeyAcceptsSMS","initials","bestEmailAddress","preferredEmailType","_bestEmailType","bestEmailType","bestPhoneNumber","_bestPhoneType","bestPhoneNumberDisplay","bestPhoneType","bestPhoneTypeKey","hasEmailAddress","externalDataSourcesAlert","externalDataSource","platform","salesforceLink","expandedSchema","getSchema","schemaTitle","schemaData","getSetter","websites","isOrganization","companyType","industry","primaryContactId","faxNumber","employeeCount","revenue","tickers","hasMany","website1","website2","Channel","dateCreated","dateModified","workspace","createdBy","contentLength","filename","thumbnails","callerAddress","receiverAddress","isDefaultName","faxName","faxFrom","faxFile","longitude","latitude","ISSUE_REGEX","showEmbedConfirmation","getPreference","showEmbed","isRepo","isGist","isIssue","issueNumber","issue","embedString","shouldEmbed","onSettingsChange","setEmbedPreference","pref","embed","setPreference","disableEmailPii","includeEmailTranscriptions","languagePreference","BASE_GROUP","COMPARATORS","EqualTo","NotEqualTo","GreaterThan","GreaterThanOrEqualTo","LessThan","LessThanOrEqualTo","PROFICIENCIES","acdSkills","lastSavedExpression","isDynamicGroup","_expression","groupTypeValue","actualType","profilePictureURL","activeProfilePicture","x128","placeholderImageForSize","uploadedProfilePictures","uploadedInformalPhotos","areOwnersIncluded","groupEmailAddress","membershipSearchQuery","compiledQuery","generalSearchQuery","isDeleted","allowPermissionGroup","uniqueRoleCount","grantVersion","rolesMap","emailNotificationEnabled","voicemailEnabled","membershipChange","guidOwner","setIdForGroupEntity","existingId","idParts","individual","guidIndividual","ownerIds","profileImageSection","profileImage","deleteGrant","conOp","newCondition","newSkill","languageSkill","routingSkill","subdomain","getPcApplicationsSubdomain","currentDomainName","LibraryModel","responses","BASE_LOCATION","LocationModel","imageHistory","contactPersonId","sublocationOrder","floorplanImage","floorplanImageHistory","profileImages","imagex48","imagex96","imagex128","imagex200","x48","x96","floorCount","subs","isFloor","deleted","hasContactPerson","contactPerson","floorplan","_parent","containsRichAddress","setFloor","roomId","organizer","attendees","notifyAttendees","recurringType","meetingAttendees","_messageCommunication","shortName","hasUnifiedCommunications","comms","hasChatEnabled","hasHipaaEnabled","hipaa","orgDefaultCountryCode","orgPreferences","parsedPreferences","_participant","permissionRoutes","updates","sectionValue","clearProperties","changedKeys","originalKeys","fieldKeys","pathKey","contactCenterCount","enterpriseCount","Internal","InternalModel","setupData","hasRecord","_changedKeys","_data","isReloading","pushedData","_notifyProperties","didInitializeData","ChatUserMixin","EntityPresenceMixin","_readWritePermissions","_directReports","_siblings","_superiors","roleIds","expands","_activities","activities","_activityCall","_activityCallback","_activityChat","_activityWebChat","_activityEmail","showConversationSummaryIndicator","onProfilePage","totalCallbacks","totalWebChats","activityValues","email_main","integrationPhone","otherPhones","agentName","socialGroups","getGroupsByType","officialGroups","distributionGroups","ownedGroups","managerId","managerSiblings","groupedOtherRelationships","persons","personEntry","adminAssistants","cachedData","cachedIds","sameIds","_loadingSuperiors","directReportCount","cachedReports","attemptedToLoad","dataDiscrepancy","noDirectReports","doNotLoad","cachedIsSame","isEqual","_meta","isContentUser","isContentAdmin","isNotBusy","isCommunicateUser","updatePermissionsOnRouteChange","personDetailController","setPicture","setAgentPicture","imageSection","membershipIds","memberships","getFieldPathForFieldValue","actual","fieldType","filteredEntries","uniq","filteredPaths","_presence","primaryContactInfo","addresses","authorization","fieldConfigs","token","isTrustee","isCloned","userState","inviteLastSent","QueueModel","outboundMessagingAddresses","outboundEmailAddress","directRouting","cannedResponseLibraries","recordingRetryCountMap","callerName","durationMilliseconds","userRecordingDownload","mediaUri","fetchAudio","callRecordingUri","resultUri","resolver","pollingTimeout","apiName","userRecRetryCountKey","userRecRetryCurrent","recordingUri","_type","ResponseModel","texts","substitutions","responseType","messagingTemplate","isOpen","libraryName","isWhatsAppResponse","permissionPolicies","_screenshareCommunication","_socialCommunication","messageArray","mentionRegex","mention","failedMessages","StationModel","webrtcMediaDscp","webrtcForceTurn","persistentConnection","webRtcUserId","webRtcCallAppearances","webRtcRequireMediaHelper","isWebrtc","isRemoteStation","toCheck","isGeneralUnrecoverableAppFailure","isSessionBootstrapFailure","GeneralUnrecoverableAppFailureTypes","SessionBootstrapSteps","_types","hasKey","UserModel","welcomeSent","lastLogin","clientVersions","passwordSaved","_videoCommunication","_loadEPCConversation","VoicemailMessageModel","audioRecordingDurationSeconds","audioRecordingSizeBytes","callerUser","parentIds","note","copiedTo","copiedFrom","useVoicemailApp","loadParticipants","dateFromNow","fromNow","isGroupVoicemail","groupEntity","loadEPCConversation","_userId","fetchCallerName","mutableGroupId","shiftTrade","alternativeShift","timeOffRequest","agentNotification","otherNotificationIdsInGroup","adherenceExplanation","Router","locationType","titleDivider","isAborted","resetNamespace","intent","replaceWith","didTransition","gotoRoute","UnprotectedRouteMixin","ApplicationRouteMixin","onSessionInvalidationFailure","willTransition","postMessageRouteChange","transitionToEntityDetail","linkTo","targetName","performRecentSearch","recent","isToggleEnabled","togglePanel","openPanel","closePanel","toggleCommunicationSidebarExpanded","ensureRouteVisibility","openChatRoom","startChatByJid","_arguments","launchVideoWithPersonById","startCallPersonById","startCallByNumber","originRoute","sessionAuthenticated","stateRestore","popRestoreState","sessionInvalidated","recordLogoutTime","CardDetailRoute","getUserId","person_id","isGuid","afterModel","sendPageData","helpPath","GroupDetailRoute","ModelRouteMixin","updateParentRoute","controller","group_id","currentModel","include","setupController","sidebar","IndexRoute","OAuth2LoginRoute","controllerName","authenticator","_authenticate","loadTranslations","resolvedModel","serializeRestoreState","rejectionDetails","authFailureReason","sensitive","LoginRoute","MaintenanceRoute","_unrecoverableAppFailure","_analytics","buildCommonTelemetryContext","intlService","reloadApp","_reloadApplication","EngageSupervisor","initialIntent","routing","generateURL","appsProblem","unknownApp","currAppName","appPool","app_id","buildStandaloneAppLogMsg","initPoolState","rejectionPoolState","routeAppId","targetRoute","refreshModel","redirectUrl","hashRoute","buildTag","currModel","DEFAULT_PARAMS","performSimpleKeywordSearch","suggest","queries","SEARCH_QUERY_OPERATORS","SEARCH_QUERY_TYPES","addQueries","addTagQuery","addAggregation","SEARCH_AGGREGATE_TYPES","aggregation","setPaging","setTypes","setReturnFields","Service","resourceTypes","suggestEndpoint","_searchUrl","_suggestUrl","_docUrl","searchDocumentation","normObj","_this$requestBuilder$","defaultAggregations","entityRequest","facetsRequest","aggregateResults","processFacets","performSuggestSearch","orderKeys","RequestBuilder","_extractData","included","toRemove","OUR_COOL_REQUEST_TYPES","ApplicationSerializer","RESTSerializer","isNewSerializerAPI","primaryKey","isPrimaryType","primaryTypeClass","primaryModelClass","groupKey","finalData","PurecloudSerializer","serialized","attrsToSerialize","changed","changedAttributes","JSONSerializer","convo","EMPTY_MODEL_OBJECTS","EmbeddedRecordsMixin","_normalizeContact","_getPojo","jsonProfile","normalizeDeleteRecordResponse","normalizedPayload","_fillEmptyPropertiesWithModelObjects","normalizeQueryResponse","filledEntities","contacts","externalcontacts/contacts","pageOffset","emptyModel","emptyOrgModel","EMPTY_ORGANIZATION_MODEL","getOwnPropertyNames","_fillPropertyIfNecessary","_step2","_iterator2","defaultData","payloadValue","Set","externalcontacts/external-organizations","_messageChannels","modelKeyFor","normalizeFindRecordResponse","jsonapiPayload","extractId","resourceHash","getJabberId","generateGroupLinkIds","jId","orgGuid","search_key","groupLinks","generate","cleanFields","extractSectionData","_application","filterMissingFields","normalized","requireMediaHelper","extractMeta","payloadKeyFromModelName","serializeAttribute","wordCharsRegex","nonDigitRegex","removeLeadingPlusRegex","itemToFormat","formatFieldConfigEntry","subMsgType","defaultCountryCode","getExtension","formatNumber","numberFormat","E164","addressParts","lookupAddressFormatResultId","fallback","displayText","existingRecord","resolveAddressFormatResult","isEntity","_addressFormat","formatSipAddressForDisplay","strict","formatRawNumber","RateLimitPromise","ObjectProxy","PromiseProxyMixin","isRateLimited","rateLimitResetTime","Symbol","shouldRetryRequest","retryStringToNumber","retryResetTime","headerRateLimit","AjaxService","_timers","enableRetryHeaderParsing","enableAPIDomainRewrites","trustedHosts","purecloudV2Host","_scheduleRequest","retryTime","scheduleTime","reqUrl","addApiDomainIfMissing","isRootAPIRequest","apiDomain","hostname","canParseHeaders","retryDisabled","promiseProxy","shouldRetry","_logPossibleRetryEvent","errorResponse","getAllResponseHeaders","generateDetailedMessage","urlObject","headerCorrelationId","foundKey","getHeader","payloadCorrelationId","commonCtxt","applicationVersion","uiLanguage","envName","isPopout","webDirAgent","platformJsBrowserName","PlatformJS","platformJsBrowserVersion","platformJsProduct","product","platformJsManufacturer","manufacturer","platformJsLayout","platformJsOperatingSystem","os","platformJsDescription","desktopOS","desktopVersion","BRIDGE_CONFIGURATION","deprecation","COOKIES","dragging","browserHidden","iframeFocused","urlprefix","orgspanBaseUri","purecloudBaseUri","realtimeScriptUri","hostedContext","isMobile","mobileQueryParameter","belowMobileThreshold","showLoader","trialSupportDisplayed","debugSettings","offerMobilePreference","offerMobilePreferenceRetreived","currentYear","orgShortName","checkForDebugMode","gatherEnvDetails","initIframeFocusListener","setVisibilityListener","sendEventToDesktop","hasRecentlyLostSubscriptions","_registerTopics","currentRouteClass","deprecatingAlias","systemLocale","setLocale","hidden","visibilityChange","mozHidden","msHidden","webkitHidden","pigeonUserSubscribed","loadStreamingService","authenticated","scriptUri","streamingService","getFeatureToggles","runAsMediaHelper","testMediaHelperMode","setupConnection","webrtcRelayOnly","signalIceConnected","disableEOCShortCircuit","referenceStanza","originAppName","APP_NAME","originAppVersion","originAppId","splitHawkAndRealtime","useServerSidePings","customHeaders","Genesys-App","streamingServiceConnect","adminUIContext","systemTopicType","notified","connect","csEnabled","csRunLater","checkContentSquare","csLoaderScript","crossOrigin","syncStreamingConnectionToAuthState","syncVideoChatStateToAdminContext","clearActiveRoomMessagesOnAppFocus","_delayedRefocusChatRoom","delay","refocusActiveRoom","displayTrialSupport","dismissTrialSupport","uvOptions","feedback_tab_name","primary_color","link_color","default_mode","forum_id","routeType","routeId","postMessage","localGCBAUri","changePreferredLanguage","sendDiagnostics","_sendDiagnostics","sendFeedback","checkForMobile","isMobilePhone","showTinyNavMenu","showContextualHelp","isScreenRecordingPopout","isPef","isInteractionPopout","isAdminRoute","cast","setBridgeConfiguration","getQueryParams","debugCookie","buildDebugSettings","orgNameCookie","readOnlyCookie","masonryCookie","DirectoryNavHandler","routerService","canHandle","appApiCall","handle","_handleShowProfile","_handleShowGroup","_appApiCall$get","_appApiCall$get2","help","apiAction","TOAST_MSG_PROPS","internalPropName","required","markdownMessage","showCloseButton","showNotificationEverywhere","TOAST_MSG_PROP_NAMES","REQUIRED_TOAST_MSG_PROP_NAMES","apiActionDetails","_this$_processToastPa","_processToastPayload","invalidProps","ignoredProps","validatedToastData","ignored","props","fullTag","requiredCount","filteredPickData","_pick","filteredData","_pickBy","_checkPropValid","_omit","_mapDataToInternalProperties","_mapKeys","isFinite","PROTOCOL_LENIENT_INTERNAL_ACTION_NAMES","SHOW_PROFILE_APP_API_ACTION_NAME","SHOW_TOAST_APP_API_ACTION_NAME","SHOW_HELP_APP_API_ACTION_NAME","HIDE_HELP_APP_API_ACTION_NAME","SHOW_RC_ARTIFACT_APP_API_ACTION_NAME","APP_PROTOCOL_CHECK_REG_EXG","ALLOWED_SANDBOX_VALUES","ALLOWED_PERMISSION_VALUES","LIFECYCLE_HOOK_KEYS","LIFECYCLE_KEYS","INTERAPPTION_PROP_MAPPING_CONFIG","destPath","convert","valueIn","typeIn","lifecycleObj","valueType","trustedOnly","APP_ASSET_CATEGORIES","currCategory","standaloneAppPool","standaloneAppPoolVisible","widgetAppPool","externalUrlExemptIntegrationTypeIds","standaloneMaxActivePoolSize","widgetMaxActivePoolSize","_bypassAppCache","globalApiHandlers","REMOTE_APPS_CACHE_TTL_MILLIS","localMsgListener","appsSupported","handleAppApiCall","apiCall","contextualApiHandlers","_handleApiCall","isTrustedApp","appInstance","buildValidInterapption","trustedProvider","buildInterapptionsLogMsg","normalizedConfig","properties","APP_DISPLAY_TYPES","propError","configKeys","currKey","currValue","currPropConfig","_buildApp","_isValidApp","_handleLocalMsg","_isLocalMsg","_appApiCall","parseMessage","parseError","buildApiLogMsg","msgSource","asyncHandlerPromise","availHandler","currHandler","_instrumentApiCall","msgFailureDetails","ApiCall","pcAppProtocol","APPS_API_PROTOCOL","pcAppProtocolAgentName","pcAppProtocolAgentVersion","_addPageAction","currPool","_findAllStandaloneApps","_fetchAppsByType","_findAllWidgetApps","findAllInterapptions","_fetchAppsByTypeRemote","_remoteAppPromise","_remoteAppRequestTimestamp","allAppsPromise","lastRequestTs","_accumulateApps","app1","app2","localeCompare","currApp","appsUrl","primaryLocale","_getPrimaryLocale","validAppObjs","currIntegration","internallyHosted","_isInternallyHostedApp","integrationType","effective","intlLocale","intlIsoLocale","appProps","_parseLangTagProp","_parseMultiValueProp","_parseProp","APP_FEATURE_CATEGORIES","ucIntegrationKey","pbxPermission","getCurrentWindowOrigin","isNone","NO_SUPPORTED_COMMUNICATION_TYPE_FILTER","currAssetCategory","currAssetCategoryCfg","currVector","vector","currRasters","_extractRasterImgs","raster","assetCategory","basePath","imgs","currImgKey","parseResult","appType","_validateApp","logMessage","logMessageAppType","fullLogMsg","appUrl","internalAppPath","internalAppSubdomain","subdomainType","internalAppQuery","externalUrl","invalidUrl","integrationTypeId","validItems","propVal","_parseBooleanProp","separator","validatedItems","_langTagRegExps","baseProp","langTagRelProp","baseObj","lenientLangTag","langTagRegExp","langKey","_assetLoader","isJid","peopleQueue","groupQueue","checkCacheForEntity","queueEntity","cachedModel","possibleCache","possibleJid","isDirectoryId","scheduleQueues","_scheduleQueues","_handleQueues","clearQueue","processQueue","FL","resolveResults","missingIds","keyId","respondingTimeout","preferencePaths","mixins","BatchDataRequests","CacheChatRoomsMixin","MessageSplitting","supportedChatWidgets","_Ember$Service","applicationController","widgets","firstRoomChosen","responding","popoutRoom","activeEmpty","messagesPerHistoryRequest","maxHistoryRequestSize","dashboardRooms","mutedRooms","roomHistoryStack","replyMessage","collabChatShowChatSplat","canCorrectMessages","initializePreferences","mutedRoomsValue","preference","roomHistoryStackValue","_chatNotificationVolume","chatNotificationVolume","_interactionNotificationVolume","interactionNotificationVolume","_initNotificationVolumes","_setupRateLimitListener","_startWatchVideoParticipantCount","setMessageReply","_handleRateLimit","requestingJids","_notifyRosterRateLimit","saveMutedRooms","saveRoomHistoryStack","addResponder","respondingTimeoutId","removeResponder","sendChatState","toggleRoomMuted","getRecents","clearRoomUnreadMessages","addRoomToDashboard","messageFailedToSend","_d","sendMessageProxy","setActive","timeoutIdentifier","sendCallback","sendMessage","sendVideoProviderNotification","removeAttachment","fileDescriptor","joinScreenShareRoomViaHawk","rejoiningRoom","_timeoutPromise","checkJid","joinRoom","joinRoomEvent","syncPendingRoomWithStreamingService","changeActiveRoom","joinAcdRoom","schedule","leaveAcdRoom","leaveRoom","newRoom","addEmptyRoomObserver","len","roomIsDirty","addPersonToRoom","requestHistory","historyOptions","getMessages","markAsHistory","loadUsersForHistory","setRoomSubject","setPresence","setOrganizationPresenceId","presenceId","setStatus","openRoom","oldOpenRoom","openChatRoomWithVideoForPersonById","openChatRoomForPersonById","loadChatRoom","syncUserChatData","roster","syncAllRoomsLastMessageTime","getAllBadgeCounts","loadRoomHistory","getActiveChatsFromRealtime","_this21","getActiveChats","activeRooms","_this22","activeChatsFromRealtime","checkActiveRoomAgainstHistory","historyStack","lastActiveRoom","mostRecent","selectHighestAppearingActiveRoom","_this23","_args6","clearRoomNotificationCounts","newActive","previousActiveRoom","_this24","attemptRoomChange","removeRoomFromHistoryStack","addRoomToHistoryStack","setRoomDetails","closeRoomAndClearCounts","_this25","_this26","deactivateRoom","setRoomInactive","replacementRoomJid","selectRoomPromise","_this27","getNextRoomFromActiveSection","selectedRoom","updateVolumes","deviceVolumes","_this28","activeRoomJid","newRoomJid","activateRoom","trackRoomChange","focusRoom","setFocused","loadRecentHistoryForAllActiveRooms","loadRecentRoomHistory","loadRoomHistoryWithOptions","loadMoreRoomHistory","loadMoreRoomHistoryAfter","loadContextualRoomHistory","afterDate","_this29","beforePromise","requestRoomHistory","afterPromise","combinedMessages","_addHistoryMessages","_this30","_updateRoomStatus","_this31","_processHistoryResults","_this32","_resolveRealtimeDependentCalls","_this33","deleteParticipantFromChatRoom","_this34","_this35","getRoomInfo","getTargetRoomJid","arg","loadRoomAndUser","userJid","processNewChatMessage","_this36","parseMessageBody","messageModel","parseWidgetData","_this37","child","isActiveRoom","isActiveRoomJid","isRoomVisible","isChatVisible","popoutChatRoom","handleXMPPReferenceMention","_this38","personJid","referenceChildren","handleMentionEvent","_this39","handleCollaborateChatMessage","_this40","isMention","incrementUnreadGroupMessage","_clock","INTERACTION_TYPE","UriBuilder","ConversationMixin","validationWaitTime","getAllActiveConversations","getAllActive","communicationType","addCall","phoneColumn","callNumber","scheduleCallback","callbackUserName","routingData","postData","participantStatus","CONNECTED","disconnectParticipant","DISCONNECTED","unhold","recordingState","unpause","requestAcw","afterCallWorkRequired","skipAcw","isDialerCampaign","isSkippingPreviewCampaign","hasPlacedCallsInCallback","communicationWrapupSkipped","park","PARKED","disconnectCall","getWrapUpCodes","getProvisionalACWNotes","provisional","loadParticipantPerson","getParticipantNotes","getAllHistoricalACWNotes","currentParticipantId","_x2","saveProvisionalACW","monitor","transfer","transferType","TERMINATED","cancelTransfer","attributeToMonitor","expectedValue","requestUri","VALIDATION_INTERVAL","VALIDATION_TIMEOUT","interactions","newInteraction","actionHasSucceeded","actualValue","valResolve","destroyObserver","checkForSuccessUpdate","formattedExpectedValues","lowercaseValues","formatExpectedValue","actionSucceeded","createObserver","initiateConsult","customerId","consultBoth","consultConference","consultDestination","consultObject","cancelConsult","initiateSessionShare","sessionCodeUrl","sourceCommunicationId","addCommunicationCode","toId","fromId","mediaRequestOptions","toCommunicationId","fromCommunicationId","expireSessionShareCode","disconnectMediaType","createEmail","toAddress","initializeDraft","emailId","discardDraft","autoFill","discard","loadSMSHistory","messageIds","sendSMSMessage","normalizedMessage","mime","stickerIds","mediaIds","textBody","stickers","createMediaAttachment","createMessage","useExistingConversation","requestOptions","toAddressMessengerType","useUserFromAddress","getMediaAttachment","getSMSDetails","smsIds","getMessageSupportedContent","integrationUri","getDeploymentConfig","deploymentConfigUri","getMessagingSettings","integrationIdConfigUri","createConversationSummaryFeedback","CookiesService","arrayComparerByDeviceId","otherArray","itemInOtherArray","diffListsByDeviceId","existingList","newList","itemsRemoved","itemsAdded","removed","sanitizeDeviceLabel","deviceLabel","sanitizedLabel","webrtcSettings","selectedProfileId","vanillaProfiles","profiles","microphone","outputDevice","notificationDevice","incomingInvitations","deviceUpdateDelay","deviceChanges","recentlyConnectedDevices","allowDisableProfileNotifications","profileSettingsPromise","allowDefaultProfiles","initProfiles","_fetchProfiles","currentMediaState","_handleMediaStateChange","_updateVolumes","selectedProfile","defaultProfileId","defaultExists","directorySettings","mediaState","camerasDiff","microphonesDiff","outputDevicesDiff","isInitialUpdate","hasMicPermissions","videoDevices","audioDevices","outputDevices","cameras","microphones","_updateProfileAvailability","_maybeFixSelectedProfile","_updateRecentlyConnectedDevices","_conditionallyShowToastForAddedDevices","canBeSelected","matchingCamera","matchingOutputDevice","matchingMicrophone","matchingNotificationDevice","_findMatchingDevice","profileCameraIsNotDefault","validWithoutCamera","setProfile","mic","currentProfile","hasOutputDeviceSupport","profileCamera","profileMic","profileOutputDevice","profileNotificationDevice","cameraValid","outputValid","notificationsValid","profileValid","cameraMatches","micMatches","outputDeviceMatches","notificationDeviceMatches","newDevices","_showNotificationForCurrentProfileNoLongerValid","setDevices","outputDeviceVolumes","notificationDeviceVolumes","_getVolumesForDevice","setCallVolume","defaults","volumes","volumeSettings","_getActionHandler","profileToSet","createProfile","_openPhoneSettingsTab","deviceList","foundDevice","deviceA","_deviceMatches","deviceB","hasSameId","formattedNameA","formattedNameB","hasSameName","addedDevices","filteredSelectableProfiles","disableProfileNotifications","cur","yes","openPreference","no","hasNonDefaultDevices","selectableProfiles","deviceConfig","skipProfileSave","updateSetting","deleteProfile","profileObj","settingsService","saveAndSelectProfile","_callee15","savedProfile","_context15","updateSettings","clearRecentlyConnectedDevices","embeddedStatus","urlSearchParams","isLocallyIntegrated","integrationContext","EmbeddedEvents","ENVIRONMENTAL_DATA","NOTIFICATION","DISMISS_NOTIFICATION","SHOW_NOTIFICATION","PAGE_DATA","LAUNCH_VIDEO_WITH_PERSON_BY_ID","LAUNCH_VIDEO_PROVIDER_WITH_PERSON_BY_ID","START_CHAT_WITH_PERSON_BY_ID","UPDATE_PROFILE_IMAGE","START_CHAT_BY_JID","FAVORITE_ENTITY_BY_ID","START_CALL_PERSON_BY_ID","START_CALL_BY_NUMBER","USER_GENERAL_FIELD_UPDATED","EMERGENCY_ADDR_UPDATED","STREAMING_TOPIC_SUBSCRIBE","STREAMING_TOPIC_UNSUBSCRIBE","LISTENERS","NOTIFICATION_ACTION","ENTITY_FAVORITE_ACTION","STREAMING_TOPIC_MESSAGE","STREAMING_TOPIC_SUBSCRIBE_ERROR","IframeClientTimeoutError","_classCallCheck","isEmbedded","getHostOrigin","_newrelicLegacy","setCustomAttribute","checkForHostRedirect","initializeFrame","initializeClient","client","environmentalDataListener","hostOrigin","addListener","hostRootUrl","custom","registerEventHandlers","messaging","toastAction","_event$payload","handleNotificationAction","entityFavoriteAction","handleEntityFavoriteAction","streamingTopicMessage","onMessage","streamingTopicSubscribeError","onSubscriptionError","requestNotification","publishMessage","publish","dismissNotification","showNotification","notifyAcdCount","ACDCOUNT_EVENT","sendSidebarEvent","panel","SIDEBAR_EVENT","requestNavigation","startChatWithPersonById","notifyEmergencyAddrUpdated","favoriteEntityById","entityGeneralFieldUpdated","emergencyAdrUpdated","emergencyAdr","EMERGENCY_ADR_UPDATED","streamingTopicSubscribe","streamingTopicUnsubscribe","emergencyLocationData","loadUserPrimaryNumber","primaryPhoneObject","loadELocationEligibility","supported","clearElocation","did","refreshEmergencyLocation","defaultMessage","startPolling","pollingIntervalInMinutes","pollCounter","pollingIntervalId","_refreshAllEmergencylocationInfo","setElocation","newAddress","eventsService","triggerEvent","EventsService","EXPANDED_PARTICIPANT_PURPOSES","_trackedContacts","oneWay","_handleContactChanged","interactionModel","participantsToExpand","_loop","_ret","currParticipant","rawParticipant","_getContact","delegateYield","generalMessage","errorData","getCanonicalExternalContact","_arguments2","getCanonicalContactSync","contactId","addContactChangeListenersForInteraction","ModelBuilder","prevRaw","currInteraction","prevInteraction","previousContactId","removeContactChangeListener","addContactChangeListener","removeContactChangeListenersForInteraction","contactData","cause","validateDonutPermission","createContactPojo","_watchContactForChanges","contactCallbackData","_updateTrackedContactsAndTopics","_unwatchContactForChanges","unRegisterPriorityTopic","_invokeCallbacks","trackedContactIds","trackedContacts","_trackedContacts$obje","trackedIds","staleContact","staleCanonicalId","freshContact","freshCanonicalId","freshCanonicalContact","eventData","_callbacks","flatMap","_ref6","initialized","_favorites","favoritePromise","loadFavoritesForSessionPerson","initFavorites","getFavorites","peopleAndGroups","_handleHiddenGroups","favoriteStatus","favoriteEntity","unfavoriteEntity","loadedIds","_payload","_feature","faxUploadWithHeaders","isFullScreen","handleFullScreenChange","fullScreen","webkitIsFullScreen","mozFullScreen","msFullscreenElement","endFullScreen","startFullScreen","requestingElem","messengerElement","orgspanApp","contains","appendTo","requestFullscreen","webkitRequestFullscreen","mozRequestFullScreen","msRequestFullscreen","exitFullscreen","webkitExitFullscreen","mozCancelFullScreen","msExitFullscreen","geoUtil","isEnabled","isSwitchedOn","intervalReference","isStarted","setContext","_lastReport","lastReport","isGeolocationAvailable","_desktopStart","prefs","requestDesktopPromise","cmd","permission_geolocation","t1","_reportCurrentPosition","resultPosition","fetchCurrentPostion","refreshPublicApiUser","_isPrimary","_onPositionSaved","_onErrorSavingPosition","changeCount","roleWithDivisions","incrementChangeCount","_headset","FULL_URL_REG_EXP","LOCALE_REDIRECT_REGEX","PC_HELP_FQDN","EVENT_NAMES","SHOW_RC_ARTIFACT","OPEN_CONTEXTUAL_HELP","centerStageFrame","generateContextualHelpUrl","previousContext","contextualHelpUrl","contextualHelpAnchor","observeRoutes","routePrefix","getEngineHelp","evtPayload","showResourceCenterArtifact","relPath","embededArtifactUrl","buildResourceCenterArtifactUrl","externalArtifactUrl","useSimplifiedTheme","requestedRelPath","openContextualHelpTab","_ref$useSimplifiedThe","throwBadRelPath","hashIndex","queryIndex","pathSegment","internalMsg","_iframeState","newRelicNamespace","presencePollIntervalSec","presenceIntervalTimers","presenceErrors","presencePollInterval","reducePresencePolling","getFeatureToggle","useIntegrationPresenceDirectorySearch","alreadyTriggeredPresenceInterval","triggerPresenceInterval","presenceUpdateInterval","pollingEnabled","_managePolling","removeAllPresenceIntervals","pollIntervalSec","presenceTimer","_handlePresenceInterval","hasSession","intervals","timerKey","removePresenceInterval","updateSessionData","sessionData","fetchedSession","currentDate","filteredUsers","integrationUsers","integrationUsersIds","batchedIds","authError","_isPresenceStale","_handleBatchPresenceRequest","_handleAuthError","idParams","ucIntegrationId","requestLatest","presenceUserList","presenceResponse","_handleIndividualPresenceResponse","hasShownError","groupedUsers","presenceSources","_groupUsersByIntegration","presenceSource","phoneIntegration","usersGroupedByIntegration","integrationKey","integrationConfig","getIntegration","sendNewRelicAction","diffInMS","_isGCOffline","_entityPresence","_interval","addServerPrefix","safeString","rtlLangs","INTL_LANGUAGES","localeCookieOptions","expires","IntlService","loadedPromise","baseLocale","supportedLocales","_window$navigator","userLanguage","navLocale","isRTL","intlTelInputGlobals","getCountryData","isoRegionalLocale","_this$get$split","_this$get$split2","noEscape","_initialLocale","authLocale","_normalizeLocale","localeRootFallback","rootLocale","getWithServerKey","replacements","suppressError","_missingMessage","locales","validLocales","l","setPreferredLanguage","safeLocale","dynamicCookieOptions","domain","getEnvCookieDomain","secure","_shouldSendSameSiteNone","isSameSiteNoneCompatible","sameSite","isLocale12Hour","_loadedResolve","loadLanguage","translations","cached","setupServerTranslations","defaultRequest","localeRequest","defaultTranslationsResult","localeTranslationsResult","defaultTranslations","localeTranslations","server_translations","currProvider","INTERNAL_VIDEO_PROVIDER_ID","defaultVideoProviders","activeProvider","getProvider","usingVideoProvider","zoomMeetingsEnabled","teamsEnabled","handleLogout","blockLogoutCb","providerName","userHasVideoMediaProviders","computedFromConfig","hasEmberTether","hasLiquidWormhole","hasLiquidTether","destinationElementId","MomentService","defaultFormat","_getNamePart","namePart","_getNames","familyName","givenName","_this$_getNames","givenNameInitial","familyNameInitial","_this$_getNames2","optionalMiddleName","_notificationId","_actionHandles","_clickHandlers","nextNotificationId","currentNotificationId","_cleanUpHandlers","handles","clickHandlers","generatedIdentifier","clickHandlerFunction","handlers","_this$get2","_this$get3","dismiss","_notification","fetchOrgSettings","orgSettings","freeSeating","popoutAuthForIframes","isPermissionInList","targetList","inList","listItems","checkDonutPermission","permissionValue","allowedOrgPermissions","targetDivision","isAllowed","permissionsToValidate","targetDomain","targetEntity","targetAction","domainPermissionMap","isAllowedOrgPermission","actionSet","matchesEntity","matchesAction","matchesDivision","shouldAllowBasedOnDivision","rolePermissions","trusteeOrg","directoryPermissions","donutPermissions","validateAllPermissions","permissionsList","validateAnyPermissions","permissionsSet","hasDirectoryPermissions","hasDonutPermission","canDeleteGroups","canViewQueue","canViewQueueObservations","canViewAcdScreenShare","canViewAcdCoBrowseForCall","canViewAcdCoBrowseForChat","canViewBusinessChat","canViewCollaborateVideo","hasVoicemailAccess","canViewAnAgentsSchedule","hasAgentSupervisorAccess","hasExternalContactsViewContactAccess","legacyUnifiedCommunicationsPermission","canCall","conferenceEnabled","canCallForward","canRecord","isBusinessUserOrSupervisor","hasEngageAccess","hasContactCenter","canViewUsers","canViewGroups","canDeleteParticipantFromGroup","canViewZoomMeetings","canViewTeamsMeetings","canTargetUserSearchOutsideOfDivision","canTargetQueueSearchOutsideOfDivision","canViewIntegrationPresence","canViewSummary","GENESYS_SEARCH_TAB","integrations","allApps","_isValidIntegrationTab","onAuthenticated","_fetchConfigs","configs","getIntegrationTabs","canViewThirdPartyPresence","getIntegrationFromSource","getIntegrationTransferTarget","addressObj","allConfigsPromise","_accumulateConfigs","configsUrl","_configs","validConfigObjs","_isValidIntegrationConfig","_mapIntegrationConfig","i10n","badgeIcons","light","dark","clientApp","hasUcIntegrationKey","permissionService","canViewPbxTab","AcdUtilitiesMixin","ActiveCallMixin","CallControlsMixin","CallForwardMixin","ConversationManagerMixin","EventsMixin","PhoneNotificationsMixin","StationMixin","UriBuilderMixin","_processingChain","_initializeProcessingChain","_process2","_process","interactionProcessingChain","QueuedProcessingChain","lifecycleContainer","setProcessingChain","process","eventSource","_getCallState","shouldUpdate","participantState","modelsToDestroy","buildModel","contactObserver","rawData","_onMyConversationEvent","enqueueEvent","_onPigeonConnect","fetchActiveCallConversations","convAPIVersion","onQueue","carrierPigeonConnected","phoneDisabled","phoneDisabledMessage","audioCallCapable","hasMicrophone","stationHasPersistentConnection","persistentConnectionActive","toggleBrowserAnswer","lastConversationError","lastIndexOf","logObject","table","isInteractionViewOpen","isShowCallControlsViewOpen","showFloatingCalls","showNavbarAlert","activeAcdCallState","hasIncomingNonAcdCalls","alertingCall","isAlertingCallACD","bootstrapPurecloudApiOnAuth","delayedNotification","handleMuteParticipants","muteAudio","unmuteAudio","transferToVoicemail","selectedUserUserId","voicemailPolicy","vmAdressString","topicPriority","conversationsummary","outofoffice","eventFromTopic","priorityTopics","customTopicNames","registerTopicsDebouncePeriod","prioritizedTopics","sortedTopics","topicA","topicB","getTopicPriority","priorities","publicApiUser","subscribeUrl","customName","customNames","registerTopic","unshiftObject","unRegisterTopic","_observeTopics","topicKeepAlive","triggerTopicEvent","eventName","carrierPigeonTopic","_emberCopy","topicName","namespaces","syncEnabled","deferredPersistRequests","settingsPath","registerNamespaces","localforage","storeName","getItem","_initializeNamespace","ready","_waitForAccessToken","_enableService","_disableService","_getPreference","persist","_setPreference","namespaceDelimiter","previousSet","setting","setItem","currentNamespaceObject","pendingSet","_safeSet","enableServicePromise","_isNotDead","_enableSync","settingsUrl","preferencesToSync","_saveSettingsFromServer","profileSyncSupport","userPreferences","allLocalPreferences","eventMap","trackedGuids","integrationpresence","events","subscribeToMyself","subscribeToConnection","_getPresenceDefinition","getPresence","getPresenceDefinition","testValue","_getTopicsForUser","_guidFromTopicName","StreamingService","streamingEvent","refreshPeopleActivityState","watchAuthForSubscribe","bulkSubscribeToPresence","callbackKey","previousCallback","newCallback","changePresence","toggleOutOfOffice","setUsersPresence","isConflictError","_alertDeletedPresence","removeDeletedPresence","changeRoutingStatus","setOutOfOffice","doUserPresenceStatusChanged","statusUpdate","isSourceOnUsableList","existingPresenceIndex","existingPresenceObj","presenceListStored","doUserPrimaryPresenceSourceChanged","newSource","isThirdPartySource","handleIntegrationPresenceEvent","presenceEvent","newOutOfOffice","availablePresence","startOfTime","rightAboutMeow","handleRoutingStatusError","conversationSummaryEvent","outOfOfficeEvent","outOfOfficeDef","routingStatusEvent","primaryPresenceEvent","geolocationEvent","_restoreState","inLogoutBounce","_isInLogoutBounce","_clearLogoutTime","baseLocation","searchString","internalRoute","prunedStateParamValue","firstChar","s3SafePathname","parsedStateParam","finalSearch","finalHash","cookieOptions","lastLogout","DEFAULT_ROUTE_MAP","relate-engine","organizations","VERIFICATION_RELEVANT_DATA_MESSAGE","command","adapterCache","isRelateActive","navigationRoute","navTree","helpURL","relateFrameOrigin","profileVerificationEventName","showProfileEventName","contactAssociationMap","contactDisassociationMap","registerSidebarState","contextHelpUrls","handleNavigation","navEvent","handleRedirect","propertyWillChange","propertyDidChange","registerNavEntries","navEntries","associateConversationWithInteraction","profileVerified","verificationInteractionData","displayNotification","shouldNotify","processFrameVerificationEvent","closeRelateFrame","isClosedInteraction","relateIframe","postVerificationRelevantDataV2","associatedContacts","hasActiveAssociation","verified","wasAutoVerified","verificationRelevantData","isVerified","activeProfileIsVerified","queryData","siz","errorType","interactionEnded","BrowserScreenRecordingError","ScreenMediaService","_getHostedContext","_isHosted","_stream","_track$getSettings","screens","metadatas","screen","_track","_debugScreenRecordingInBrowser","screenId","originX","originY","resolutionX","resolutionY","getShareableScreens","createMediaStream","getVideoTrackForScreenId","shareid","createTrackMetadata","attemptsRemaining","getHostedScreenMedia","screenInfo","isWindows","main","isMain","_scrollActivity","EsaSessionService","featureService","dataStore","roleNames","readWritePermissionsDeferred","enabledFeatures","products","authInProgress","logoutInProgress","singleSignOutInProgress","blockers","_timeAuthenticated","hasAppAccess","hasDirectoryUserViewPermission","perm","hasTrusteeAccess","hasDivision","hasDivisions","regEx","isPermission","isPermissionWithDivisions","permissionDivisions","foundPermission","useEmailDraftEvent","rewriteRootAPIRequests","createFieldConfigs","_Object$values","createPresences","loadPresences","loadAllowedOrgPermissions","loadOrgProducts","getOrganizationTranscriptSettings","transcriptSettings","settingsUri","forceDirectory","bootstrapStartTime","performance","_serialProcessingChain","executeChain","stepDesc","getFeatures","processSync","setThemeCookie","trusteeBootstrap","establishSession","setupCarrierPigeon","updateAppSession","hasAssistantsQueueViewPermission","loggingConfig","logMsgPrefix","bootstrapDuration","isChainStepFailure","origReason","legacyErrorCode","telemetryContext","loggableRequestFailureDetails","_request","getLoggableRequestFailureDetails","requestFailureDetails","setServerTimeOffset","setupStoreData","serverError","onLegacySessionInvalidation","LOGOUT_PROMISE_PROP_NAME","logoutPromise","addRemoveBlockers","blocker","proxyLogin","retrieveProxyLoginInfo","isFeatureEnabled","featureName","redirect","cookieProxyPerson","shouldReload","superPerson","forceUpdate","localFeatures","featureToggles","serverDate","t2","t3","clientSystemTimeSuspect","serverTimet1","clientTimet3","clientTimet0","offsetCalculated","subscription","xhrFields","withCredentials","baseExpands","resetPassword","newPassword","resetToken","currentPassword","oldPassword","verifyPassword","publicApiUserObserver","_setupSessionInvalidationFailed","_forwardSessionInvalidationFailedEvent","_teardownSessionInvalidationFailed","_isDesktop","_isDesktopUnifiedPreferences","supportsUnifiedPreferences","canShowChatPreference","canShowAgentGreeting","canShowGeneralPreference","canShowPasswordPreference","canShowNotificationsPreference","isIE","isDesktop","isUnified","canShowVoiceMailPinPreference","canShowDirectRoutingPreference","_commonPreferenceComponents","theme","direct_routing","agent_greeting","commonPreferences","components","canShow","getThemeList","commonPreferencesSortOrder","customPreferences","addPreference","existingPreference","newPreference","removePreference","otherPreferences","canOpenPreference","preferenceKey","openChatPreference","openGeneralPreference","openLanguagePreference","openNotificationsPreference","openPasswordPreference","openSoundPreference","openVideoPreference","openVoiceMailPinPreference","getUserVoicemailEmailNotification","_yield$_this2$get$aja","setUserVoicemailEmailNotification","_sound","GLOBAL_ERROR","SILENCED_ERRORS","statusText","lengthInUtf8Bytes","MAX_INTERNAL_LOG_ITEMS","internalLogs","logCounts","failureCount","_originalLogger","ExponentialIntervalGenerator","LOG_LEVELS","bindLogMethods","resetLogLimit","loggingOptions","serverLevel","localLevel","propertyToMatch","bufferLog","getOriginalLogger","restrictedTypeConverter","stack","currentRoute","timeSinceLogin","fullTypeConverter","createTrace","logItem","itemToLog","_restrictTraceData","clientTime","clientSessionId","allowedKeys","_itemToLog","keyFilter","_objects","extractRawData","maxDepth","_augmentSensitiveData","finalLogItem","wrappedSensitive","checkItemsAgainstOptions","logOption","itemsToLog","defaultAnswer","itemLogIndex","logResult","_len","_key","checkForSilence","SILENCED","silencedByStringMatch","silencedByRegex","silencedByMatcher","skipSumoSend","serverLogLevelIndex","logServer","logLocal","trace","shiftObject","decreaseLogLimit","currentLimit","maxTracesByteLength","getTracesToLog","logs","toLog","totalLogSize","logSize","saveLogs","_saveLogsTask","toSend","sendLogTraces","_resetLogsOnSuccessfulSave","fail","keepLatest","maxConcurrency","backOffTask","getInterval","batches","ApplicationStore","Store","GroupStoreMixin","SearchStoreMixin","applicationAdapter","promiseLabel","personResult","groupResult","latestCalls","batchLimit","batch","successfulRequests","failedRequests","mapLimit","bulkResults","didSaveRecord","internalModel","recordInfo","isSaving","updateGroup","connection","connectedV2","connectionPromise","_textMeasurer","_userActivity","_userIdle","_jabraChrome","_jabraNative","_plantronics","_sennheiser","eventTypes","UserIdleService","IDLE_TIMEOUT","activeEvents","setListening","enableEvent","disableEvent","screenMedia","initService","isPersistentConnection","useSdk","_shouldIgnoreSoftphone","phoneIncomingConversations","settingsPromise","isWebRtcSdkDisabledDFetched","initSdk","urlSearch","urlHash","disableParam","_instrumentSdkUsage","sdkFunction","pageActionName","allowedSessionTypes","sdk","GenesysCloudWebrtcSdk","jidResource","useHeadsets","disableHeadsetControlsOrchestration","startParams","videoDeviceId","audioDeviceId","updateActiveSessions","updateAudioVolume","ensureVideoPermissions","requestMediaPermissions","ensureAudioPermissions","findRemainingSessionsBasedOnParams","sessionType","rejectPendingSession","matchesRequestedSessionType","endSession","endSessionParams","muteOptions","setAudioMute","heldOptions","setConversationHeld","sessions","sessionManager","getAllActiveSessions","SessionTypes","softphone","forceTerminateSession","defaultGeneralSettings","ringtoneSelection","advancedMicSettings","autoGain","noiseSuppression","defaultDirectorySettings","alwaysPopoutVideo","userSettingsPromise","failedSettingsFetch","_fetchSettingsPromise","_updatePromise","_fetchSettings","_checkAndFixSettings","_updateSettings","reallyWaitForToken","forceRefresh","retryOnFail","_settings","existingPromise","_this5$get","generalSettings","settingPath","pieces","topLevelKey","piece","_handleSettingsChanged","updatedSettings","_webrtc","BaseStore","LocalStorageStore","storageKey","currEnvDetails","storeProps","_xSelect","Transform","deserialize","deserialized","_json","_object","_maybe","_pigeon","assertNever","actionName","contactJSON","derived","hasMultipleCustomers","isCallOrCallback","communications","customerEndTime","lastParticipantEndTime","callsError","interactionMetadata","metadataClone","__interaction_metadata__","ALERTING","CONNECTING","CONTACTING","DIALING","OFFERING","TRANSMITTING","CHAT","EMAIL","VOICE","ABANDONED","ACW","ANSWERED","CUSTOMERS_WAITING","HANDLE","HELD","INTERACTING","IVR","OFFERED","OVERSLA","SERVICE_LEVEL","SERVICE_TARGET","TALK","TIME_IN_STATUS","TRANSFERRED","WAIT_TIME","ACTIVE_MEMBERS","queryParamSegments","keyValuePair","queryParamString","urlParams","interactionDetailPath","adminAgentSegment","_buildAppProviderComputed","providerConfig","_Ember","validProviders","validProvider","boolExpr","oldProvider","providerInstance","_booleanExpressions","buildSymbolMap","ft","keyName","evaluateProviderExpression","_buildProviderConfig","providerConfigMap","_boonJs","getEvaluator","currDependencies","_curr$value$split","_curr$value$split2","valueTag","portToValidate","defaultPort","portInt","isTrusted","renderedInstance","appDef","trustedDataPassing","isVisible","userVisible","_serviceDiscoveryWebInternal","isKnown","validationChecks","invalidReason","invalidReasons","validations","_validations","validation","validationConfig","SDK_REPO_URL","LOG_STANDALONE_APP_NAMESPACE","LOG_INTERAPPTIONS_NAMESPACE","LOG_ROOT_NAMESPACE","LOG_API_NAMESPACE","subNamespaces","currNamespace","_len2","_key2","_len3","_key3","buildStashLoggerDetails","logDetails","_objectSpread","remote","mask","buildViewId","isAppDefV2","isAppContext","buildV1IconAsset","asset","fromEntries","decorative","buildV2IconAsset","RASTER_PROP_PATTERN","rasterEntries","currProp","currRasterProp","currRasterValue","_images$","rej","symbolEvaluator","symbolMap","identifiers","currIdentifier","variable","nsSymbolEvaluator","expressionBuilder","_browser","_codeUtils","parseFloat","userUri","_debugBackburner","_debugRsvp","_displayGeolocation","API_ERROR_MESSAGES","messageType","smiles","defaultSkinTone","lightSkinTone","mediumLightSkinTone","mediumSkinTone","mediumDarkSkinTone","darkSkinTone","nature","objects","places","symbols","escapedString","k","isHTMLSafe","theString","HTMLChars","char","literal_string","maxInterval","baselineInterval","_failures","_baselineInterval","_maxAdditionalInterval","expInterval","generatedMaxInterval","KNOWN_INBOUND_MESSAGE_SUBTYPES","getMessengerType","messengerType","messagingChannelType","messagingChannelTypes","mct","isNewId","getIdsFromExternalContact","freshContactSnapshot","channelRecord","_getChannelRecordInfo","interactionChannel","getInteractionChannel","getMessageChannelType","interactionChannelProperties","idAttribute","idOrIDs","getChannelRecordInfo","CHANNEL_MODEL_TYPE","numberOfChanges","idPropertyName","setNewValuesInChannelRecord","channelRecordData","messagingChannelTypeFor","modelProperties","getIdFrom","contactChannelIds","notExcluded","CHANNEL_RECORD_PROPERTIES","updateChannelInfoPrompt","updateChannelInfoPromptPlural","updateAllChannelInfoPrompt","newChannelPrompt","pleaseWaitForFullContactInfo","propertyChanged","IDS","getIdentifier","getReverseWhitepagesLookupValue","getDisplayableName","displayOrScreenName","getDisplayOrScreenName","contactChannelIdValues","interactionIdValues","addedIds","newIdValues","idVal","addOrReplaceIdsInChannelRecord","acdHybridToastNoActiveQueue","acdSecurePause","acdTransferPermissions","ACT-1205","AGORA-137_connections-ui-contentsquare","AGORA-268_connections-ui-in-admin-ui","AGORA-319_webrtc-sdk-dependency-removal","AGORA-71_new-org-settings-api","ATLAS-467_integrate-connections-ui","ATLAS-536_EnableContentSquare","auraACWGadgets","comui-disable-legacy-api-url","conversationSummary3256","digitalFirstPURE2942","enableUIAjaxRetryHeader","epcDecompPresenceLabel","gcucc-ui-PCUCC-3734","gcucc.ui.useIntegrationPresenceSourceDirectorySearch","groupProileNoIndividualsSave","hawkClientScreenShare","interactionNameQueueCallingQueue","notificationOutputPicker","playRecordingFromSelectedOutput","PURE-3256_useConversationDetails","PURE-5421_CannedResponse_Gadget","PURE-6104_no_snatch_phone","PURE-6186_Scripter_Gadget_GCUI","PURE-7064_search_favorites","PURE3301-dynamicGroups","qm.release.evaluation.assignee","qm.release.evaluation.disputes","relateDynamicSchema","showVideoInThumbnail","webrtcClientNetworkProbeAutoAdjust","webrtcDefaultDeviceProfile","webrtcDisableDeviceProfileNotifications","webrtcMMSDnsCheck","webrtcTrackBasedActions","webUiDarkTheme","_isSafeToFocus","currentSelectedElement","hasClass","isSafe","GeolocationUtil","requiresNativeGeolocation","getCurrentPosition","watchPosition","onPositionChangedFn","onErrorFn","clearWatch","watcher","failure","Giphy","apiKey","api_key","rating","gsm7Chars","gsm7CharsExt","_applicationHasFocus","_hostType","_operatingSystem","_version","_hostRegion","_supportsRegions","_supportsUnifiedPreferences","_supportsJabra","_additionalPreferences","_requiresNativeGeolocation","previousPresence","isScreenLockedOrSleep","hasUserAlreadyReturn","desktopSleptAt","isHostedProp","getRegion","supportsRegions","supportsJabra","isMac","getAdditionalPreferences","doTerminateApplication","completion","_HostedContextFunctions","doesAppHaveFocus","showNativeNotification","setUnreadMessageCount","sendJabraEventToDesktop","deviceID","JABRA_EVENT","requestJabraDevices","getScreenMedia","matchedRegion","sCmd","cefQuery","persistent","onFailure","FILE_SIZE","MESSAGE_TYPE","CHARACTER_LIMIT","WHITE_SPACE_KEYCODES","TAB","ENTER","SPACE","WHITE_SPACE_KEYS","CAP_ALPHA_KEYCODES","LOW_ALPHA_KEYCODES","NUM_KEYCODES","NAV_KEYCODES","LEFT_ARROW","UP_ARROW","RIGHT_ARROW","DOWN_ARROW","keyForKeyCode","isAlphabet","isWhitespace","isEscape","isTab","fromCharCode","loggingObject","evaluateAndLog","loggedE164Info","phoneNumberString","typesForPhone","_externalContactMessaging","validInput","missingPlusPrefix","sanitizedPhoneNumber","normalizedPhoneNumber","isApplicationRoute","defaultRender","md","renderer","link_open","renderToken","targetIndex","attrIndex","attrGet","isMailTo","attrPush","attrSet","markdown","render","hljs","configure","markdownit","linkify","typographer","highlightAuto","layoutId","LAYOUTS","getRawAddress","getNameFrom","getModelProperties","idProperties","getDisplayablePhoneNumberFrom","INTERNATIONAL","_getChannelPropertiesFromInteraction","channelType","displayableName","twitterHandle","getChannelPropertiesFromExternalContact","getChannelPropertiesFromInteraction","present","hasCrucialChannelInfo","displayNameFrom","getTwitterDisplayNameFrom","svgIconKey","scopedId","nestedIdProperty","oldIdValue","newIdValue","initialsSupported","OnlyLatinChars","VALID_LOCAL_HOSTNAMES","ENV_TRANSITIONS","prod","DEPLOYMENT_ID_MAP","prod-apne1","prod-apne2","prod-aps1","prod-apse2","prod-cac1","prod-euc1","prod-euw1","prod-euw2","prod-usw2","REGION_TRANSLATION_KEY_MAP","getEnv","getDeploymentId","getRegionTranslationKey","getDesktopId","serviceDiscovery","getEnvironments","translationKey","envStatus","STABLE_PUBLIC_ENVS","parseRuntimeFromLocalPath","parseDeployedRuntime","_window","newrelic","actionNameType","attrType","reservedKeys","attrKey","keyType","persistType","ALLOWED_VALUE_TYPES","safeOptions","MAX_SAFE_INTEGER","excludeUnderscoreKeys","excludeEmberServices","excludeEmberApplications","valueFilter","inputType","myTypeOf","_extractRawDataHelper","contextStack","currStackItem","currLevel","currItem","currIndex","currStack","buildNewContextStack","customJsonValue","propertyName","wrappedJsonError","baseError","newStackItem","PHONE_NUMBER_REGEX","proxy","tap","MSG_NAMESPACE","_defaultLabel","_chain","_processingQueueMap","_uuid","_buildErrorMessage","isValidProcessor","appendToChain","processor","_isLifecycleValid","workQueue","unshift","_checkForWork","emptyQueueIds","currQueueId","currQueue","activeWorkItem","_processEventThroughChain","_buildLoggerMessage","chainLabel","chainIndex","_chainHelper","processorResult","processorResultType","processorLabel","_safeLabel","AdapterError","adapterError","payloadDetails","statusInt","isUuid","getLoggableRequestFailureDetailsPartial","getAdapterErrorLoggableDetails","getAjaxErrorLoggableDetails","rawErrorResponse","UUID_REGEXP","_routingStatus","isSyncPromiseChainStep","chainLength","currChainStep","stepIndex","stepProgress","logPayload","SimpleCache","ttlMinutes","expirationTime","cachedItem","setupRecorder","clearStream","audioContext","suspend","mimeType","isTypeSupported","blobURL","getBlobUrl","loadEncoder","encoderPath","resume","_streamReady","_stoppedRecording","_onDataAvailable","initStream","resumeRecording","pauseRecording","createHowlFromBlob","blobUrl","_loadSoundRecorder","_loadWorker","getScript","currentTheme","_cookie$split","_cookie$split2","DEFAULT_THEME","_ref3$theme","THEME_CLASSES","LIGHT","_ref3$duration","_ref3$path","_ref3$protocol","_getCurrProtocol","_ref3$domain","_ref3$setCookie","setCookie","_setCookie","_ref3$userAgent","_getCurrUserAgent","cookieStmt","DARK","BASE","BASE_THEME_LIST","extraThemes","_ref2$theme","_ref2$element","classList","NATIVE_PANELS","deprecatedConversationSummaryPanelIds","currPanelId","CONVERSATION_DETAILS_GADGET_PANEL_ID","WRAPUP_GADGET_PANEL_ID","transformationMaps","shouldTransformPanelSetting","panelSetting","transformPanelSetting","shouldTransformAppDefId","appDefId","addNativeProvider","transformAppDefId","dependentFeatureToggles","reverseDetails","reverseNotes","reverseWrapup","reverseResponses","reverseScheduleCallback","scripts","transformationDependentFeatureToggles","buildTransformationFtComputedDepKey","injectionPrefix","standardTransformationFtComputedDepKey","requiredTransform","srcNativePanelMatch","findNativePanel","toSearch","nativePanel","currNativePanel","includedNativeProvider","TtlCache","defaultTtl","normalizeTtl","cacheData","tearingDown","expiryCheck","_this$cacheData$key","ttl","currTimeMillis","effectiveTtl","expirationTimestamp","scheduleEviction","_this$cacheData$key2","removedExpirationTimestamp","nextExpirationTimestamp","clearEvictionTimer","timerRef","requestedTimestamp","getEarliestExpirationTimestamp","evictExpiredItems","cacheEntry","earliestExpiration","haystack","needle","_haystack","paramReplace","getAppsDownloadUri","downloadId","_uuidGenerator","_videoFrameChecker","_alias","_belongsTo","_collection","_confirmation","_date","_dependent","_dsError","_exclusion","_format","_hasMany","_inclusion","_length","_messages","_number","_videoParticipantV","_videoParticipant","templateName","_webrtcConversation","runningTests","@purecloud/ember-purecloud-components","@purecloud/ember-softphone-integration","ar","da","de","en-us","es","fi","fr-ca","fr","he","hi","it","ja","ko","nl","pl","pt-br","pt-pt","ru","sv","th","tr","uk","zh-cn","zh-tw"],"mappings":"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KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJ5nQ,OAAQ,CACJ6nQ,gBAAiB,CACb,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,cAAe,CACX,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,oBAAqB,CACjB,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,eAAgB,CACZ,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,mBAAoB,CAChB,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,aAAc,CACV,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,SAGRC,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,QAAS,CACL,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,IACA,IACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,QAAS,CACL,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KACA,KACA;;ACvgCR,MAAuB,CACnBtoQ,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,KACA,KACA,KACA,KACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,WACA,WACA,cACA,cACA,cACA,WACA,WACA,cACA,cACA,cACA,WACA,WACA,cACA,cACA,cACA,KACA,KACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,IACA,MAEJmoQ,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,QAAS,CACL,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,IACA,IACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,QAAS,CACL,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KACA,KACA;;;ACxnBR,MAAuB,CACnBV,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJ5nQ,OAAQ,CACJ6nQ,gBAAiB,CACb,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,MAEJC,cAAe,CACX,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,QAEJC,oBAAqB,CACjB,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,QAEJC,eAAgB,CACZ,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,QAEJC,mBAAoB,CAChB,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,QAEJC,aAAc,CACV,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,SAGRC,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,QAAS,CACL,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,IACA,IACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,QAAS,CACL,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,K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,IAAQ3W,MAAK,SAAAmhB,GAAG,OAAIA,GAAOA,EAAIxK,gDAI9C,IAAIk1Q,EAAM;;AClCzB,MAmIe,CAAEI,UAnIC,CACd,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KACA,IACA,IACA,KACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAIwBC,aAFP,CAAC,KAAM,IAAK,IAAK,IAAK,KAAM,IAAK,IAAK,IAAK,IAAK;;ACpHrE,IAAIt8I,EAAgB3yH,MAAM5oB,OAAOyoB,OAAOG,MAAMmoI,QAAS,CACnD9yH,mBAAoBrV,MAAMC,OAAOC,QAAQ,eACzCH,OAAQC,MAAMC,OAAOC,QAAQ,gBAC7B+hN,sBAAuB,KAEvBitD,sBAAsB,EACtBC,UAAW,KACXC,iBAAkB,GAClBC,SAAU,YAEVC,YAAa,KACbC,kBAAkB,EAClBC,6BAA6B,EAC7BC,gBAAgB,EAChBC,uBAAwB,GACxBC,4BAA4B,EAC5Bx+D,kBAAkB,EAClBy+D,iBAAkB,KAClBC,uBAAuB,EACvBC,sBAAsB,EACtBC,eAAgB,KAEhBrgQ,KAAM,WACF9iC,KAAKk0B,OAALrd,MAAA7W,KAAeuU;AAEf,IAAMygF,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","file":"connections-ui.js","sourcesContent":["\"use strict\";\n\n\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.adapter = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\n/*\n *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar SDPUtils = require('sdp');\n\nfunction fixStatsType(stat) {\n  return {\n    inboundrtp: 'inbound-rtp',\n    outboundrtp: 'outbound-rtp',\n    candidatepair: 'candidate-pair',\n    localcandidate: 'local-candidate',\n    remotecandidate: 'remote-candidate'\n  }[stat.type] || stat.type;\n}\n\nfunction writeMediaSection(transceiver, caps, type, stream, dtlsRole) {\n  var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n  // Map ICE parameters (ufrag, pwd) to SDP.\n  sdp += SDPUtils.writeIceParameters(\n      transceiver.iceGatherer.getLocalParameters());\n\n  // Map DTLS parameters to SDP.\n  sdp += SDPUtils.writeDtlsParameters(\n      transceiver.dtlsTransport.getLocalParameters(),\n      type === 'offer' ? 'actpass' : dtlsRole || 'active');\n\n  sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n  if (transceiver.rtpSender && transceiver.rtpReceiver) {\n    sdp += 'a=sendrecv\\r\\n';\n  } else if (transceiver.rtpSender) {\n    sdp += 'a=sendonly\\r\\n';\n  } else if (transceiver.rtpReceiver) {\n    sdp += 'a=recvonly\\r\\n';\n  } else {\n    sdp += 'a=inactive\\r\\n';\n  }\n\n  if (transceiver.rtpSender) {\n    var trackId = transceiver.rtpSender._initialTrackId ||\n        transceiver.rtpSender.track.id;\n    transceiver.rtpSender._initialTrackId = trackId;\n    // spec.\n    var msid = 'msid:' + (stream ? stream.id : '-') + ' ' +\n        trackId + '\\r\\n';\n    sdp += 'a=' + msid;\n    // for Chrome. Legacy should no longer be required.\n    sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n        ' ' + msid;\n\n    // RTX\n    if (transceiver.sendEncodingParameters[0].rtx) {\n      sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n          ' ' + msid;\n      sdp += 'a=ssrc-group:FID ' +\n          transceiver.sendEncodingParameters[0].ssrc + ' ' +\n          transceiver.sendEncodingParameters[0].rtx.ssrc +\n          '\\r\\n';\n    }\n  }\n  // FIXME: this should be written by writeRtpDescription.\n  sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n      ' cname:' + SDPUtils.localCName + '\\r\\n';\n  if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n    sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n        ' cname:' + SDPUtils.localCName + '\\r\\n';\n  }\n  return sdp;\n}\n\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nfunction filterIceServers(iceServers, edgeVersion) {\n  var hasTurn = false;\n  iceServers = JSON.parse(JSON.stringify(iceServers));\n  return iceServers.filter(function(server) {\n    if (server && (server.urls || server.url)) {\n      var urls = server.urls || server.url;\n      if (server.url && !server.urls) {\n        console.warn('RTCIceServer.url is deprecated! Use urls instead.');\n      }\n      var isString = typeof urls === 'string';\n      if (isString) {\n        urls = [urls];\n      }\n      urls = urls.filter(function(url) {\n        var validTurn = url.indexOf('turn:') === 0 &&\n            url.indexOf('transport=udp') !== -1 &&\n            url.indexOf('turn:[') === -1 &&\n            !hasTurn;\n\n        if (validTurn) {\n          hasTurn = true;\n          return true;\n        }\n        return url.indexOf('stun:') === 0 && edgeVersion >= 14393 &&\n            url.indexOf('?transport=udp') === -1;\n      });\n\n      delete server.url;\n      server.urls = isString ? urls[0] : urls;\n      return !!urls.length;\n    }\n  });\n}\n\n// Determines the intersection of local and remote capabilities.\nfunction getCommonCapabilities(localCapabilities, remoteCapabilities) {\n  var commonCapabilities = {\n    codecs: [],\n    headerExtensions: [],\n    fecMechanisms: []\n  };\n\n  var findCodecByPayloadType = function(pt, codecs) {\n    pt = parseInt(pt, 10);\n    for (var i = 0; i < codecs.length; i++) {\n      if (codecs[i].payloadType === pt ||\n          codecs[i].preferredPayloadType === pt) {\n        return codecs[i];\n      }\n    }\n  };\n\n  var rtxCapabilityMatches = function(lRtx, rRtx, lCodecs, rCodecs) {\n    var lCodec = findCodecByPayloadType(lRtx.parameters.apt, lCodecs);\n    var rCodec = findCodecByPayloadType(rRtx.parameters.apt, rCodecs);\n    return lCodec && rCodec &&\n        lCodec.name.toLowerCase() === rCodec.name.toLowerCase();\n  };\n\n  localCapabilities.codecs.forEach(function(lCodec) {\n    for (var i = 0; i < remoteCapabilities.codecs.length; i++) {\n      var rCodec = remoteCapabilities.codecs[i];\n      if (lCodec.name.toLowerCase() === rCodec.name.toLowerCase() &&\n          lCodec.clockRate === rCodec.clockRate) {\n        if (lCodec.name.toLowerCase() === 'rtx' &&\n            lCodec.parameters && rCodec.parameters.apt) {\n          // for RTX we need to find the local rtx that has a apt\n          // which points to the same local codec as the remote one.\n          if (!rtxCapabilityMatches(lCodec, rCodec,\n              localCapabilities.codecs, remoteCapabilities.codecs)) {\n            continue;\n          }\n        }\n        rCodec = JSON.parse(JSON.stringify(rCodec)); // deepcopy\n        // number of channels is the highest common number of channels\n        rCodec.numChannels = Math.min(lCodec.numChannels,\n            rCodec.numChannels);\n        // push rCodec so we reply with offerer payload type\n        commonCapabilities.codecs.push(rCodec);\n\n        // determine common feedback mechanisms\n        rCodec.rtcpFeedback = rCodec.rtcpFeedback.filter(function(fb) {\n          for (var j = 0; j < lCodec.rtcpFeedback.length; j++) {\n            if (lCodec.rtcpFeedback[j].type === fb.type &&\n                lCodec.rtcpFeedback[j].parameter === fb.parameter) {\n              return true;\n            }\n          }\n          return false;\n        });\n        // FIXME: also need to determine .parameters\n        //  see https://github.com/openpeer/ortc/issues/569\n        break;\n      }\n    }\n  });\n\n  localCapabilities.headerExtensions.forEach(function(lHeaderExtension) {\n    for (var i = 0; i < remoteCapabilities.headerExtensions.length;\n         i++) {\n      var rHeaderExtension = remoteCapabilities.headerExtensions[i];\n      if (lHeaderExtension.uri === rHeaderExtension.uri) {\n        commonCapabilities.headerExtensions.push(rHeaderExtension);\n        break;\n      }\n    }\n  });\n\n  // FIXME: fecMechanisms\n  return commonCapabilities;\n}\n\n// is action=setLocalDescription with type allowed in signalingState\nfunction isActionAllowedInSignalingState(action, type, signalingState) {\n  return {\n    offer: {\n      setLocalDescription: ['stable', 'have-local-offer'],\n      setRemoteDescription: ['stable', 'have-remote-offer']\n    },\n    answer: {\n      setLocalDescription: ['have-remote-offer', 'have-local-pranswer'],\n      setRemoteDescription: ['have-local-offer', 'have-remote-pranswer']\n    }\n  }[type][action].indexOf(signalingState) !== -1;\n}\n\nfunction maybeAddCandidate(iceTransport, candidate) {\n  // Edge's internal representation adds some fields therefore\n  // not all fieldѕ are taken into account.\n  var alreadyAdded = iceTransport.getRemoteCandidates()\n      .find(function(remoteCandidate) {\n        return candidate.foundation === remoteCandidate.foundation &&\n            candidate.ip === remoteCandidate.ip &&\n            candidate.port === remoteCandidate.port &&\n            candidate.priority === remoteCandidate.priority &&\n            candidate.protocol === remoteCandidate.protocol &&\n            candidate.type === remoteCandidate.type;\n      });\n  if (!alreadyAdded) {\n    iceTransport.addRemoteCandidate(candidate);\n  }\n  return !alreadyAdded;\n}\n\n\nfunction makeError(name, description) {\n  var e = new Error(description);\n  e.name = name;\n  // legacy error codes from https://heycam.github.io/webidl/#idl-DOMException-error-names\n  e.code = {\n    NotSupportedError: 9,\n    InvalidStateError: 11,\n    InvalidAccessError: 15,\n    TypeError: undefined,\n    OperationError: undefined\n  }[name];\n  return e;\n}\n\nmodule.exports = function(window, edgeVersion) {\n  // https://w3c.github.io/mediacapture-main/#mediastream\n  // Helper function to add the track to the stream and\n  // dispatch the event ourselves.\n  function addTrackToStreamAndFireEvent(track, stream) {\n    stream.addTrack(track);\n    stream.dispatchEvent(new window.MediaStreamTrackEvent('addtrack',\n        {track: track}));\n  }\n\n  function removeTrackFromStreamAndFireEvent(track, stream) {\n    stream.removeTrack(track);\n    stream.dispatchEvent(new window.MediaStreamTrackEvent('removetrack',\n        {track: track}));\n  }\n\n  function fireAddTrack(pc, track, receiver, streams) {\n    var trackEvent = new Event('track');\n    trackEvent.track = track;\n    trackEvent.receiver = receiver;\n    trackEvent.transceiver = {receiver: receiver};\n    trackEvent.streams = streams;\n    window.setTimeout(function() {\n      pc._dispatchEvent('track', trackEvent);\n    });\n  }\n\n  var RTCPeerConnection = function(config) {\n    var pc = this;\n\n    var _eventTarget = document.createDocumentFragment();\n    ['addEventListener', 'removeEventListener', 'dispatchEvent']\n        .forEach(function(method) {\n          pc[method] = _eventTarget[method].bind(_eventTarget);\n        });\n\n    this.canTrickleIceCandidates = null;\n\n    this.needNegotiation = false;\n\n    this.localStreams = [];\n    this.remoteStreams = [];\n\n    this._localDescription = null;\n    this._remoteDescription = null;\n\n    this.signalingState = 'stable';\n    this.iceConnectionState = 'new';\n    this.connectionState = 'new';\n    this.iceGatheringState = 'new';\n\n    config = JSON.parse(JSON.stringify(config || {}));\n\n    this.usingBundle = config.bundlePolicy === 'max-bundle';\n    if (config.rtcpMuxPolicy === 'negotiate') {\n      throw(makeError('NotSupportedError',\n          'rtcpMuxPolicy \\'negotiate\\' is not supported'));\n    } else if (!config.rtcpMuxPolicy) {\n      config.rtcpMuxPolicy = 'require';\n    }\n\n    switch (config.iceTransportPolicy) {\n      case 'all':\n      case 'relay':\n        break;\n      default:\n        config.iceTransportPolicy = 'all';\n        break;\n    }\n\n    switch (config.bundlePolicy) {\n      case 'balanced':\n      case 'max-compat':\n      case 'max-bundle':\n        break;\n      default:\n        config.bundlePolicy = 'balanced';\n        break;\n    }\n\n    config.iceServers = filterIceServers(config.iceServers || [], edgeVersion);\n\n    this._iceGatherers = [];\n    if (config.iceCandidatePoolSize) {\n      for (var i = config.iceCandidatePoolSize; i > 0; i--) {\n        this._iceGatherers.push(new window.RTCIceGatherer({\n          iceServers: config.iceServers,\n          gatherPolicy: config.iceTransportPolicy\n        }));\n      }\n    } else {\n      config.iceCandidatePoolSize = 0;\n    }\n\n    this._config = config;\n\n    // per-track iceGathers, iceTransports, dtlsTransports, rtpSenders, ...\n    // everything that is needed to describe a SDP m-line.\n    this.transceivers = [];\n\n    this._sdpSessionId = SDPUtils.generateSessionId();\n    this._sdpSessionVersion = 0;\n\n    this._dtlsRole = undefined; // role for a=setup to use in answers.\n\n    this._isClosed = false;\n  };\n\n  Object.defineProperty(RTCPeerConnection.prototype, 'localDescription', {\n    configurable: true,\n    get: function() {\n      return this._localDescription;\n    }\n  });\n  Object.defineProperty(RTCPeerConnection.prototype, 'remoteDescription', {\n    configurable: true,\n    get: function() {\n      return this._remoteDescription;\n    }\n  });\n\n  // set up event handlers on prototype\n  RTCPeerConnection.prototype.onicecandidate = null;\n  RTCPeerConnection.prototype.onaddstream = null;\n  RTCPeerConnection.prototype.ontrack = null;\n  RTCPeerConnection.prototype.onremovestream = null;\n  RTCPeerConnection.prototype.onsignalingstatechange = null;\n  RTCPeerConnection.prototype.oniceconnectionstatechange = null;\n  RTCPeerConnection.prototype.onconnectionstatechange = null;\n  RTCPeerConnection.prototype.onicegatheringstatechange = null;\n  RTCPeerConnection.prototype.onnegotiationneeded = null;\n  RTCPeerConnection.prototype.ondatachannel = null;\n\n  RTCPeerConnection.prototype._dispatchEvent = function(name, event) {\n    if (this._isClosed) {\n      return;\n    }\n    this.dispatchEvent(event);\n    if (typeof this['on' + name] === 'function') {\n      this['on' + name](event);\n    }\n  };\n\n  RTCPeerConnection.prototype._emitGatheringStateChange = function() {\n    var event = new Event('icegatheringstatechange');\n    this._dispatchEvent('icegatheringstatechange', event);\n  };\n\n  RTCPeerConnection.prototype.getConfiguration = function() {\n    return this._config;\n  };\n\n  RTCPeerConnection.prototype.getLocalStreams = function() {\n    return this.localStreams;\n  };\n\n  RTCPeerConnection.prototype.getRemoteStreams = function() {\n    return this.remoteStreams;\n  };\n\n  // internal helper to create a transceiver object.\n  // (which is not yet the same as the WebRTC 1.0 transceiver)\n  RTCPeerConnection.prototype._createTransceiver = function(kind, doNotAdd) {\n    var hasBundleTransport = this.transceivers.length > 0;\n    var transceiver = {\n      track: null,\n      iceGatherer: null,\n      iceTransport: null,\n      dtlsTransport: null,\n      localCapabilities: null,\n      remoteCapabilities: null,\n      rtpSender: null,\n      rtpReceiver: null,\n      kind: kind,\n      mid: null,\n      sendEncodingParameters: null,\n      recvEncodingParameters: null,\n      stream: null,\n      associatedRemoteMediaStreams: [],\n      wantReceive: true\n    };\n    if (this.usingBundle && hasBundleTransport) {\n      transceiver.iceTransport = this.transceivers[0].iceTransport;\n      transceiver.dtlsTransport = this.transceivers[0].dtlsTransport;\n    } else {\n      var transports = this._createIceAndDtlsTransports();\n      transceiver.iceTransport = transports.iceTransport;\n      transceiver.dtlsTransport = transports.dtlsTransport;\n    }\n    if (!doNotAdd) {\n      this.transceivers.push(transceiver);\n    }\n    return transceiver;\n  };\n\n  RTCPeerConnection.prototype.addTrack = function(track, stream) {\n    if (this._isClosed) {\n      throw makeError('InvalidStateError',\n          'Attempted to call addTrack on a closed peerconnection.');\n    }\n\n    var alreadyExists = this.transceivers.find(function(s) {\n      return s.track === track;\n    });\n\n    if (alreadyExists) {\n      throw makeError('InvalidAccessError', 'Track already exists.');\n    }\n\n    var transceiver;\n    for (var i = 0; i < this.transceivers.length; i++) {\n      if (!this.transceivers[i].track &&\n          this.transceivers[i].kind === track.kind) {\n        transceiver = this.transceivers[i];\n      }\n    }\n    if (!transceiver) {\n      transceiver = this._createTransceiver(track.kind);\n    }\n\n    this._maybeFireNegotiationNeeded();\n\n    if (this.localStreams.indexOf(stream) === -1) {\n      this.localStreams.push(stream);\n    }\n\n    transceiver.track = track;\n    transceiver.stream = stream;\n    transceiver.rtpSender = new window.RTCRtpSender(track,\n        transceiver.dtlsTransport);\n    return transceiver.rtpSender;\n  };\n\n  RTCPeerConnection.prototype.addStream = function(stream) {\n    var pc = this;\n    if (edgeVersion >= 15025) {\n      stream.getTracks().forEach(function(track) {\n        pc.addTrack(track, stream);\n      });\n    } else {\n      // Clone is necessary for local demos mostly, attaching directly\n      // to two different senders does not work (build 10547).\n      // Fixed in 15025 (or earlier)\n      var clonedStream = stream.clone();\n      stream.getTracks().forEach(function(track, idx) {\n        var clonedTrack = clonedStream.getTracks()[idx];\n        track.addEventListener('enabled', function(event) {\n          clonedTrack.enabled = event.enabled;\n        });\n      });\n      clonedStream.getTracks().forEach(function(track) {\n        pc.addTrack(track, clonedStream);\n      });\n    }\n  };\n\n  RTCPeerConnection.prototype.removeTrack = function(sender) {\n    if (this._isClosed) {\n      throw makeError('InvalidStateError',\n          'Attempted to call removeTrack on a closed peerconnection.');\n    }\n\n    if (!(sender instanceof window.RTCRtpSender)) {\n      throw new TypeError('Argument 1 of RTCPeerConnection.removeTrack ' +\n          'does not implement interface RTCRtpSender.');\n    }\n\n    var transceiver = this.transceivers.find(function(t) {\n      return t.rtpSender === sender;\n    });\n\n    if (!transceiver) {\n      throw makeError('InvalidAccessError',\n          'Sender was not created by this connection.');\n    }\n    var stream = transceiver.stream;\n\n    transceiver.rtpSender.stop();\n    transceiver.rtpSender = null;\n    transceiver.track = null;\n    transceiver.stream = null;\n\n    // remove the stream from the set of local streams\n    var localStreams = this.transceivers.map(function(t) {\n      return t.stream;\n    });\n    if (localStreams.indexOf(stream) === -1 &&\n        this.localStreams.indexOf(stream) > -1) {\n      this.localStreams.splice(this.localStreams.indexOf(stream), 1);\n    }\n\n    this._maybeFireNegotiationNeeded();\n  };\n\n  RTCPeerConnection.prototype.removeStream = function(stream) {\n    var pc = this;\n    stream.getTracks().forEach(function(track) {\n      var sender = pc.getSenders().find(function(s) {\n        return s.track === track;\n      });\n      if (sender) {\n        pc.removeTrack(sender);\n      }\n    });\n  };\n\n  RTCPeerConnection.prototype.getSenders = function() {\n    return this.transceivers.filter(function(transceiver) {\n      return !!transceiver.rtpSender;\n    })\n    .map(function(transceiver) {\n      return transceiver.rtpSender;\n    });\n  };\n\n  RTCPeerConnection.prototype.getReceivers = function() {\n    return this.transceivers.filter(function(transceiver) {\n      return !!transceiver.rtpReceiver;\n    })\n    .map(function(transceiver) {\n      return transceiver.rtpReceiver;\n    });\n  };\n\n\n  RTCPeerConnection.prototype._createIceGatherer = function(sdpMLineIndex,\n      usingBundle) {\n    var pc = this;\n    if (usingBundle && sdpMLineIndex > 0) {\n      return this.transceivers[0].iceGatherer;\n    } else if (this._iceGatherers.length) {\n      return this._iceGatherers.shift();\n    }\n    var iceGatherer = new window.RTCIceGatherer({\n      iceServers: this._config.iceServers,\n      gatherPolicy: this._config.iceTransportPolicy\n    });\n    Object.defineProperty(iceGatherer, 'state',\n        {value: 'new', writable: true}\n    );\n\n    this.transceivers[sdpMLineIndex].bufferedCandidateEvents = [];\n    this.transceivers[sdpMLineIndex].bufferCandidates = function(event) {\n      var end = !event.candidate || Object.keys(event.candidate).length === 0;\n      // polyfill since RTCIceGatherer.state is not implemented in\n      // Edge 10547 yet.\n      iceGatherer.state = end ? 'completed' : 'gathering';\n      if (pc.transceivers[sdpMLineIndex].bufferedCandidateEvents !== null) {\n        pc.transceivers[sdpMLineIndex].bufferedCandidateEvents.push(event);\n      }\n    };\n    iceGatherer.addEventListener('localcandidate',\n      this.transceivers[sdpMLineIndex].bufferCandidates);\n    return iceGatherer;\n  };\n\n  // start gathering from an RTCIceGatherer.\n  RTCPeerConnection.prototype._gather = function(mid, sdpMLineIndex) {\n    var pc = this;\n    var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n    if (iceGatherer.onlocalcandidate) {\n      return;\n    }\n    var bufferedCandidateEvents =\n      this.transceivers[sdpMLineIndex].bufferedCandidateEvents;\n    this.transceivers[sdpMLineIndex].bufferedCandidateEvents = null;\n    iceGatherer.removeEventListener('localcandidate',\n      this.transceivers[sdpMLineIndex].bufferCandidates);\n    iceGatherer.onlocalcandidate = function(evt) {\n      if (pc.usingBundle && sdpMLineIndex > 0) {\n        // if we know that we use bundle we can drop candidates with\n        // ѕdpMLineIndex > 0. If we don't do this then our state gets\n        // confused since we dispose the extra ice gatherer.\n        return;\n      }\n      var event = new Event('icecandidate');\n      event.candidate = {sdpMid: mid, sdpMLineIndex: sdpMLineIndex};\n\n      var cand = evt.candidate;\n      // Edge emits an empty object for RTCIceCandidateComplete‥\n      var end = !cand || Object.keys(cand).length === 0;\n      if (end) {\n        // polyfill since RTCIceGatherer.state is not implemented in\n        // Edge 10547 yet.\n        if (iceGatherer.state === 'new' || iceGatherer.state === 'gathering') {\n          iceGatherer.state = 'completed';\n        }\n      } else {\n        if (iceGatherer.state === 'new') {\n          iceGatherer.state = 'gathering';\n        }\n        // RTCIceCandidate doesn't have a component, needs to be added\n        cand.component = 1;\n        // also the usernameFragment. TODO: update SDP to take both variants.\n        cand.ufrag = iceGatherer.getLocalParameters().usernameFragment;\n\n        var serializedCandidate = SDPUtils.writeCandidate(cand);\n        event.candidate = Object.assign(event.candidate,\n            SDPUtils.parseCandidate(serializedCandidate));\n\n        event.candidate.candidate = serializedCandidate;\n        event.candidate.toJSON = function() {\n          return {\n            candidate: event.candidate.candidate,\n            sdpMid: event.candidate.sdpMid,\n            sdpMLineIndex: event.candidate.sdpMLineIndex,\n            usernameFragment: event.candidate.usernameFragment\n          };\n        };\n      }\n\n      // update local description.\n      var sections = SDPUtils.getMediaSections(pc._localDescription.sdp);\n      if (!end) {\n        sections[event.candidate.sdpMLineIndex] +=\n            'a=' + event.candidate.candidate + '\\r\\n';\n      } else {\n        sections[event.candidate.sdpMLineIndex] +=\n            'a=end-of-candidates\\r\\n';\n      }\n      pc._localDescription.sdp =\n          SDPUtils.getDescription(pc._localDescription.sdp) +\n          sections.join('');\n      var complete = pc.transceivers.every(function(transceiver) {\n        return transceiver.iceGatherer &&\n            transceiver.iceGatherer.state === 'completed';\n      });\n\n      if (pc.iceGatheringState !== 'gathering') {\n        pc.iceGatheringState = 'gathering';\n        pc._emitGatheringStateChange();\n      }\n\n      // Emit candidate. Also emit null candidate when all gatherers are\n      // complete.\n      if (!end) {\n        pc._dispatchEvent('icecandidate', event);\n      }\n      if (complete) {\n        pc._dispatchEvent('icecandidate', new Event('icecandidate'));\n        pc.iceGatheringState = 'complete';\n        pc._emitGatheringStateChange();\n      }\n    };\n\n    // emit already gathered candidates.\n    window.setTimeout(function() {\n      bufferedCandidateEvents.forEach(function(e) {\n        iceGatherer.onlocalcandidate(e);\n      });\n    }, 0);\n  };\n\n  // Create ICE transport and DTLS transport.\n  RTCPeerConnection.prototype._createIceAndDtlsTransports = function() {\n    var pc = this;\n    var iceTransport = new window.RTCIceTransport(null);\n    iceTransport.onicestatechange = function() {\n      pc._updateIceConnectionState();\n      pc._updateConnectionState();\n    };\n\n    var dtlsTransport = new window.RTCDtlsTransport(iceTransport);\n    dtlsTransport.ondtlsstatechange = function() {\n      pc._updateConnectionState();\n    };\n    dtlsTransport.onerror = function() {\n      // onerror does not set state to failed by itself.\n      Object.defineProperty(dtlsTransport, 'state',\n          {value: 'failed', writable: true});\n      pc._updateConnectionState();\n    };\n\n    return {\n      iceTransport: iceTransport,\n      dtlsTransport: dtlsTransport\n    };\n  };\n\n  // Destroy ICE gatherer, ICE transport and DTLS transport.\n  // Without triggering the callbacks.\n  RTCPeerConnection.prototype._disposeIceAndDtlsTransports = function(\n      sdpMLineIndex) {\n    var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n    if (iceGatherer) {\n      delete iceGatherer.onlocalcandidate;\n      delete this.transceivers[sdpMLineIndex].iceGatherer;\n    }\n    var iceTransport = this.transceivers[sdpMLineIndex].iceTransport;\n    if (iceTransport) {\n      delete iceTransport.onicestatechange;\n      delete this.transceivers[sdpMLineIndex].iceTransport;\n    }\n    var dtlsTransport = this.transceivers[sdpMLineIndex].dtlsTransport;\n    if (dtlsTransport) {\n      delete dtlsTransport.ondtlsstatechange;\n      delete dtlsTransport.onerror;\n      delete this.transceivers[sdpMLineIndex].dtlsTransport;\n    }\n  };\n\n  // Start the RTP Sender and Receiver for a transceiver.\n  RTCPeerConnection.prototype._transceive = function(transceiver,\n      send, recv) {\n    var params = getCommonCapabilities(transceiver.localCapabilities,\n        transceiver.remoteCapabilities);\n    if (send && transceiver.rtpSender) {\n      params.encodings = transceiver.sendEncodingParameters;\n      params.rtcp = {\n        cname: SDPUtils.localCName,\n        compound: transceiver.rtcpParameters.compound\n      };\n      if (transceiver.recvEncodingParameters.length) {\n        params.rtcp.ssrc = transceiver.recvEncodingParameters[0].ssrc;\n      }\n      transceiver.rtpSender.send(params);\n    }\n    if (recv && transceiver.rtpReceiver && params.codecs.length > 0) {\n      // remove RTX field in Edge 14942\n      if (transceiver.kind === 'video'\n          && transceiver.recvEncodingParameters\n          && edgeVersion < 15019) {\n        transceiver.recvEncodingParameters.forEach(function(p) {\n          delete p.rtx;\n        });\n      }\n      if (transceiver.recvEncodingParameters.length) {\n        params.encodings = transceiver.recvEncodingParameters;\n      } else {\n        params.encodings = [{}];\n      }\n      params.rtcp = {\n        compound: transceiver.rtcpParameters.compound\n      };\n      if (transceiver.rtcpParameters.cname) {\n        params.rtcp.cname = transceiver.rtcpParameters.cname;\n      }\n      if (transceiver.sendEncodingParameters.length) {\n        params.rtcp.ssrc = transceiver.sendEncodingParameters[0].ssrc;\n      }\n      transceiver.rtpReceiver.receive(params);\n    }\n  };\n\n  RTCPeerConnection.prototype.setLocalDescription = function(description) {\n    var pc = this;\n\n    // Note: pranswer is not supported.\n    if (['offer', 'answer'].indexOf(description.type) === -1) {\n      return Promise.reject(makeError('TypeError',\n          'Unsupported type \"' + description.type + '\"'));\n    }\n\n    if (!isActionAllowedInSignalingState('setLocalDescription',\n        description.type, pc.signalingState) || pc._isClosed) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not set local ' + description.type +\n          ' in state ' + pc.signalingState));\n    }\n\n    var sections;\n    var sessionpart;\n    if (description.type === 'offer') {\n      // VERY limited support for SDP munging. Limited to:\n      // * changing the order of codecs\n      sections = SDPUtils.splitSections(description.sdp);\n      sessionpart = sections.shift();\n      sections.forEach(function(mediaSection, sdpMLineIndex) {\n        var caps = SDPUtils.parseRtpParameters(mediaSection);\n        pc.transceivers[sdpMLineIndex].localCapabilities = caps;\n      });\n\n      pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n        pc._gather(transceiver.mid, sdpMLineIndex);\n      });\n    } else if (description.type === 'answer') {\n      sections = SDPUtils.splitSections(pc._remoteDescription.sdp);\n      sessionpart = sections.shift();\n      var isIceLite = SDPUtils.matchPrefix(sessionpart,\n          'a=ice-lite').length > 0;\n      sections.forEach(function(mediaSection, sdpMLineIndex) {\n        var transceiver = pc.transceivers[sdpMLineIndex];\n        var iceGatherer = transceiver.iceGatherer;\n        var iceTransport = transceiver.iceTransport;\n        var dtlsTransport = transceiver.dtlsTransport;\n        var localCapabilities = transceiver.localCapabilities;\n        var remoteCapabilities = transceiver.remoteCapabilities;\n\n        // treat bundle-only as not-rejected.\n        var rejected = SDPUtils.isRejected(mediaSection) &&\n            SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n\n        if (!rejected && !transceiver.rejected) {\n          var remoteIceParameters = SDPUtils.getIceParameters(\n              mediaSection, sessionpart);\n          var remoteDtlsParameters = SDPUtils.getDtlsParameters(\n              mediaSection, sessionpart);\n          if (isIceLite) {\n            remoteDtlsParameters.role = 'server';\n          }\n\n          if (!pc.usingBundle || sdpMLineIndex === 0) {\n            pc._gather(transceiver.mid, sdpMLineIndex);\n            if (iceTransport.state === 'new') {\n              iceTransport.start(iceGatherer, remoteIceParameters,\n                  isIceLite ? 'controlling' : 'controlled');\n            }\n            if (dtlsTransport.state === 'new') {\n              dtlsTransport.start(remoteDtlsParameters);\n            }\n          }\n\n          // Calculate intersection of capabilities.\n          var params = getCommonCapabilities(localCapabilities,\n              remoteCapabilities);\n\n          // Start the RTCRtpSender. The RTCRtpReceiver for this\n          // transceiver has already been started in setRemoteDescription.\n          pc._transceive(transceiver,\n              params.codecs.length > 0,\n              false);\n        }\n      });\n    }\n\n    pc._localDescription = {\n      type: description.type,\n      sdp: description.sdp\n    };\n    if (description.type === 'offer') {\n      pc._updateSignalingState('have-local-offer');\n    } else {\n      pc._updateSignalingState('stable');\n    }\n\n    return Promise.resolve();\n  };\n\n  RTCPeerConnection.prototype.setRemoteDescription = function(description) {\n    var pc = this;\n\n    // Note: pranswer is not supported.\n    if (['offer', 'answer'].indexOf(description.type) === -1) {\n      return Promise.reject(makeError('TypeError',\n          'Unsupported type \"' + description.type + '\"'));\n    }\n\n    if (!isActionAllowedInSignalingState('setRemoteDescription',\n        description.type, pc.signalingState) || pc._isClosed) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not set remote ' + description.type +\n          ' in state ' + pc.signalingState));\n    }\n\n    var streams = {};\n    pc.remoteStreams.forEach(function(stream) {\n      streams[stream.id] = stream;\n    });\n    var receiverList = [];\n    var sections = SDPUtils.splitSections(description.sdp);\n    var sessionpart = sections.shift();\n    var isIceLite = SDPUtils.matchPrefix(sessionpart,\n        'a=ice-lite').length > 0;\n    var usingBundle = SDPUtils.matchPrefix(sessionpart,\n        'a=group:BUNDLE ').length > 0;\n    pc.usingBundle = usingBundle;\n    var iceOptions = SDPUtils.matchPrefix(sessionpart,\n        'a=ice-options:')[0];\n    if (iceOptions) {\n      pc.canTrickleIceCandidates = iceOptions.substr(14).split(' ')\n          .indexOf('trickle') >= 0;\n    } else {\n      pc.canTrickleIceCandidates = false;\n    }\n\n    sections.forEach(function(mediaSection, sdpMLineIndex) {\n      var lines = SDPUtils.splitLines(mediaSection);\n      var kind = SDPUtils.getKind(mediaSection);\n      // treat bundle-only as not-rejected.\n      var rejected = SDPUtils.isRejected(mediaSection) &&\n          SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n      var protocol = lines[0].substr(2).split(' ')[2];\n\n      var direction = SDPUtils.getDirection(mediaSection, sessionpart);\n      var remoteMsid = SDPUtils.parseMsid(mediaSection);\n\n      var mid = SDPUtils.getMid(mediaSection) || SDPUtils.generateIdentifier();\n\n      // Reject datachannels which are not implemented yet.\n      if (rejected || (kind === 'application' && (protocol === 'DTLS/SCTP' ||\n          protocol === 'UDP/DTLS/SCTP'))) {\n        // TODO: this is dangerous in the case where a non-rejected m-line\n        //     becomes rejected.\n        pc.transceivers[sdpMLineIndex] = {\n          mid: mid,\n          kind: kind,\n          protocol: protocol,\n          rejected: true\n        };\n        return;\n      }\n\n      if (!rejected && pc.transceivers[sdpMLineIndex] &&\n          pc.transceivers[sdpMLineIndex].rejected) {\n        // recycle a rejected transceiver.\n        pc.transceivers[sdpMLineIndex] = pc._createTransceiver(kind, true);\n      }\n\n      var transceiver;\n      var iceGatherer;\n      var iceTransport;\n      var dtlsTransport;\n      var rtpReceiver;\n      var sendEncodingParameters;\n      var recvEncodingParameters;\n      var localCapabilities;\n\n      var track;\n      // FIXME: ensure the mediaSection has rtcp-mux set.\n      var remoteCapabilities = SDPUtils.parseRtpParameters(mediaSection);\n      var remoteIceParameters;\n      var remoteDtlsParameters;\n      if (!rejected) {\n        remoteIceParameters = SDPUtils.getIceParameters(mediaSection,\n            sessionpart);\n        remoteDtlsParameters = SDPUtils.getDtlsParameters(mediaSection,\n            sessionpart);\n        remoteDtlsParameters.role = 'client';\n      }\n      recvEncodingParameters =\n          SDPUtils.parseRtpEncodingParameters(mediaSection);\n\n      var rtcpParameters = SDPUtils.parseRtcpParameters(mediaSection);\n\n      var isComplete = SDPUtils.matchPrefix(mediaSection,\n          'a=end-of-candidates', sessionpart).length > 0;\n      var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:')\n          .map(function(cand) {\n            return SDPUtils.parseCandidate(cand);\n          })\n          .filter(function(cand) {\n            return cand.component === 1;\n          });\n\n      // Check if we can use BUNDLE and dispose transports.\n      if ((description.type === 'offer' || description.type === 'answer') &&\n          !rejected && usingBundle && sdpMLineIndex > 0 &&\n          pc.transceivers[sdpMLineIndex]) {\n        pc._disposeIceAndDtlsTransports(sdpMLineIndex);\n        pc.transceivers[sdpMLineIndex].iceGatherer =\n            pc.transceivers[0].iceGatherer;\n        pc.transceivers[sdpMLineIndex].iceTransport =\n            pc.transceivers[0].iceTransport;\n        pc.transceivers[sdpMLineIndex].dtlsTransport =\n            pc.transceivers[0].dtlsTransport;\n        if (pc.transceivers[sdpMLineIndex].rtpSender) {\n          pc.transceivers[sdpMLineIndex].rtpSender.setTransport(\n              pc.transceivers[0].dtlsTransport);\n        }\n        if (pc.transceivers[sdpMLineIndex].rtpReceiver) {\n          pc.transceivers[sdpMLineIndex].rtpReceiver.setTransport(\n              pc.transceivers[0].dtlsTransport);\n        }\n      }\n      if (description.type === 'offer' && !rejected) {\n        transceiver = pc.transceivers[sdpMLineIndex] ||\n            pc._createTransceiver(kind);\n        transceiver.mid = mid;\n\n        if (!transceiver.iceGatherer) {\n          transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n              usingBundle);\n        }\n\n        if (cands.length && transceiver.iceTransport.state === 'new') {\n          if (isComplete && (!usingBundle || sdpMLineIndex === 0)) {\n            transceiver.iceTransport.setRemoteCandidates(cands);\n          } else {\n            cands.forEach(function(candidate) {\n              maybeAddCandidate(transceiver.iceTransport, candidate);\n            });\n          }\n        }\n\n        localCapabilities = window.RTCRtpReceiver.getCapabilities(kind);\n\n        // filter RTX until additional stuff needed for RTX is implemented\n        // in adapter.js\n        if (edgeVersion < 15019) {\n          localCapabilities.codecs = localCapabilities.codecs.filter(\n              function(codec) {\n                return codec.name !== 'rtx';\n              });\n        }\n\n        sendEncodingParameters = transceiver.sendEncodingParameters || [{\n          ssrc: (2 * sdpMLineIndex + 2) * 1001\n        }];\n\n        // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n        var isNewTrack = false;\n        if (direction === 'sendrecv' || direction === 'sendonly') {\n          isNewTrack = !transceiver.rtpReceiver;\n          rtpReceiver = transceiver.rtpReceiver ||\n              new window.RTCRtpReceiver(transceiver.dtlsTransport, kind);\n\n          if (isNewTrack) {\n            var stream;\n            track = rtpReceiver.track;\n            // FIXME: does not work with Plan B.\n            if (remoteMsid && remoteMsid.stream === '-') {\n              // no-op. a stream id of '-' means: no associated stream.\n            } else if (remoteMsid) {\n              if (!streams[remoteMsid.stream]) {\n                streams[remoteMsid.stream] = new window.MediaStream();\n                Object.defineProperty(streams[remoteMsid.stream], 'id', {\n                  get: function() {\n                    return remoteMsid.stream;\n                  }\n                });\n              }\n              Object.defineProperty(track, 'id', {\n                get: function() {\n                  return remoteMsid.track;\n                }\n              });\n              stream = streams[remoteMsid.stream];\n            } else {\n              if (!streams.default) {\n                streams.default = new window.MediaStream();\n              }\n              stream = streams.default;\n            }\n            if (stream) {\n              addTrackToStreamAndFireEvent(track, stream);\n              transceiver.associatedRemoteMediaStreams.push(stream);\n            }\n            receiverList.push([track, rtpReceiver, stream]);\n          }\n        } else if (transceiver.rtpReceiver && transceiver.rtpReceiver.track) {\n          transceiver.associatedRemoteMediaStreams.forEach(function(s) {\n            var nativeTrack = s.getTracks().find(function(t) {\n              return t.id === transceiver.rtpReceiver.track.id;\n            });\n            if (nativeTrack) {\n              removeTrackFromStreamAndFireEvent(nativeTrack, s);\n            }\n          });\n          transceiver.associatedRemoteMediaStreams = [];\n        }\n\n        transceiver.localCapabilities = localCapabilities;\n        transceiver.remoteCapabilities = remoteCapabilities;\n        transceiver.rtpReceiver = rtpReceiver;\n        transceiver.rtcpParameters = rtcpParameters;\n        transceiver.sendEncodingParameters = sendEncodingParameters;\n        transceiver.recvEncodingParameters = recvEncodingParameters;\n\n        // Start the RTCRtpReceiver now. The RTPSender is started in\n        // setLocalDescription.\n        pc._transceive(pc.transceivers[sdpMLineIndex],\n            false,\n            isNewTrack);\n      } else if (description.type === 'answer' && !rejected) {\n        transceiver = pc.transceivers[sdpMLineIndex];\n        iceGatherer = transceiver.iceGatherer;\n        iceTransport = transceiver.iceTransport;\n        dtlsTransport = transceiver.dtlsTransport;\n        rtpReceiver = transceiver.rtpReceiver;\n        sendEncodingParameters = transceiver.sendEncodingParameters;\n        localCapabilities = transceiver.localCapabilities;\n\n        pc.transceivers[sdpMLineIndex].recvEncodingParameters =\n            recvEncodingParameters;\n        pc.transceivers[sdpMLineIndex].remoteCapabilities =\n            remoteCapabilities;\n        pc.transceivers[sdpMLineIndex].rtcpParameters = rtcpParameters;\n\n        if (cands.length && iceTransport.state === 'new') {\n          if ((isIceLite || isComplete) &&\n              (!usingBundle || sdpMLineIndex === 0)) {\n            iceTransport.setRemoteCandidates(cands);\n          } else {\n            cands.forEach(function(candidate) {\n              maybeAddCandidate(transceiver.iceTransport, candidate);\n            });\n          }\n        }\n\n        if (!usingBundle || sdpMLineIndex === 0) {\n          if (iceTransport.state === 'new') {\n            iceTransport.start(iceGatherer, remoteIceParameters,\n                'controlling');\n          }\n          if (dtlsTransport.state === 'new') {\n            dtlsTransport.start(remoteDtlsParameters);\n          }\n        }\n\n        // If the offer contained RTX but the answer did not,\n        // remove RTX from sendEncodingParameters.\n        var commonCapabilities = getCommonCapabilities(\n          transceiver.localCapabilities,\n          transceiver.remoteCapabilities);\n\n        var hasRtx = commonCapabilities.codecs.filter(function(c) {\n          return c.name.toLowerCase() === 'rtx';\n        }).length;\n        if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n          delete transceiver.sendEncodingParameters[0].rtx;\n        }\n\n        pc._transceive(transceiver,\n            direction === 'sendrecv' || direction === 'recvonly',\n            direction === 'sendrecv' || direction === 'sendonly');\n\n        // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n        if (rtpReceiver &&\n            (direction === 'sendrecv' || direction === 'sendonly')) {\n          track = rtpReceiver.track;\n          if (remoteMsid) {\n            if (!streams[remoteMsid.stream]) {\n              streams[remoteMsid.stream] = new window.MediaStream();\n            }\n            addTrackToStreamAndFireEvent(track, streams[remoteMsid.stream]);\n            receiverList.push([track, rtpReceiver, streams[remoteMsid.stream]]);\n          } else {\n            if (!streams.default) {\n              streams.default = new window.MediaStream();\n            }\n            addTrackToStreamAndFireEvent(track, streams.default);\n            receiverList.push([track, rtpReceiver, streams.default]);\n          }\n        } else {\n          // FIXME: actually the receiver should be created later.\n          delete transceiver.rtpReceiver;\n        }\n      }\n    });\n\n    if (pc._dtlsRole === undefined) {\n      pc._dtlsRole = description.type === 'offer' ? 'active' : 'passive';\n    }\n\n    pc._remoteDescription = {\n      type: description.type,\n      sdp: description.sdp\n    };\n    if (description.type === 'offer') {\n      pc._updateSignalingState('have-remote-offer');\n    } else {\n      pc._updateSignalingState('stable');\n    }\n    Object.keys(streams).forEach(function(sid) {\n      var stream = streams[sid];\n      if (stream.getTracks().length) {\n        if (pc.remoteStreams.indexOf(stream) === -1) {\n          pc.remoteStreams.push(stream);\n          var event = new Event('addstream');\n          event.stream = stream;\n          window.setTimeout(function() {\n            pc._dispatchEvent('addstream', event);\n          });\n        }\n\n        receiverList.forEach(function(item) {\n          var track = item[0];\n          var receiver = item[1];\n          if (stream.id !== item[2].id) {\n            return;\n          }\n          fireAddTrack(pc, track, receiver, [stream]);\n        });\n      }\n    });\n    receiverList.forEach(function(item) {\n      if (item[2]) {\n        return;\n      }\n      fireAddTrack(pc, item[0], item[1], []);\n    });\n\n    // check whether addIceCandidate({}) was called within four seconds after\n    // setRemoteDescription.\n    window.setTimeout(function() {\n      if (!(pc && pc.transceivers)) {\n        return;\n      }\n      pc.transceivers.forEach(function(transceiver) {\n        if (transceiver.iceTransport &&\n            transceiver.iceTransport.state === 'new' &&\n            transceiver.iceTransport.getRemoteCandidates().length > 0) {\n          console.warn('Timeout for addRemoteCandidate. Consider sending ' +\n              'an end-of-candidates notification');\n          transceiver.iceTransport.addRemoteCandidate({});\n        }\n      });\n    }, 4000);\n\n    return Promise.resolve();\n  };\n\n  RTCPeerConnection.prototype.close = function() {\n    this.transceivers.forEach(function(transceiver) {\n      /* not yet\n      if (transceiver.iceGatherer) {\n        transceiver.iceGatherer.close();\n      }\n      */\n      if (transceiver.iceTransport) {\n        transceiver.iceTransport.stop();\n      }\n      if (transceiver.dtlsTransport) {\n        transceiver.dtlsTransport.stop();\n      }\n      if (transceiver.rtpSender) {\n        transceiver.rtpSender.stop();\n      }\n      if (transceiver.rtpReceiver) {\n        transceiver.rtpReceiver.stop();\n      }\n    });\n    // FIXME: clean up tracks, local streams, remote streams, etc\n    this._isClosed = true;\n    this._updateSignalingState('closed');\n  };\n\n  // Update the signaling state.\n  RTCPeerConnection.prototype._updateSignalingState = function(newState) {\n    this.signalingState = newState;\n    var event = new Event('signalingstatechange');\n    this._dispatchEvent('signalingstatechange', event);\n  };\n\n  // Determine whether to fire the negotiationneeded event.\n  RTCPeerConnection.prototype._maybeFireNegotiationNeeded = function() {\n    var pc = this;\n    if (this.signalingState !== 'stable' || this.needNegotiation === true) {\n      return;\n    }\n    this.needNegotiation = true;\n    window.setTimeout(function() {\n      if (pc.needNegotiation) {\n        pc.needNegotiation = false;\n        var event = new Event('negotiationneeded');\n        pc._dispatchEvent('negotiationneeded', event);\n      }\n    }, 0);\n  };\n\n  // Update the ice connection state.\n  RTCPeerConnection.prototype._updateIceConnectionState = function() {\n    var newState;\n    var states = {\n      'new': 0,\n      closed: 0,\n      checking: 0,\n      connected: 0,\n      completed: 0,\n      disconnected: 0,\n      failed: 0\n    };\n    this.transceivers.forEach(function(transceiver) {\n      states[transceiver.iceTransport.state]++;\n    });\n\n    newState = 'new';\n    if (states.failed > 0) {\n      newState = 'failed';\n    } else if (states.checking > 0) {\n      newState = 'checking';\n    } else if (states.disconnected > 0) {\n      newState = 'disconnected';\n    } else if (states.new > 0) {\n      newState = 'new';\n    } else if (states.connected > 0) {\n      newState = 'connected';\n    } else if (states.completed > 0) {\n      newState = 'completed';\n    }\n\n    if (newState !== this.iceConnectionState) {\n      this.iceConnectionState = newState;\n      var event = new Event('iceconnectionstatechange');\n      this._dispatchEvent('iceconnectionstatechange', event);\n    }\n  };\n\n  // Update the connection state.\n  RTCPeerConnection.prototype._updateConnectionState = function() {\n    var newState;\n    var states = {\n      'new': 0,\n      closed: 0,\n      connecting: 0,\n      connected: 0,\n      completed: 0,\n      disconnected: 0,\n      failed: 0\n    };\n    this.transceivers.forEach(function(transceiver) {\n      states[transceiver.iceTransport.state]++;\n      states[transceiver.dtlsTransport.state]++;\n    });\n    // ICETransport.completed and connected are the same for this purpose.\n    states.connected += states.completed;\n\n    newState = 'new';\n    if (states.failed > 0) {\n      newState = 'failed';\n    } else if (states.connecting > 0) {\n      newState = 'connecting';\n    } else if (states.disconnected > 0) {\n      newState = 'disconnected';\n    } else if (states.new > 0) {\n      newState = 'new';\n    } else if (states.connected > 0) {\n      newState = 'connected';\n    }\n\n    if (newState !== this.connectionState) {\n      this.connectionState = newState;\n      var event = new Event('connectionstatechange');\n      this._dispatchEvent('connectionstatechange', event);\n    }\n  };\n\n  RTCPeerConnection.prototype.createOffer = function() {\n    var pc = this;\n\n    if (pc._isClosed) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not call createOffer after close'));\n    }\n\n    var numAudioTracks = pc.transceivers.filter(function(t) {\n      return t.kind === 'audio';\n    }).length;\n    var numVideoTracks = pc.transceivers.filter(function(t) {\n      return t.kind === 'video';\n    }).length;\n\n    // Determine number of audio and video tracks we need to send/recv.\n    var offerOptions = arguments[0];\n    if (offerOptions) {\n      // Reject Chrome legacy constraints.\n      if (offerOptions.mandatory || offerOptions.optional) {\n        throw new TypeError(\n            'Legacy mandatory/optional constraints not supported.');\n      }\n      if (offerOptions.offerToReceiveAudio !== undefined) {\n        if (offerOptions.offerToReceiveAudio === true) {\n          numAudioTracks = 1;\n        } else if (offerOptions.offerToReceiveAudio === false) {\n          numAudioTracks = 0;\n        } else {\n          numAudioTracks = offerOptions.offerToReceiveAudio;\n        }\n      }\n      if (offerOptions.offerToReceiveVideo !== undefined) {\n        if (offerOptions.offerToReceiveVideo === true) {\n          numVideoTracks = 1;\n        } else if (offerOptions.offerToReceiveVideo === false) {\n          numVideoTracks = 0;\n        } else {\n          numVideoTracks = offerOptions.offerToReceiveVideo;\n        }\n      }\n    }\n\n    pc.transceivers.forEach(function(transceiver) {\n      if (transceiver.kind === 'audio') {\n        numAudioTracks--;\n        if (numAudioTracks < 0) {\n          transceiver.wantReceive = false;\n        }\n      } else if (transceiver.kind === 'video') {\n        numVideoTracks--;\n        if (numVideoTracks < 0) {\n          transceiver.wantReceive = false;\n        }\n      }\n    });\n\n    // Create M-lines for recvonly streams.\n    while (numAudioTracks > 0 || numVideoTracks > 0) {\n      if (numAudioTracks > 0) {\n        pc._createTransceiver('audio');\n        numAudioTracks--;\n      }\n      if (numVideoTracks > 0) {\n        pc._createTransceiver('video');\n        numVideoTracks--;\n      }\n    }\n\n    var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n        pc._sdpSessionVersion++);\n    pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n      // For each track, create an ice gatherer, ice transport,\n      // dtls transport, potentially rtpsender and rtpreceiver.\n      var track = transceiver.track;\n      var kind = transceiver.kind;\n      var mid = transceiver.mid || SDPUtils.generateIdentifier();\n      transceiver.mid = mid;\n\n      if (!transceiver.iceGatherer) {\n        transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n            pc.usingBundle);\n      }\n\n      var localCapabilities = window.RTCRtpSender.getCapabilities(kind);\n      // filter RTX until additional stuff needed for RTX is implemented\n      // in adapter.js\n      if (edgeVersion < 15019) {\n        localCapabilities.codecs = localCapabilities.codecs.filter(\n            function(codec) {\n              return codec.name !== 'rtx';\n            });\n      }\n      localCapabilities.codecs.forEach(function(codec) {\n        // work around https://bugs.chromium.org/p/webrtc/issues/detail?id=6552\n        // by adding level-asymmetry-allowed=1\n        if (codec.name === 'H264' &&\n            codec.parameters['level-asymmetry-allowed'] === undefined) {\n          codec.parameters['level-asymmetry-allowed'] = '1';\n        }\n\n        // for subsequent offers, we might have to re-use the payload\n        // type of the last offer.\n        if (transceiver.remoteCapabilities &&\n            transceiver.remoteCapabilities.codecs) {\n          transceiver.remoteCapabilities.codecs.forEach(function(remoteCodec) {\n            if (codec.name.toLowerCase() === remoteCodec.name.toLowerCase() &&\n                codec.clockRate === remoteCodec.clockRate) {\n              codec.preferredPayloadType = remoteCodec.payloadType;\n            }\n          });\n        }\n      });\n      localCapabilities.headerExtensions.forEach(function(hdrExt) {\n        var remoteExtensions = transceiver.remoteCapabilities &&\n            transceiver.remoteCapabilities.headerExtensions || [];\n        remoteExtensions.forEach(function(rHdrExt) {\n          if (hdrExt.uri === rHdrExt.uri) {\n            hdrExt.id = rHdrExt.id;\n          }\n        });\n      });\n\n      // generate an ssrc now, to be used later in rtpSender.send\n      var sendEncodingParameters = transceiver.sendEncodingParameters || [{\n        ssrc: (2 * sdpMLineIndex + 1) * 1001\n      }];\n      if (track) {\n        // add RTX\n        if (edgeVersion >= 15019 && kind === 'video' &&\n            !sendEncodingParameters[0].rtx) {\n          sendEncodingParameters[0].rtx = {\n            ssrc: sendEncodingParameters[0].ssrc + 1\n          };\n        }\n      }\n\n      if (transceiver.wantReceive) {\n        transceiver.rtpReceiver = new window.RTCRtpReceiver(\n            transceiver.dtlsTransport, kind);\n      }\n\n      transceiver.localCapabilities = localCapabilities;\n      transceiver.sendEncodingParameters = sendEncodingParameters;\n    });\n\n    // always offer BUNDLE and dispose on return if not supported.\n    if (pc._config.bundlePolicy !== 'max-compat') {\n      sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n        return t.mid;\n      }).join(' ') + '\\r\\n';\n    }\n    sdp += 'a=ice-options:trickle\\r\\n';\n\n    pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n      sdp += writeMediaSection(transceiver, transceiver.localCapabilities,\n          'offer', transceiver.stream, pc._dtlsRole);\n      sdp += 'a=rtcp-rsize\\r\\n';\n\n      if (transceiver.iceGatherer && pc.iceGatheringState !== 'new' &&\n          (sdpMLineIndex === 0 || !pc.usingBundle)) {\n        transceiver.iceGatherer.getLocalCandidates().forEach(function(cand) {\n          cand.component = 1;\n          sdp += 'a=' + SDPUtils.writeCandidate(cand) + '\\r\\n';\n        });\n\n        if (transceiver.iceGatherer.state === 'completed') {\n          sdp += 'a=end-of-candidates\\r\\n';\n        }\n      }\n    });\n\n    var desc = new window.RTCSessionDescription({\n      type: 'offer',\n      sdp: sdp\n    });\n    return Promise.resolve(desc);\n  };\n\n  RTCPeerConnection.prototype.createAnswer = function() {\n    var pc = this;\n\n    if (pc._isClosed) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not call createAnswer after close'));\n    }\n\n    if (!(pc.signalingState === 'have-remote-offer' ||\n        pc.signalingState === 'have-local-pranswer')) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not call createAnswer in signalingState ' + pc.signalingState));\n    }\n\n    var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n        pc._sdpSessionVersion++);\n    if (pc.usingBundle) {\n      sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n        return t.mid;\n      }).join(' ') + '\\r\\n';\n    }\n    sdp += 'a=ice-options:trickle\\r\\n';\n\n    var mediaSectionsInOffer = SDPUtils.getMediaSections(\n        pc._remoteDescription.sdp).length;\n    pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n      if (sdpMLineIndex + 1 > mediaSectionsInOffer) {\n        return;\n      }\n      if (transceiver.rejected) {\n        if (transceiver.kind === 'application') {\n          if (transceiver.protocol === 'DTLS/SCTP') { // legacy fmt\n            sdp += 'm=application 0 DTLS/SCTP 5000\\r\\n';\n          } else {\n            sdp += 'm=application 0 ' + transceiver.protocol +\n                ' webrtc-datachannel\\r\\n';\n          }\n        } else if (transceiver.kind === 'audio') {\n          sdp += 'm=audio 0 UDP/TLS/RTP/SAVPF 0\\r\\n' +\n              'a=rtpmap:0 PCMU/8000\\r\\n';\n        } else if (transceiver.kind === 'video') {\n          sdp += 'm=video 0 UDP/TLS/RTP/SAVPF 120\\r\\n' +\n              'a=rtpmap:120 VP8/90000\\r\\n';\n        }\n        sdp += 'c=IN IP4 0.0.0.0\\r\\n' +\n            'a=inactive\\r\\n' +\n            'a=mid:' + transceiver.mid + '\\r\\n';\n        return;\n      }\n\n      // FIXME: look at direction.\n      if (transceiver.stream) {\n        var localTrack;\n        if (transceiver.kind === 'audio') {\n          localTrack = transceiver.stream.getAudioTracks()[0];\n        } else if (transceiver.kind === 'video') {\n          localTrack = transceiver.stream.getVideoTracks()[0];\n        }\n        if (localTrack) {\n          // add RTX\n          if (edgeVersion >= 15019 && transceiver.kind === 'video' &&\n              !transceiver.sendEncodingParameters[0].rtx) {\n            transceiver.sendEncodingParameters[0].rtx = {\n              ssrc: transceiver.sendEncodingParameters[0].ssrc + 1\n            };\n          }\n        }\n      }\n\n      // Calculate intersection of capabilities.\n      var commonCapabilities = getCommonCapabilities(\n          transceiver.localCapabilities,\n          transceiver.remoteCapabilities);\n\n      var hasRtx = commonCapabilities.codecs.filter(function(c) {\n        return c.name.toLowerCase() === 'rtx';\n      }).length;\n      if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n        delete transceiver.sendEncodingParameters[0].rtx;\n      }\n\n      sdp += writeMediaSection(transceiver, commonCapabilities,\n          'answer', transceiver.stream, pc._dtlsRole);\n      if (transceiver.rtcpParameters &&\n          transceiver.rtcpParameters.reducedSize) {\n        sdp += 'a=rtcp-rsize\\r\\n';\n      }\n    });\n\n    var desc = new window.RTCSessionDescription({\n      type: 'answer',\n      sdp: sdp\n    });\n    return Promise.resolve(desc);\n  };\n\n  RTCPeerConnection.prototype.addIceCandidate = function(candidate) {\n    var pc = this;\n    var sections;\n    if (candidate && !(candidate.sdpMLineIndex !== undefined ||\n        candidate.sdpMid)) {\n      return Promise.reject(new TypeError('sdpMLineIndex or sdpMid required'));\n    }\n\n    // TODO: needs to go into ops queue.\n    return new Promise(function(resolve, reject) {\n      if (!pc._remoteDescription) {\n        return reject(makeError('InvalidStateError',\n            'Can not add ICE candidate without a remote description'));\n      } else if (!candidate || candidate.candidate === '') {\n        for (var j = 0; j < pc.transceivers.length; j++) {\n          if (pc.transceivers[j].rejected) {\n            continue;\n          }\n          pc.transceivers[j].iceTransport.addRemoteCandidate({});\n          sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n          sections[j] += 'a=end-of-candidates\\r\\n';\n          pc._remoteDescription.sdp =\n              SDPUtils.getDescription(pc._remoteDescription.sdp) +\n              sections.join('');\n          if (pc.usingBundle) {\n            break;\n          }\n        }\n      } else {\n        var sdpMLineIndex = candidate.sdpMLineIndex;\n        if (candidate.sdpMid) {\n          for (var i = 0; i < pc.transceivers.length; i++) {\n            if (pc.transceivers[i].mid === candidate.sdpMid) {\n              sdpMLineIndex = i;\n              break;\n            }\n          }\n        }\n        var transceiver = pc.transceivers[sdpMLineIndex];\n        if (transceiver) {\n          if (transceiver.rejected) {\n            return resolve();\n          }\n          var cand = Object.keys(candidate.candidate).length > 0 ?\n              SDPUtils.parseCandidate(candidate.candidate) : {};\n          // Ignore Chrome's invalid candidates since Edge does not like them.\n          if (cand.protocol === 'tcp' && (cand.port === 0 || cand.port === 9)) {\n            return resolve();\n          }\n          // Ignore RTCP candidates, we assume RTCP-MUX.\n          if (cand.component && cand.component !== 1) {\n            return resolve();\n          }\n          // when using bundle, avoid adding candidates to the wrong\n          // ice transport. And avoid adding candidates added in the SDP.\n          if (sdpMLineIndex === 0 || (sdpMLineIndex > 0 &&\n              transceiver.iceTransport !== pc.transceivers[0].iceTransport)) {\n            if (!maybeAddCandidate(transceiver.iceTransport, cand)) {\n              return reject(makeError('OperationError',\n                  'Can not add ICE candidate'));\n            }\n          }\n\n          // update the remoteDescription.\n          var candidateString = candidate.candidate.trim();\n          if (candidateString.indexOf('a=') === 0) {\n            candidateString = candidateString.substr(2);\n          }\n          sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n          sections[sdpMLineIndex] += 'a=' +\n              (cand.type ? candidateString : 'end-of-candidates')\n              + '\\r\\n';\n          pc._remoteDescription.sdp =\n              SDPUtils.getDescription(pc._remoteDescription.sdp) +\n              sections.join('');\n        } else {\n          return reject(makeError('OperationError',\n              'Can not add ICE candidate'));\n        }\n      }\n      resolve();\n    });\n  };\n\n  RTCPeerConnection.prototype.getStats = function(selector) {\n    if (selector && selector instanceof window.MediaStreamTrack) {\n      var senderOrReceiver = null;\n      this.transceivers.forEach(function(transceiver) {\n        if (transceiver.rtpSender &&\n            transceiver.rtpSender.track === selector) {\n          senderOrReceiver = transceiver.rtpSender;\n        } else if (transceiver.rtpReceiver &&\n            transceiver.rtpReceiver.track === selector) {\n          senderOrReceiver = transceiver.rtpReceiver;\n        }\n      });\n      if (!senderOrReceiver) {\n        throw makeError('InvalidAccessError', 'Invalid selector.');\n      }\n      return senderOrReceiver.getStats();\n    }\n\n    var promises = [];\n    this.transceivers.forEach(function(transceiver) {\n      ['rtpSender', 'rtpReceiver', 'iceGatherer', 'iceTransport',\n          'dtlsTransport'].forEach(function(method) {\n            if (transceiver[method]) {\n              promises.push(transceiver[method].getStats());\n            }\n          });\n    });\n    return Promise.all(promises).then(function(allStats) {\n      var results = new Map();\n      allStats.forEach(function(stats) {\n        stats.forEach(function(stat) {\n          results.set(stat.id, stat);\n        });\n      });\n      return results;\n    });\n  };\n\n  // fix low-level stat names and return Map instead of object.\n  var ortcObjects = ['RTCRtpSender', 'RTCRtpReceiver', 'RTCIceGatherer',\n    'RTCIceTransport', 'RTCDtlsTransport'];\n  ortcObjects.forEach(function(ortcObjectName) {\n    var obj = window[ortcObjectName];\n    if (obj && obj.prototype && obj.prototype.getStats) {\n      var nativeGetstats = obj.prototype.getStats;\n      obj.prototype.getStats = function() {\n        return nativeGetstats.apply(this)\n        .then(function(nativeStats) {\n          var mapStats = new Map();\n          Object.keys(nativeStats).forEach(function(id) {\n            nativeStats[id].type = fixStatsType(nativeStats[id]);\n            mapStats.set(id, nativeStats[id]);\n          });\n          return mapStats;\n        });\n      };\n    }\n  });\n\n  // legacy callback shims. Should be moved to adapter.js some days.\n  var methods = ['createOffer', 'createAnswer'];\n  methods.forEach(function(method) {\n    var nativeMethod = RTCPeerConnection.prototype[method];\n    RTCPeerConnection.prototype[method] = function() {\n      var args = arguments;\n      if (typeof args[0] === 'function' ||\n          typeof args[1] === 'function') { // legacy\n        return nativeMethod.apply(this, [arguments[2]])\n        .then(function(description) {\n          if (typeof args[0] === 'function') {\n            args[0].apply(null, [description]);\n          }\n        }, function(error) {\n          if (typeof args[1] === 'function') {\n            args[1].apply(null, [error]);\n          }\n        });\n      }\n      return nativeMethod.apply(this, arguments);\n    };\n  });\n\n  methods = ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'];\n  methods.forEach(function(method) {\n    var nativeMethod = RTCPeerConnection.prototype[method];\n    RTCPeerConnection.prototype[method] = function() {\n      var args = arguments;\n      if (typeof args[1] === 'function' ||\n          typeof args[2] === 'function') { // legacy\n        return nativeMethod.apply(this, arguments)\n        .then(function() {\n          if (typeof args[1] === 'function') {\n            args[1].apply(null);\n          }\n        }, function(error) {\n          if (typeof args[2] === 'function') {\n            args[2].apply(null, [error]);\n          }\n        });\n      }\n      return nativeMethod.apply(this, arguments);\n    };\n  });\n\n  // getStats is special. It doesn't have a spec legacy method yet we support\n  // getStats(something, cb) without error callbacks.\n  ['getStats'].forEach(function(method) {\n    var nativeMethod = RTCPeerConnection.prototype[method];\n    RTCPeerConnection.prototype[method] = function() {\n      var args = arguments;\n      if (typeof args[1] === 'function') {\n        return nativeMethod.apply(this, arguments)\n        .then(function() {\n          if (typeof args[1] === 'function') {\n            args[1].apply(null);\n          }\n        });\n      }\n      return nativeMethod.apply(this, arguments);\n    };\n  });\n\n  return RTCPeerConnection;\n};\n\n},{\"sdp\":2}],2:[function(require,module,exports){\n /* eslint-env node */\n'use strict';\n\n// SDP helpers.\nvar SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n  return Math.random().toString(36).substr(2, 10);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n  return blob.trim().split('\\n').map(function(line) {\n    return line.trim();\n  });\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n  var parts = blob.split('\\nm=');\n  return parts.map(function(part, index) {\n    return (index > 0 ? 'm=' + part : part).trim() + '\\r\\n';\n  });\n};\n\n// returns the session description.\nSDPUtils.getDescription = function(blob) {\n  var sections = SDPUtils.splitSections(blob);\n  return sections && sections[0];\n};\n\n// returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n  var sections = SDPUtils.splitSections(blob);\n  sections.shift();\n  return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n  return SDPUtils.splitLines(blob).filter(function(line) {\n    return line.indexOf(prefix) === 0;\n  });\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\nSDPUtils.parseCandidate = function(line) {\n  var parts;\n  // Parse both variants.\n  if (line.indexOf('a=candidate:') === 0) {\n    parts = line.substring(12).split(' ');\n  } else {\n    parts = line.substring(10).split(' ');\n  }\n\n  var candidate = {\n    foundation: parts[0],\n    component: parseInt(parts[1], 10),\n    protocol: parts[2].toLowerCase(),\n    priority: parseInt(parts[3], 10),\n    ip: parts[4],\n    address: parts[4], // address is an alias for ip.\n    port: parseInt(parts[5], 10),\n    // skip parts[6] == 'typ'\n    type: parts[7]\n  };\n\n  for (var i = 8; i < parts.length; i += 2) {\n    switch (parts[i]) {\n      case 'raddr':\n        candidate.relatedAddress = parts[i + 1];\n        break;\n      case 'rport':\n        candidate.relatedPort = parseInt(parts[i + 1], 10);\n        break;\n      case 'tcptype':\n        candidate.tcpType = parts[i + 1];\n        break;\n      case 'ufrag':\n        candidate.ufrag = parts[i + 1]; // for backward compability.\n        candidate.usernameFragment = parts[i + 1];\n        break;\n      default: // extension handling, in particular ufrag\n        candidate[parts[i]] = parts[i + 1];\n        break;\n    }\n  }\n  return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\nSDPUtils.writeCandidate = function(candidate) {\n  var sdp = [];\n  sdp.push(candidate.foundation);\n  sdp.push(candidate.component);\n  sdp.push(candidate.protocol.toUpperCase());\n  sdp.push(candidate.priority);\n  sdp.push(candidate.address || candidate.ip);\n  sdp.push(candidate.port);\n\n  var type = candidate.type;\n  sdp.push('typ');\n  sdp.push(type);\n  if (type !== 'host' && candidate.relatedAddress &&\n      candidate.relatedPort) {\n    sdp.push('raddr');\n    sdp.push(candidate.relatedAddress);\n    sdp.push('rport');\n    sdp.push(candidate.relatedPort);\n  }\n  if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n    sdp.push('tcptype');\n    sdp.push(candidate.tcpType);\n  }\n  if (candidate.usernameFragment || candidate.ufrag) {\n    sdp.push('ufrag');\n    sdp.push(candidate.usernameFragment || candidate.ufrag);\n  }\n  return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n  return line.substr(14).split(' ');\n};\n\n// Parses an rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n  var parts = line.substr(9).split(' ');\n  var parsed = {\n    payloadType: parseInt(parts.shift(), 10) // was: id\n  };\n\n  parts = parts[0].split('/');\n\n  parsed.name = parts[0];\n  parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n  parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n  // legacy alias, got renamed back to channels in ORTC.\n  parsed.numChannels = parsed.channels;\n  return parsed;\n};\n\n// Generate an a=rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n  var pt = codec.payloadType;\n  if (codec.preferredPayloadType !== undefined) {\n    pt = codec.preferredPayloadType;\n  }\n  var channels = codec.channels || codec.numChannels || 1;\n  return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n      (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses an a=extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n  var parts = line.substr(9).split(' ');\n  return {\n    id: parseInt(parts[0], 10),\n    direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n    uri: parts[1]\n  };\n};\n\n// Generates a=extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n  return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n      (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n          ? '/' + headerExtension.direction\n          : '') +\n      ' ' + headerExtension.uri + '\\r\\n';\n};\n\n// Parses an ftmp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n  var parsed = {};\n  var kv;\n  var parts = line.substr(line.indexOf(' ') + 1).split(';');\n  for (var j = 0; j < parts.length; j++) {\n    kv = parts[j].trim().split('=');\n    parsed[kv[0].trim()] = kv[1];\n  }\n  return parsed;\n};\n\n// Generates an a=ftmp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n  var line = '';\n  var pt = codec.payloadType;\n  if (codec.preferredPayloadType !== undefined) {\n    pt = codec.preferredPayloadType;\n  }\n  if (codec.parameters && Object.keys(codec.parameters).length) {\n    var params = [];\n    Object.keys(codec.parameters).forEach(function(param) {\n      if (codec.parameters[param]) {\n        params.push(param + '=' + codec.parameters[param]);\n      } else {\n        params.push(param);\n      }\n    });\n    line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n  }\n  return line;\n};\n\n// Parses an rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n  var parts = line.substr(line.indexOf(' ') + 1).split(' ');\n  return {\n    type: parts.shift(),\n    parameter: parts.join(' ')\n  };\n};\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n  var lines = '';\n  var pt = codec.payloadType;\n  if (codec.preferredPayloadType !== undefined) {\n    pt = codec.preferredPayloadType;\n  }\n  if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n    // FIXME: special handling for trr-int?\n    codec.rtcpFeedback.forEach(function(fb) {\n      lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n      (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n          '\\r\\n';\n    });\n  }\n  return lines;\n};\n\n// Parses an RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n  var sp = line.indexOf(' ');\n  var parts = {\n    ssrc: parseInt(line.substr(7, sp - 7), 10)\n  };\n  var colon = line.indexOf(':', sp);\n  if (colon > -1) {\n    parts.attribute = line.substr(sp + 1, colon - sp - 1);\n    parts.value = line.substr(colon + 1);\n  } else {\n    parts.attribute = line.substr(sp + 1);\n  }\n  return parts;\n};\n\nSDPUtils.parseSsrcGroup = function(line) {\n  var parts = line.substr(13).split(' ');\n  return {\n    semantics: parts.shift(),\n    ssrcs: parts.map(function(ssrc) {\n      return parseInt(ssrc, 10);\n    })\n  };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n  var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n  if (mid) {\n    return mid.substr(6);\n  }\n};\n\nSDPUtils.parseFingerprint = function(line) {\n  var parts = line.substr(14).split(' ');\n  return {\n    algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n    value: parts[1]\n  };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n//   get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n  var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n      'a=fingerprint:');\n  // Note: a=setup line is ignored since we use the 'auto' role.\n  // Note2: 'algorithm' is not case sensitive except in Edge.\n  return {\n    role: 'auto',\n    fingerprints: lines.map(SDPUtils.parseFingerprint)\n  };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n  var sdp = 'a=setup:' + setupType + '\\r\\n';\n  params.fingerprints.forEach(function(fp) {\n    sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n  });\n  return sdp;\n};\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n//   get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n  var lines = SDPUtils.splitLines(mediaSection);\n  // Search in session part, too.\n  lines = lines.concat(SDPUtils.splitLines(sessionpart));\n  var iceParameters = {\n    usernameFragment: lines.filter(function(line) {\n      return line.indexOf('a=ice-ufrag:') === 0;\n    })[0].substr(12),\n    password: lines.filter(function(line) {\n      return line.indexOf('a=ice-pwd:') === 0;\n    })[0].substr(10)\n  };\n  return iceParameters;\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n  return 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n      'a=ice-pwd:' + params.password + '\\r\\n';\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n  var description = {\n    codecs: [],\n    headerExtensions: [],\n    fecMechanisms: [],\n    rtcp: []\n  };\n  var lines = SDPUtils.splitLines(mediaSection);\n  var mline = lines[0].split(' ');\n  for (var i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n    var pt = mline[i];\n    var rtpmapline = SDPUtils.matchPrefix(\n        mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n    if (rtpmapline) {\n      var codec = SDPUtils.parseRtpMap(rtpmapline);\n      var fmtps = SDPUtils.matchPrefix(\n          mediaSection, 'a=fmtp:' + pt + ' ');\n      // Only the first a=fmtp:<pt> is considered.\n      codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n      codec.rtcpFeedback = SDPUtils.matchPrefix(\n          mediaSection, 'a=rtcp-fb:' + pt + ' ')\n        .map(SDPUtils.parseRtcpFb);\n      description.codecs.push(codec);\n      // parse FEC mechanisms from rtpmap lines.\n      switch (codec.name.toUpperCase()) {\n        case 'RED':\n        case 'ULPFEC':\n          description.fecMechanisms.push(codec.name.toUpperCase());\n          break;\n        default: // only RED and ULPFEC are recognized as FEC mechanisms.\n          break;\n      }\n    }\n  }\n  SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(function(line) {\n    description.headerExtensions.push(SDPUtils.parseExtmap(line));\n  });\n  // FIXME: parse rtcp.\n  return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n  var sdp = '';\n\n  // Build the mline.\n  sdp += 'm=' + kind + ' ';\n  sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n  sdp += ' UDP/TLS/RTP/SAVPF ';\n  sdp += caps.codecs.map(function(codec) {\n    if (codec.preferredPayloadType !== undefined) {\n      return codec.preferredPayloadType;\n    }\n    return codec.payloadType;\n  }).join(' ') + '\\r\\n';\n\n  sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n  sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n  // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n  caps.codecs.forEach(function(codec) {\n    sdp += SDPUtils.writeRtpMap(codec);\n    sdp += SDPUtils.writeFmtp(codec);\n    sdp += SDPUtils.writeRtcpFb(codec);\n  });\n  var maxptime = 0;\n  caps.codecs.forEach(function(codec) {\n    if (codec.maxptime > maxptime) {\n      maxptime = codec.maxptime;\n    }\n  });\n  if (maxptime > 0) {\n    sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n  }\n  sdp += 'a=rtcp-mux\\r\\n';\n\n  if (caps.headerExtensions) {\n    caps.headerExtensions.forEach(function(extension) {\n      sdp += SDPUtils.writeExtmap(extension);\n    });\n  }\n  // FIXME: write fecMechanisms.\n  return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n  var encodingParameters = [];\n  var description = SDPUtils.parseRtpParameters(mediaSection);\n  var hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n  var hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n  // filter a=ssrc:... cname:, ignore PlanB-msid\n  var ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n  .map(function(line) {\n    return SDPUtils.parseSsrcMedia(line);\n  })\n  .filter(function(parts) {\n    return parts.attribute === 'cname';\n  });\n  var primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n  var secondarySsrc;\n\n  var flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n  .map(function(line) {\n    var parts = line.substr(17).split(' ');\n    return parts.map(function(part) {\n      return parseInt(part, 10);\n    });\n  });\n  if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n    secondarySsrc = flows[0][1];\n  }\n\n  description.codecs.forEach(function(codec) {\n    if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n      var encParam = {\n        ssrc: primarySsrc,\n        codecPayloadType: parseInt(codec.parameters.apt, 10)\n      };\n      if (primarySsrc && secondarySsrc) {\n        encParam.rtx = {ssrc: secondarySsrc};\n      }\n      encodingParameters.push(encParam);\n      if (hasRed) {\n        encParam = JSON.parse(JSON.stringify(encParam));\n        encParam.fec = {\n          ssrc: primarySsrc,\n          mechanism: hasUlpfec ? 'red+ulpfec' : 'red'\n        };\n        encodingParameters.push(encParam);\n      }\n    }\n  });\n  if (encodingParameters.length === 0 && primarySsrc) {\n    encodingParameters.push({\n      ssrc: primarySsrc\n    });\n  }\n\n  // we support both b=AS and b=TIAS but interpret AS as TIAS.\n  var bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n  if (bandwidth.length) {\n    if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n      bandwidth = parseInt(bandwidth[0].substr(7), 10);\n    } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n      // use formula from JSEP to convert b=AS to TIAS value.\n      bandwidth = parseInt(bandwidth[0].substr(5), 10) * 1000 * 0.95\n          - (50 * 40 * 8);\n    } else {\n      bandwidth = undefined;\n    }\n    encodingParameters.forEach(function(params) {\n      params.maxBitrate = bandwidth;\n    });\n  }\n  return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n  var rtcpParameters = {};\n\n  // Gets the first SSRC. Note tha with RTX there might be multiple\n  // SSRCs.\n  var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n      .map(function(line) {\n        return SDPUtils.parseSsrcMedia(line);\n      })\n      .filter(function(obj) {\n        return obj.attribute === 'cname';\n      })[0];\n  if (remoteSsrc) {\n    rtcpParameters.cname = remoteSsrc.value;\n    rtcpParameters.ssrc = remoteSsrc.ssrc;\n  }\n\n  // Edge uses the compound attribute instead of reducedSize\n  // compound is !reducedSize\n  var rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n  rtcpParameters.reducedSize = rsize.length > 0;\n  rtcpParameters.compound = rsize.length === 0;\n\n  // parses the rtcp-mux attrіbute.\n  // Note that Edge does not support unmuxed RTCP.\n  var mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n  rtcpParameters.mux = mux.length > 0;\n\n  return rtcpParameters;\n};\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n  var parts;\n  var spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n  if (spec.length === 1) {\n    parts = spec[0].substr(7).split(' ');\n    return {stream: parts[0], track: parts[1]};\n  }\n  var planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n  .map(function(line) {\n    return SDPUtils.parseSsrcMedia(line);\n  })\n  .filter(function(msidParts) {\n    return msidParts.attribute === 'msid';\n  });\n  if (planB.length > 0) {\n    parts = planB[0].value.split(' ');\n    return {stream: parts[0], track: parts[1]};\n  }\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n  return Math.random().toString().substr(2, 21);\n};\n\n// Write boilder plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n  var sessionId;\n  var version = sessVer !== undefined ? sessVer : 2;\n  if (sessId) {\n    sessionId = sessId;\n  } else {\n    sessionId = SDPUtils.generateSessionId();\n  }\n  var user = sessUser || 'thisisadapterortc';\n  // FIXME: sess-id should be an NTP timestamp.\n  return 'v=0\\r\\n' +\n      'o=' + user + ' ' + sessionId + ' ' + version +\n        ' IN IP4 127.0.0.1\\r\\n' +\n      's=-\\r\\n' +\n      't=0 0\\r\\n';\n};\n\nSDPUtils.writeMediaSection = function(transceiver, caps, type, stream) {\n  var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n  // Map ICE parameters (ufrag, pwd) to SDP.\n  sdp += SDPUtils.writeIceParameters(\n      transceiver.iceGatherer.getLocalParameters());\n\n  // Map DTLS parameters to SDP.\n  sdp += SDPUtils.writeDtlsParameters(\n      transceiver.dtlsTransport.getLocalParameters(),\n      type === 'offer' ? 'actpass' : 'active');\n\n  sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n  if (transceiver.direction) {\n    sdp += 'a=' + transceiver.direction + '\\r\\n';\n  } else if (transceiver.rtpSender && transceiver.rtpReceiver) {\n    sdp += 'a=sendrecv\\r\\n';\n  } else if (transceiver.rtpSender) {\n    sdp += 'a=sendonly\\r\\n';\n  } else if (transceiver.rtpReceiver) {\n    sdp += 'a=recvonly\\r\\n';\n  } else {\n    sdp += 'a=inactive\\r\\n';\n  }\n\n  if (transceiver.rtpSender) {\n    // spec.\n    var msid = 'msid:' + stream.id + ' ' +\n        transceiver.rtpSender.track.id + '\\r\\n';\n    sdp += 'a=' + msid;\n\n    // for Chrome.\n    sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n        ' ' + msid;\n    if (transceiver.sendEncodingParameters[0].rtx) {\n      sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n          ' ' + msid;\n      sdp += 'a=ssrc-group:FID ' +\n          transceiver.sendEncodingParameters[0].ssrc + ' ' +\n          transceiver.sendEncodingParameters[0].rtx.ssrc +\n          '\\r\\n';\n    }\n  }\n  // FIXME: this should be written by writeRtpDescription.\n  sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n      ' cname:' + SDPUtils.localCName + '\\r\\n';\n  if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n    sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n        ' cname:' + SDPUtils.localCName + '\\r\\n';\n  }\n  return sdp;\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n  // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n  var lines = SDPUtils.splitLines(mediaSection);\n  for (var i = 0; i < lines.length; i++) {\n    switch (lines[i]) {\n      case 'a=sendrecv':\n      case 'a=sendonly':\n      case 'a=recvonly':\n      case 'a=inactive':\n        return lines[i].substr(2);\n      default:\n        // FIXME: What should happen here?\n    }\n  }\n  if (sessionpart) {\n    return SDPUtils.getDirection(sessionpart);\n  }\n  return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n  var lines = SDPUtils.splitLines(mediaSection);\n  var mline = lines[0].split(' ');\n  return mline[0].substr(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n  return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n  var lines = SDPUtils.splitLines(mediaSection);\n  var parts = lines[0].substr(2).split(' ');\n  return {\n    kind: parts[0],\n    port: parseInt(parts[1], 10),\n    protocol: parts[2],\n    fmt: parts.slice(3).join(' ')\n  };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n  var line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n  var parts = line.substr(2).split(' ');\n  return {\n    username: parts[0],\n    sessionId: parts[1],\n    sessionVersion: parseInt(parts[2], 10),\n    netType: parts[3],\n    addressType: parts[4],\n    address: parts[5]\n  };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n  if (typeof blob !== 'string' || blob.length === 0) {\n    return false;\n  }\n  var lines = SDPUtils.splitLines(blob);\n  for (var i = 0; i < lines.length; i++) {\n    if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n      return false;\n    }\n    // TODO: check the modifier a bit more.\n  }\n  return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n  module.exports = SDPUtils;\n}\n\n},{}],3:[function(require,module,exports){\n(function (global){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n\n'use strict';\n\nvar adapterFactory = require('./adapter_factory.js');\nmodule.exports = adapterFactory({window: global.window});\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./adapter_factory.js\":4}],4:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n\n'use strict';\n\nvar utils = require('./utils');\n// Shimming starts here.\nmodule.exports = function(dependencies, opts) {\n  var window = dependencies && dependencies.window;\n\n  var options = {\n    shimChrome: true,\n    shimFirefox: true,\n    shimEdge: true,\n    shimSafari: true,\n  };\n\n  for (var key in opts) {\n    if (hasOwnProperty.call(opts, key)) {\n      options[key] = opts[key];\n    }\n  }\n\n  // Utils.\n  var logging = utils.log;\n  var browserDetails = utils.detectBrowser(window);\n\n  // Uncomment the line below if you want logging to occur, including logging\n  // for the switch statement below. Can also be turned on in the browser via\n  // adapter.disableLog(false), but then logging from the switch statement below\n  // will not appear.\n  // require('./utils').disableLog(false);\n\n  // Browser shims.\n  var chromeShim = require('./chrome/chrome_shim') || null;\n  var edgeShim = require('./edge/edge_shim') || null;\n  var firefoxShim = require('./firefox/firefox_shim') || null;\n  var safariShim = require('./safari/safari_shim') || null;\n  var commonShim = require('./common_shim') || null;\n\n  // Export to the adapter global object visible in the browser.\n  var adapter = {\n    browserDetails: browserDetails,\n    commonShim: commonShim,\n    extractVersion: utils.extractVersion,\n    disableLog: utils.disableLog,\n    disableWarnings: utils.disableWarnings\n  };\n\n  // Shim browser if found.\n  switch (browserDetails.browser) {\n    case 'chrome':\n      if (!chromeShim || !chromeShim.shimPeerConnection ||\n          !options.shimChrome) {\n        logging('Chrome shim is not included in this adapter release.');\n        return adapter;\n      }\n      logging('adapter.js shimming chrome.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = chromeShim;\n      commonShim.shimCreateObjectURL(window);\n\n      chromeShim.shimGetUserMedia(window);\n      chromeShim.shimMediaStream(window);\n      chromeShim.shimSourceObject(window);\n      chromeShim.shimPeerConnection(window);\n      chromeShim.shimOnTrack(window);\n      chromeShim.shimAddTrackRemoveTrack(window);\n      chromeShim.shimGetSendersWithDtmf(window);\n      chromeShim.shimSenderReceiverGetStats(window);\n      chromeShim.fixNegotiationNeeded(window);\n\n      commonShim.shimRTCIceCandidate(window);\n      commonShim.shimMaxMessageSize(window);\n      commonShim.shimSendThrowTypeError(window);\n      break;\n    case 'firefox':\n      if (!firefoxShim || !firefoxShim.shimPeerConnection ||\n          !options.shimFirefox) {\n        logging('Firefox shim is not included in this adapter release.');\n        return adapter;\n      }\n      logging('adapter.js shimming firefox.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = firefoxShim;\n      commonShim.shimCreateObjectURL(window);\n\n      firefoxShim.shimGetUserMedia(window);\n      firefoxShim.shimSourceObject(window);\n      firefoxShim.shimPeerConnection(window);\n      firefoxShim.shimOnTrack(window);\n      firefoxShim.shimRemoveStream(window);\n      firefoxShim.shimSenderGetStats(window);\n      firefoxShim.shimReceiverGetStats(window);\n      firefoxShim.shimRTCDataChannel(window);\n\n      commonShim.shimRTCIceCandidate(window);\n      commonShim.shimMaxMessageSize(window);\n      commonShim.shimSendThrowTypeError(window);\n      break;\n    case 'edge':\n      if (!edgeShim || !edgeShim.shimPeerConnection || !options.shimEdge) {\n        logging('MS edge shim is not included in this adapter release.');\n        return adapter;\n      }\n      logging('adapter.js shimming edge.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = edgeShim;\n      commonShim.shimCreateObjectURL(window);\n\n      edgeShim.shimGetUserMedia(window);\n      edgeShim.shimPeerConnection(window);\n      edgeShim.shimReplaceTrack(window);\n\n      // the edge shim implements the full RTCIceCandidate object.\n\n      commonShim.shimMaxMessageSize(window);\n      commonShim.shimSendThrowTypeError(window);\n      break;\n    case 'safari':\n      if (!safariShim || !options.shimSafari) {\n        logging('Safari shim is not included in this adapter release.');\n        return adapter;\n      }\n      logging('adapter.js shimming safari.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = safariShim;\n      commonShim.shimCreateObjectURL(window);\n\n      safariShim.shimRTCIceServerUrls(window);\n      safariShim.shimCreateOfferLegacy(window);\n      safariShim.shimCallbacksAPI(window);\n      safariShim.shimLocalStreamsAPI(window);\n      safariShim.shimRemoteStreamsAPI(window);\n      safariShim.shimTrackEventTransceiver(window);\n      safariShim.shimGetUserMedia(window);\n\n      commonShim.shimRTCIceCandidate(window);\n      commonShim.shimMaxMessageSize(window);\n      commonShim.shimSendThrowTypeError(window);\n      break;\n    default:\n      logging('Unsupported browser!');\n      break;\n  }\n\n  return adapter;\n};\n\n},{\"./chrome/chrome_shim\":5,\"./common_shim\":7,\"./edge/edge_shim\":8,\"./firefox/firefox_shim\":11,\"./safari/safari_shim\":13,\"./utils\":14}],5:[function(require,module,exports){\n\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\nvar utils = require('../utils.js');\nvar logging = utils.log;\n\n/* iterates the stats graph recursively. */\nfunction walkStats(stats, base, resultSet) {\n  if (!base || resultSet.has(base.id)) {\n    return;\n  }\n  resultSet.set(base.id, base);\n  Object.keys(base).forEach(function(name) {\n    if (name.endsWith('Id')) {\n      walkStats(stats, stats.get(base[name]), resultSet);\n    } else if (name.endsWith('Ids')) {\n      base[name].forEach(function(id) {\n        walkStats(stats, stats.get(id), resultSet);\n      });\n    }\n  });\n}\n\n/* filter getStats for a sender/receiver track. */\nfunction filterStats(result, track, outbound) {\n  var streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';\n  var filteredResult = new Map();\n  if (track === null) {\n    return filteredResult;\n  }\n  var trackStats = [];\n  result.forEach(function(value) {\n    if (value.type === 'track' &&\n        value.trackIdentifier === track.id) {\n      trackStats.push(value);\n    }\n  });\n  trackStats.forEach(function(trackStat) {\n    result.forEach(function(stats) {\n      if (stats.type === streamStatsType && stats.trackId === trackStat.id) {\n        walkStats(result, stats, filteredResult);\n      }\n    });\n  });\n  return filteredResult;\n}\n\nmodule.exports = {\n  shimGetUserMedia: require('./getusermedia'),\n  shimMediaStream: function(window) {\n    window.MediaStream = window.MediaStream || window.webkitMediaStream;\n  },\n\n  shimOnTrack: function(window) {\n    if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n        window.RTCPeerConnection.prototype)) {\n      Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n        get: function() {\n          return this._ontrack;\n        },\n        set: function(f) {\n          if (this._ontrack) {\n            this.removeEventListener('track', this._ontrack);\n          }\n          this.addEventListener('track', this._ontrack = f);\n        },\n        enumerable: true,\n        configurable: true\n      });\n      var origSetRemoteDescription =\n          window.RTCPeerConnection.prototype.setRemoteDescription;\n      window.RTCPeerConnection.prototype.setRemoteDescription = function() {\n        var pc = this;\n        if (!pc._ontrackpoly) {\n          pc._ontrackpoly = function(e) {\n            // onaddstream does not fire when a track is added to an existing\n            // stream. But stream.onaddtrack is implemented so we use that.\n            e.stream.addEventListener('addtrack', function(te) {\n              var receiver;\n              if (window.RTCPeerConnection.prototype.getReceivers) {\n                receiver = pc.getReceivers().find(function(r) {\n                  return r.track && r.track.id === te.track.id;\n                });\n              } else {\n                receiver = {track: te.track};\n              }\n\n              var event = new Event('track');\n              event.track = te.track;\n              event.receiver = receiver;\n              event.transceiver = {receiver: receiver};\n              event.streams = [e.stream];\n              pc.dispatchEvent(event);\n            });\n            e.stream.getTracks().forEach(function(track) {\n              var receiver;\n              if (window.RTCPeerConnection.prototype.getReceivers) {\n                receiver = pc.getReceivers().find(function(r) {\n                  return r.track && r.track.id === track.id;\n                });\n              } else {\n                receiver = {track: track};\n              }\n              var event = new Event('track');\n              event.track = track;\n              event.receiver = receiver;\n              event.transceiver = {receiver: receiver};\n              event.streams = [e.stream];\n              pc.dispatchEvent(event);\n            });\n          };\n          pc.addEventListener('addstream', pc._ontrackpoly);\n        }\n        return origSetRemoteDescription.apply(pc, arguments);\n      };\n    } else {\n      // even if RTCRtpTransceiver is in window, it is only used and\n      // emitted in unified-plan. Unfortunately this means we need\n      // to unconditionally wrap the event.\n      utils.wrapPeerConnectionEvent(window, 'track', function(e) {\n        if (!e.transceiver) {\n          Object.defineProperty(e, 'transceiver',\n            {value: {receiver: e.receiver}});\n        }\n        return e;\n      });\n    }\n  },\n\n  shimGetSendersWithDtmf: function(window) {\n    // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n    if (typeof window === 'object' && window.RTCPeerConnection &&\n        !('getSenders' in window.RTCPeerConnection.prototype) &&\n        'createDTMFSender' in window.RTCPeerConnection.prototype) {\n      var shimSenderWithDtmf = function(pc, track) {\n        return {\n          track: track,\n          get dtmf() {\n            if (this._dtmf === undefined) {\n              if (track.kind === 'audio') {\n                this._dtmf = pc.createDTMFSender(track);\n              } else {\n                this._dtmf = null;\n              }\n            }\n            return this._dtmf;\n          },\n          _pc: pc\n        };\n      };\n\n      // augment addTrack when getSenders is not available.\n      if (!window.RTCPeerConnection.prototype.getSenders) {\n        window.RTCPeerConnection.prototype.getSenders = function() {\n          this._senders = this._senders || [];\n          return this._senders.slice(); // return a copy of the internal state.\n        };\n        var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n        window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n          var pc = this;\n          var sender = origAddTrack.apply(pc, arguments);\n          if (!sender) {\n            sender = shimSenderWithDtmf(pc, track);\n            pc._senders.push(sender);\n          }\n          return sender;\n        };\n\n        var origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n        window.RTCPeerConnection.prototype.removeTrack = function(sender) {\n          var pc = this;\n          origRemoveTrack.apply(pc, arguments);\n          var idx = pc._senders.indexOf(sender);\n          if (idx !== -1) {\n            pc._senders.splice(idx, 1);\n          }\n        };\n      }\n      var origAddStream = window.RTCPeerConnection.prototype.addStream;\n      window.RTCPeerConnection.prototype.addStream = function(stream) {\n        var pc = this;\n        pc._senders = pc._senders || [];\n        origAddStream.apply(pc, [stream]);\n        stream.getTracks().forEach(function(track) {\n          pc._senders.push(shimSenderWithDtmf(pc, track));\n        });\n      };\n\n      var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n      window.RTCPeerConnection.prototype.removeStream = function(stream) {\n        var pc = this;\n        pc._senders = pc._senders || [];\n        origRemoveStream.apply(pc, [stream]);\n\n        stream.getTracks().forEach(function(track) {\n          var sender = pc._senders.find(function(s) {\n            return s.track === track;\n          });\n          if (sender) {\n            pc._senders.splice(pc._senders.indexOf(sender), 1); // remove sender\n          }\n        });\n      };\n    } else if (typeof window === 'object' && window.RTCPeerConnection &&\n               'getSenders' in window.RTCPeerConnection.prototype &&\n               'createDTMFSender' in window.RTCPeerConnection.prototype &&\n               window.RTCRtpSender &&\n               !('dtmf' in window.RTCRtpSender.prototype)) {\n      var origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n      window.RTCPeerConnection.prototype.getSenders = function() {\n        var pc = this;\n        var senders = origGetSenders.apply(pc, []);\n        senders.forEach(function(sender) {\n          sender._pc = pc;\n        });\n        return senders;\n      };\n\n      Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n        get: function() {\n          if (this._dtmf === undefined) {\n            if (this.track.kind === 'audio') {\n              this._dtmf = this._pc.createDTMFSender(this.track);\n            } else {\n              this._dtmf = null;\n            }\n          }\n          return this._dtmf;\n        }\n      });\n    }\n  },\n\n  shimSenderReceiverGetStats: function(window) {\n    if (!(typeof window === 'object' && window.RTCPeerConnection &&\n        window.RTCRtpSender && window.RTCRtpReceiver)) {\n      return;\n    }\n\n    // shim sender stats.\n    if (!('getStats' in window.RTCRtpSender.prototype)) {\n      var origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n      if (origGetSenders) {\n        window.RTCPeerConnection.prototype.getSenders = function() {\n          var pc = this;\n          var senders = origGetSenders.apply(pc, []);\n          senders.forEach(function(sender) {\n            sender._pc = pc;\n          });\n          return senders;\n        };\n      }\n\n      var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n      if (origAddTrack) {\n        window.RTCPeerConnection.prototype.addTrack = function() {\n          var sender = origAddTrack.apply(this, arguments);\n          sender._pc = this;\n          return sender;\n        };\n      }\n      window.RTCRtpSender.prototype.getStats = function() {\n        var sender = this;\n        return this._pc.getStats().then(function(result) {\n          /* Note: this will include stats of all senders that\n           *   send a track with the same id as sender.track as\n           *   it is not possible to identify the RTCRtpSender.\n           */\n          return filterStats(result, sender.track, true);\n        });\n      };\n    }\n\n    // shim receiver stats.\n    if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n      var origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n      if (origGetReceivers) {\n        window.RTCPeerConnection.prototype.getReceivers = function() {\n          var pc = this;\n          var receivers = origGetReceivers.apply(pc, []);\n          receivers.forEach(function(receiver) {\n            receiver._pc = pc;\n          });\n          return receivers;\n        };\n      }\n      utils.wrapPeerConnectionEvent(window, 'track', function(e) {\n        e.receiver._pc = e.srcElement;\n        return e;\n      });\n      window.RTCRtpReceiver.prototype.getStats = function() {\n        var receiver = this;\n        return this._pc.getStats().then(function(result) {\n          return filterStats(result, receiver.track, false);\n        });\n      };\n    }\n\n    if (!('getStats' in window.RTCRtpSender.prototype &&\n        'getStats' in window.RTCRtpReceiver.prototype)) {\n      return;\n    }\n\n    // shim RTCPeerConnection.getStats(track).\n    var origGetStats = window.RTCPeerConnection.prototype.getStats;\n    window.RTCPeerConnection.prototype.getStats = function() {\n      var pc = this;\n      if (arguments.length > 0 &&\n          arguments[0] instanceof window.MediaStreamTrack) {\n        var track = arguments[0];\n        var sender;\n        var receiver;\n        var err;\n        pc.getSenders().forEach(function(s) {\n          if (s.track === track) {\n            if (sender) {\n              err = true;\n            } else {\n              sender = s;\n            }\n          }\n        });\n        pc.getReceivers().forEach(function(r) {\n          if (r.track === track) {\n            if (receiver) {\n              err = true;\n            } else {\n              receiver = r;\n            }\n          }\n          return r.track === track;\n        });\n        if (err || (sender && receiver)) {\n          return Promise.reject(new DOMException(\n            'There are more than one sender or receiver for the track.',\n            'InvalidAccessError'));\n        } else if (sender) {\n          return sender.getStats();\n        } else if (receiver) {\n          return receiver.getStats();\n        }\n        return Promise.reject(new DOMException(\n          'There is no sender or receiver for the track.',\n          'InvalidAccessError'));\n      }\n      return origGetStats.apply(pc, arguments);\n    };\n  },\n\n  shimSourceObject: function(window) {\n    var URL = window && window.URL;\n\n    if (typeof window === 'object') {\n      if (window.HTMLMediaElement &&\n        !('srcObject' in window.HTMLMediaElement.prototype)) {\n        // Shim the srcObject property, once, when HTMLMediaElement is found.\n        Object.defineProperty(window.HTMLMediaElement.prototype, 'srcObject', {\n          get: function() {\n            return this._srcObject;\n          },\n          set: function(stream) {\n            var self = this;\n            // Use _srcObject as a private property for this shim\n            this._srcObject = stream;\n            if (this.src) {\n              URL.revokeObjectURL(this.src);\n            }\n\n            if (!stream) {\n              this.src = '';\n              return undefined;\n            }\n            this.src = URL.createObjectURL(stream);\n            // We need to recreate the blob url when a track is added or\n            // removed. Doing it manually since we want to avoid a recursion.\n            stream.addEventListener('addtrack', function() {\n              if (self.src) {\n                URL.revokeObjectURL(self.src);\n              }\n              self.src = URL.createObjectURL(stream);\n            });\n            stream.addEventListener('removetrack', function() {\n              if (self.src) {\n                URL.revokeObjectURL(self.src);\n              }\n              self.src = URL.createObjectURL(stream);\n            });\n          }\n        });\n      }\n    }\n  },\n\n  shimAddTrackRemoveTrackWithNative: function(window) {\n    // shim addTrack/removeTrack with native variants in order to make\n    // the interactions with legacy getLocalStreams behave as in other browsers.\n    // Keeps a mapping stream.id => [stream, rtpsenders...]\n    window.RTCPeerConnection.prototype.getLocalStreams = function() {\n      var pc = this;\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n      return Object.keys(this._shimmedLocalStreams).map(function(streamId) {\n        return pc._shimmedLocalStreams[streamId][0];\n      });\n    };\n\n    var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n    window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n      if (!stream) {\n        return origAddTrack.apply(this, arguments);\n      }\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n      var sender = origAddTrack.apply(this, arguments);\n      if (!this._shimmedLocalStreams[stream.id]) {\n        this._shimmedLocalStreams[stream.id] = [stream, sender];\n      } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n        this._shimmedLocalStreams[stream.id].push(sender);\n      }\n      return sender;\n    };\n\n    var origAddStream = window.RTCPeerConnection.prototype.addStream;\n    window.RTCPeerConnection.prototype.addStream = function(stream) {\n      var pc = this;\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n      stream.getTracks().forEach(function(track) {\n        var alreadyExists = pc.getSenders().find(function(s) {\n          return s.track === track;\n        });\n        if (alreadyExists) {\n          throw new DOMException('Track already exists.',\n              'InvalidAccessError');\n        }\n      });\n      var existingSenders = pc.getSenders();\n      origAddStream.apply(this, arguments);\n      var newSenders = pc.getSenders().filter(function(newSender) {\n        return existingSenders.indexOf(newSender) === -1;\n      });\n      this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n    };\n\n    var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n    window.RTCPeerConnection.prototype.removeStream = function(stream) {\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n      delete this._shimmedLocalStreams[stream.id];\n      return origRemoveStream.apply(this, arguments);\n    };\n\n    var origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n    window.RTCPeerConnection.prototype.removeTrack = function(sender) {\n      var pc = this;\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n      if (sender) {\n        Object.keys(this._shimmedLocalStreams).forEach(function(streamId) {\n          var idx = pc._shimmedLocalStreams[streamId].indexOf(sender);\n          if (idx !== -1) {\n            pc._shimmedLocalStreams[streamId].splice(idx, 1);\n          }\n          if (pc._shimmedLocalStreams[streamId].length === 1) {\n            delete pc._shimmedLocalStreams[streamId];\n          }\n        });\n      }\n      return origRemoveTrack.apply(this, arguments);\n    };\n  },\n\n  shimAddTrackRemoveTrack: function(window) {\n    var browserDetails = utils.detectBrowser(window);\n    // shim addTrack and removeTrack.\n    if (window.RTCPeerConnection.prototype.addTrack &&\n        browserDetails.version >= 65) {\n      return this.shimAddTrackRemoveTrackWithNative(window);\n    }\n\n    // also shim pc.getLocalStreams when addTrack is shimmed\n    // to return the original streams.\n    var origGetLocalStreams = window.RTCPeerConnection.prototype\n        .getLocalStreams;\n    window.RTCPeerConnection.prototype.getLocalStreams = function() {\n      var pc = this;\n      var nativeStreams = origGetLocalStreams.apply(this);\n      pc._reverseStreams = pc._reverseStreams || {};\n      return nativeStreams.map(function(stream) {\n        return pc._reverseStreams[stream.id];\n      });\n    };\n\n    var origAddStream = window.RTCPeerConnection.prototype.addStream;\n    window.RTCPeerConnection.prototype.addStream = function(stream) {\n      var pc = this;\n      pc._streams = pc._streams || {};\n      pc._reverseStreams = pc._reverseStreams || {};\n\n      stream.getTracks().forEach(function(track) {\n        var alreadyExists = pc.getSenders().find(function(s) {\n          return s.track === track;\n        });\n        if (alreadyExists) {\n          throw new DOMException('Track already exists.',\n              'InvalidAccessError');\n        }\n      });\n      // Add identity mapping for consistency with addTrack.\n      // Unless this is being used with a stream from addTrack.\n      if (!pc._reverseStreams[stream.id]) {\n        var newStream = new window.MediaStream(stream.getTracks());\n        pc._streams[stream.id] = newStream;\n        pc._reverseStreams[newStream.id] = stream;\n        stream = newStream;\n      }\n      origAddStream.apply(pc, [stream]);\n    };\n\n    var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n    window.RTCPeerConnection.prototype.removeStream = function(stream) {\n      var pc = this;\n      pc._streams = pc._streams || {};\n      pc._reverseStreams = pc._reverseStreams || {};\n\n      origRemoveStream.apply(pc, [(pc._streams[stream.id] || stream)]);\n      delete pc._reverseStreams[(pc._streams[stream.id] ?\n          pc._streams[stream.id].id : stream.id)];\n      delete pc._streams[stream.id];\n    };\n\n    window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n      var pc = this;\n      if (pc.signalingState === 'closed') {\n        throw new DOMException(\n          'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n          'InvalidStateError');\n      }\n      var streams = [].slice.call(arguments, 1);\n      if (streams.length !== 1 ||\n          !streams[0].getTracks().find(function(t) {\n            return t === track;\n          })) {\n        // this is not fully correct but all we can manage without\n        // [[associated MediaStreams]] internal slot.\n        throw new DOMException(\n          'The adapter.js addTrack polyfill only supports a single ' +\n          ' stream which is associated with the specified track.',\n          'NotSupportedError');\n      }\n\n      var alreadyExists = pc.getSenders().find(function(s) {\n        return s.track === track;\n      });\n      if (alreadyExists) {\n        throw new DOMException('Track already exists.',\n            'InvalidAccessError');\n      }\n\n      pc._streams = pc._streams || {};\n      pc._reverseStreams = pc._reverseStreams || {};\n      var oldStream = pc._streams[stream.id];\n      if (oldStream) {\n        // this is using odd Chrome behaviour, use with caution:\n        // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n        // Note: we rely on the high-level addTrack/dtmf shim to\n        // create the sender with a dtmf sender.\n        oldStream.addTrack(track);\n\n        // Trigger ONN async.\n        Promise.resolve().then(function() {\n          pc.dispatchEvent(new Event('negotiationneeded'));\n        });\n      } else {\n        var newStream = new window.MediaStream([track]);\n        pc._streams[stream.id] = newStream;\n        pc._reverseStreams[newStream.id] = stream;\n        pc.addStream(newStream);\n      }\n      return pc.getSenders().find(function(s) {\n        return s.track === track;\n      });\n    };\n\n    // replace the internal stream id with the external one and\n    // vice versa.\n    function replaceInternalStreamId(pc, description) {\n      var sdp = description.sdp;\n      Object.keys(pc._reverseStreams || []).forEach(function(internalId) {\n        var externalStream = pc._reverseStreams[internalId];\n        var internalStream = pc._streams[externalStream.id];\n        sdp = sdp.replace(new RegExp(internalStream.id, 'g'),\n            externalStream.id);\n      });\n      return new RTCSessionDescription({\n        type: description.type,\n        sdp: sdp\n      });\n    }\n    function replaceExternalStreamId(pc, description) {\n      var sdp = description.sdp;\n      Object.keys(pc._reverseStreams || []).forEach(function(internalId) {\n        var externalStream = pc._reverseStreams[internalId];\n        var internalStream = pc._streams[externalStream.id];\n        sdp = sdp.replace(new RegExp(externalStream.id, 'g'),\n            internalStream.id);\n      });\n      return new RTCSessionDescription({\n        type: description.type,\n        sdp: sdp\n      });\n    }\n    ['createOffer', 'createAnswer'].forEach(function(method) {\n      var nativeMethod = window.RTCPeerConnection.prototype[method];\n      window.RTCPeerConnection.prototype[method] = function() {\n        var pc = this;\n        var args = arguments;\n        var isLegacyCall = arguments.length &&\n            typeof arguments[0] === 'function';\n        if (isLegacyCall) {\n          return nativeMethod.apply(pc, [\n            function(description) {\n              var desc = replaceInternalStreamId(pc, description);\n              args[0].apply(null, [desc]);\n            },\n            function(err) {\n              if (args[1]) {\n                args[1].apply(null, err);\n              }\n            }, arguments[2]\n          ]);\n        }\n        return nativeMethod.apply(pc, arguments)\n        .then(function(description) {\n          return replaceInternalStreamId(pc, description);\n        });\n      };\n    });\n\n    var origSetLocalDescription =\n        window.RTCPeerConnection.prototype.setLocalDescription;\n    window.RTCPeerConnection.prototype.setLocalDescription = function() {\n      var pc = this;\n      if (!arguments.length || !arguments[0].type) {\n        return origSetLocalDescription.apply(pc, arguments);\n      }\n      arguments[0] = replaceExternalStreamId(pc, arguments[0]);\n      return origSetLocalDescription.apply(pc, arguments);\n    };\n\n    // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n    var origLocalDescription = Object.getOwnPropertyDescriptor(\n        window.RTCPeerConnection.prototype, 'localDescription');\n    Object.defineProperty(window.RTCPeerConnection.prototype,\n        'localDescription', {\n          get: function() {\n            var pc = this;\n            var description = origLocalDescription.get.apply(this);\n            if (description.type === '') {\n              return description;\n            }\n            return replaceInternalStreamId(pc, description);\n          }\n        });\n\n    window.RTCPeerConnection.prototype.removeTrack = function(sender) {\n      var pc = this;\n      if (pc.signalingState === 'closed') {\n        throw new DOMException(\n          'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n          'InvalidStateError');\n      }\n      // We can not yet check for sender instanceof RTCRtpSender\n      // since we shim RTPSender. So we check if sender._pc is set.\n      if (!sender._pc) {\n        throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' +\n            'does not implement interface RTCRtpSender.', 'TypeError');\n      }\n      var isLocal = sender._pc === pc;\n      if (!isLocal) {\n        throw new DOMException('Sender was not created by this connection.',\n            'InvalidAccessError');\n      }\n\n      // Search for the native stream the senders track belongs to.\n      pc._streams = pc._streams || {};\n      var stream;\n      Object.keys(pc._streams).forEach(function(streamid) {\n        var hasTrack = pc._streams[streamid].getTracks().find(function(track) {\n          return sender.track === track;\n        });\n        if (hasTrack) {\n          stream = pc._streams[streamid];\n        }\n      });\n\n      if (stream) {\n        if (stream.getTracks().length === 1) {\n          // if this is the last track of the stream, remove the stream. This\n          // takes care of any shimmed _senders.\n          pc.removeStream(pc._reverseStreams[stream.id]);\n        } else {\n          // relying on the same odd chrome behaviour as above.\n          stream.removeTrack(sender.track);\n        }\n        pc.dispatchEvent(new Event('negotiationneeded'));\n      }\n    };\n  },\n\n  shimPeerConnection: function(window) {\n    var browserDetails = utils.detectBrowser(window);\n\n    // The RTCPeerConnection object.\n    if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n      window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n        // Translate iceTransportPolicy to iceTransports,\n        // see https://code.google.com/p/webrtc/issues/detail?id=4869\n        // this was fixed in M56 along with unprefixing RTCPeerConnection.\n        logging('PeerConnection');\n        if (pcConfig && pcConfig.iceTransportPolicy) {\n          pcConfig.iceTransports = pcConfig.iceTransportPolicy;\n        }\n\n        return new window.webkitRTCPeerConnection(pcConfig, pcConstraints);\n      };\n      window.RTCPeerConnection.prototype =\n          window.webkitRTCPeerConnection.prototype;\n      // wrap static methods. Currently just generateCertificate.\n      if (window.webkitRTCPeerConnection.generateCertificate) {\n        Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n          get: function() {\n            return window.webkitRTCPeerConnection.generateCertificate;\n          }\n        });\n      }\n    }\n\n    var origGetStats = window.RTCPeerConnection.prototype.getStats;\n    window.RTCPeerConnection.prototype.getStats = function(selector,\n        successCallback, errorCallback) {\n      var pc = this;\n      var args = arguments;\n\n      // If selector is a function then we are in the old style stats so just\n      // pass back the original getStats format to avoid breaking old users.\n      if (arguments.length > 0 && typeof selector === 'function') {\n        return origGetStats.apply(this, arguments);\n      }\n\n      // When spec-style getStats is supported, return those when called with\n      // either no arguments or the selector argument is null.\n      if (origGetStats.length === 0 && (arguments.length === 0 ||\n          typeof arguments[0] !== 'function')) {\n        return origGetStats.apply(this, []);\n      }\n\n      var fixChromeStats_ = function(response) {\n        var standardReport = {};\n        var reports = response.result();\n        reports.forEach(function(report) {\n          var standardStats = {\n            id: report.id,\n            timestamp: report.timestamp,\n            type: {\n              localcandidate: 'local-candidate',\n              remotecandidate: 'remote-candidate'\n            }[report.type] || report.type\n          };\n          report.names().forEach(function(name) {\n            standardStats[name] = report.stat(name);\n          });\n          standardReport[standardStats.id] = standardStats;\n        });\n\n        return standardReport;\n      };\n\n      // shim getStats with maplike support\n      var makeMapStats = function(stats) {\n        return new Map(Object.keys(stats).map(function(key) {\n          return [key, stats[key]];\n        }));\n      };\n\n      if (arguments.length >= 2) {\n        var successCallbackWrapper_ = function(response) {\n          args[1](makeMapStats(fixChromeStats_(response)));\n        };\n\n        return origGetStats.apply(this, [successCallbackWrapper_,\n          arguments[0]]);\n      }\n\n      // promise-support\n      return new Promise(function(resolve, reject) {\n        origGetStats.apply(pc, [\n          function(response) {\n            resolve(makeMapStats(fixChromeStats_(response)));\n          }, reject]);\n      }).then(successCallback, errorCallback);\n    };\n\n    // add promise support -- natively available in Chrome 51\n    if (browserDetails.version < 51) {\n      ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n          .forEach(function(method) {\n            var nativeMethod = window.RTCPeerConnection.prototype[method];\n            window.RTCPeerConnection.prototype[method] = function() {\n              var args = arguments;\n              var pc = this;\n              var promise = new Promise(function(resolve, reject) {\n                nativeMethod.apply(pc, [args[0], resolve, reject]);\n              });\n              if (args.length < 2) {\n                return promise;\n              }\n              return promise.then(function() {\n                args[1].apply(null, []);\n              },\n              function(err) {\n                if (args.length >= 3) {\n                  args[2].apply(null, [err]);\n                }\n              });\n            };\n          });\n    }\n\n    // promise support for createOffer and createAnswer. Available (without\n    // bugs) since M52: crbug/619289\n    if (browserDetails.version < 52) {\n      ['createOffer', 'createAnswer'].forEach(function(method) {\n        var nativeMethod = window.RTCPeerConnection.prototype[method];\n        window.RTCPeerConnection.prototype[method] = function() {\n          var pc = this;\n          if (arguments.length < 1 || (arguments.length === 1 &&\n              typeof arguments[0] === 'object')) {\n            var opts = arguments.length === 1 ? arguments[0] : undefined;\n            return new Promise(function(resolve, reject) {\n              nativeMethod.apply(pc, [resolve, reject, opts]);\n            });\n          }\n          return nativeMethod.apply(this, arguments);\n        };\n      });\n    }\n\n    // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n    ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n        .forEach(function(method) {\n          var nativeMethod = window.RTCPeerConnection.prototype[method];\n          window.RTCPeerConnection.prototype[method] = function() {\n            arguments[0] = new ((method === 'addIceCandidate') ?\n                window.RTCIceCandidate :\n                window.RTCSessionDescription)(arguments[0]);\n            return nativeMethod.apply(this, arguments);\n          };\n        });\n\n    // support for addIceCandidate(null or undefined)\n    var nativeAddIceCandidate =\n        window.RTCPeerConnection.prototype.addIceCandidate;\n    window.RTCPeerConnection.prototype.addIceCandidate = function() {\n      if (!arguments[0]) {\n        if (arguments[1]) {\n          arguments[1].apply(null);\n        }\n        return Promise.resolve();\n      }\n      return nativeAddIceCandidate.apply(this, arguments);\n    };\n  },\n\n  fixNegotiationNeeded: function(window) {\n    utils.wrapPeerConnectionEvent(window, 'negotiationneeded', function(e) {\n      var pc = e.target;\n      if (pc.signalingState !== 'stable') {\n        return;\n      }\n      return e;\n    });\n  },\n\n  shimGetDisplayMedia: function(window, getSourceId) {\n    if ('getDisplayMedia' in window.navigator) {\n      return;\n    }\n    // getSourceId is a function that returns a promise resolving with\n    // the sourceId of the screen/window/tab to be shared.\n    if (typeof getSourceId !== 'function') {\n      console.error('shimGetDisplayMedia: getSourceId argument is not ' +\n          'a function');\n      return;\n    }\n    navigator.getDisplayMedia = function(constraints) {\n      return getSourceId(constraints)\n        .then(function(sourceId) {\n          constraints.video = {\n            mandatory: {\n              chromeMediaSource: 'desktop',\n              chromeMediaSourceId: sourceId,\n              maxFrameRate: constraints.video.frameRate || 3\n            }\n          };\n          return navigator.mediaDevices.getUserMedia(constraints);\n        });\n    };\n  }\n};\n\n},{\"../utils.js\":14,\"./getusermedia\":6}],6:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\nvar utils = require('../utils.js');\nvar logging = utils.log;\n\n// Expose public methods.\nmodule.exports = function(window) {\n  var browserDetails = utils.detectBrowser(window);\n  var navigator = window && window.navigator;\n\n  var constraintsToChrome_ = function(c) {\n    if (typeof c !== 'object' || c.mandatory || c.optional) {\n      return c;\n    }\n    var cc = {};\n    Object.keys(c).forEach(function(key) {\n      if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n        return;\n      }\n      var r = (typeof c[key] === 'object') ? c[key] : {ideal: c[key]};\n      if (r.exact !== undefined && typeof r.exact === 'number') {\n        r.min = r.max = r.exact;\n      }\n      var oldname_ = function(prefix, name) {\n        if (prefix) {\n          return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n        }\n        return (name === 'deviceId') ? 'sourceId' : name;\n      };\n      if (r.ideal !== undefined) {\n        cc.optional = cc.optional || [];\n        var oc = {};\n        if (typeof r.ideal === 'number') {\n          oc[oldname_('min', key)] = r.ideal;\n          cc.optional.push(oc);\n          oc = {};\n          oc[oldname_('max', key)] = r.ideal;\n          cc.optional.push(oc);\n        } else {\n          oc[oldname_('', key)] = r.ideal;\n          cc.optional.push(oc);\n        }\n      }\n      if (r.exact !== undefined && typeof r.exact !== 'number') {\n        cc.mandatory = cc.mandatory || {};\n        cc.mandatory[oldname_('', key)] = r.exact;\n      } else {\n        ['min', 'max'].forEach(function(mix) {\n          if (r[mix] !== undefined) {\n            cc.mandatory = cc.mandatory || {};\n            cc.mandatory[oldname_(mix, key)] = r[mix];\n          }\n        });\n      }\n    });\n    if (c.advanced) {\n      cc.optional = (cc.optional || []).concat(c.advanced);\n    }\n    return cc;\n  };\n\n  var shimConstraints_ = function(constraints, func) {\n    if (browserDetails.version >= 61) {\n      return func(constraints);\n    }\n    constraints = JSON.parse(JSON.stringify(constraints));\n    if (constraints && typeof constraints.audio === 'object') {\n      var remap = function(obj, a, b) {\n        if (a in obj && !(b in obj)) {\n          obj[b] = obj[a];\n          delete obj[a];\n        }\n      };\n      constraints = JSON.parse(JSON.stringify(constraints));\n      remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');\n      remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');\n      constraints.audio = constraintsToChrome_(constraints.audio);\n    }\n    if (constraints && typeof constraints.video === 'object') {\n      // Shim facingMode for mobile & surface pro.\n      var face = constraints.video.facingMode;\n      face = face && ((typeof face === 'object') ? face : {ideal: face});\n      var getSupportedFacingModeLies = browserDetails.version < 66;\n\n      if ((face && (face.exact === 'user' || face.exact === 'environment' ||\n                    face.ideal === 'user' || face.ideal === 'environment')) &&\n          !(navigator.mediaDevices.getSupportedConstraints &&\n            navigator.mediaDevices.getSupportedConstraints().facingMode &&\n            !getSupportedFacingModeLies)) {\n        delete constraints.video.facingMode;\n        var matches;\n        if (face.exact === 'environment' || face.ideal === 'environment') {\n          matches = ['back', 'rear'];\n        } else if (face.exact === 'user' || face.ideal === 'user') {\n          matches = ['front'];\n        }\n        if (matches) {\n          // Look for matches in label, or use last cam for back (typical).\n          return navigator.mediaDevices.enumerateDevices()\n          .then(function(devices) {\n            devices = devices.filter(function(d) {\n              return d.kind === 'videoinput';\n            });\n            var dev = devices.find(function(d) {\n              return matches.some(function(match) {\n                return d.label.toLowerCase().indexOf(match) !== -1;\n              });\n            });\n            if (!dev && devices.length && matches.indexOf('back') !== -1) {\n              dev = devices[devices.length - 1]; // more likely the back cam\n            }\n            if (dev) {\n              constraints.video.deviceId = face.exact ? {exact: dev.deviceId} :\n                                                        {ideal: dev.deviceId};\n            }\n            constraints.video = constraintsToChrome_(constraints.video);\n            logging('chrome: ' + JSON.stringify(constraints));\n            return func(constraints);\n          });\n        }\n      }\n      constraints.video = constraintsToChrome_(constraints.video);\n    }\n    logging('chrome: ' + JSON.stringify(constraints));\n    return func(constraints);\n  };\n\n  var shimError_ = function(e) {\n    if (browserDetails.version >= 64) {\n      return e;\n    }\n    return {\n      name: {\n        PermissionDeniedError: 'NotAllowedError',\n        PermissionDismissedError: 'NotAllowedError',\n        InvalidStateError: 'NotAllowedError',\n        DevicesNotFoundError: 'NotFoundError',\n        ConstraintNotSatisfiedError: 'OverconstrainedError',\n        TrackStartError: 'NotReadableError',\n        MediaDeviceFailedDueToShutdown: 'NotAllowedError',\n        MediaDeviceKillSwitchOn: 'NotAllowedError',\n        TabCaptureError: 'AbortError',\n        ScreenCaptureError: 'AbortError',\n        DeviceCaptureError: 'AbortError'\n      }[e.name] || e.name,\n      message: e.message,\n      constraint: e.constraint || e.constraintName,\n      toString: function() {\n        return this.name + (this.message && ': ') + this.message;\n      }\n    };\n  };\n\n  var getUserMedia_ = function(constraints, onSuccess, onError) {\n    shimConstraints_(constraints, function(c) {\n      navigator.webkitGetUserMedia(c, onSuccess, function(e) {\n        if (onError) {\n          onError(shimError_(e));\n        }\n      });\n    });\n  };\n\n  navigator.getUserMedia = getUserMedia_;\n\n  // Returns the result of getUserMedia as a Promise.\n  var getUserMediaPromise_ = function(constraints) {\n    return new Promise(function(resolve, reject) {\n      navigator.getUserMedia(constraints, resolve, reject);\n    });\n  };\n\n  if (!navigator.mediaDevices) {\n    navigator.mediaDevices = {\n      getUserMedia: getUserMediaPromise_,\n      enumerateDevices: function() {\n        return new Promise(function(resolve) {\n          var kinds = {audio: 'audioinput', video: 'videoinput'};\n          return window.MediaStreamTrack.getSources(function(devices) {\n            resolve(devices.map(function(device) {\n              return {label: device.label,\n                kind: kinds[device.kind],\n                deviceId: device.id,\n                groupId: ''};\n            }));\n          });\n        });\n      },\n      getSupportedConstraints: function() {\n        return {\n          deviceId: true, echoCancellation: true, facingMode: true,\n          frameRate: true, height: true, width: true\n        };\n      }\n    };\n  }\n\n  // A shim for getUserMedia method on the mediaDevices object.\n  // TODO(KaptenJansson) remove once implemented in Chrome stable.\n  if (!navigator.mediaDevices.getUserMedia) {\n    navigator.mediaDevices.getUserMedia = function(constraints) {\n      return getUserMediaPromise_(constraints);\n    };\n  } else {\n    // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n    // function which returns a Promise, it does not accept spec-style\n    // constraints.\n    var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n        bind(navigator.mediaDevices);\n    navigator.mediaDevices.getUserMedia = function(cs) {\n      return shimConstraints_(cs, function(c) {\n        return origGetUserMedia(c).then(function(stream) {\n          if (c.audio && !stream.getAudioTracks().length ||\n              c.video && !stream.getVideoTracks().length) {\n            stream.getTracks().forEach(function(track) {\n              track.stop();\n            });\n            throw new DOMException('', 'NotFoundError');\n          }\n          return stream;\n        }, function(e) {\n          return Promise.reject(shimError_(e));\n        });\n      });\n    };\n  }\n\n  // Dummy devicechange event methods.\n  // TODO(KaptenJansson) remove once implemented in Chrome stable.\n  if (typeof navigator.mediaDevices.addEventListener === 'undefined') {\n    navigator.mediaDevices.addEventListener = function() {\n      logging('Dummy mediaDevices.addEventListener called.');\n    };\n  }\n  if (typeof navigator.mediaDevices.removeEventListener === 'undefined') {\n    navigator.mediaDevices.removeEventListener = function() {\n      logging('Dummy mediaDevices.removeEventListener called.');\n    };\n  }\n};\n\n},{\"../utils.js\":14}],7:[function(require,module,exports){\n/*\n *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar SDPUtils = require('sdp');\nvar utils = require('./utils');\n\nmodule.exports = {\n  shimRTCIceCandidate: function(window) {\n    // foundation is arbitrarily chosen as an indicator for full support for\n    // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface\n    if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'foundation' in\n        window.RTCIceCandidate.prototype)) {\n      return;\n    }\n\n    var NativeRTCIceCandidate = window.RTCIceCandidate;\n    window.RTCIceCandidate = function(args) {\n      // Remove the a= which shouldn't be part of the candidate string.\n      if (typeof args === 'object' && args.candidate &&\n          args.candidate.indexOf('a=') === 0) {\n        args = JSON.parse(JSON.stringify(args));\n        args.candidate = args.candidate.substr(2);\n      }\n\n      if (args.candidate && args.candidate.length) {\n        // Augment the native candidate with the parsed fields.\n        var nativeCandidate = new NativeRTCIceCandidate(args);\n        var parsedCandidate = SDPUtils.parseCandidate(args.candidate);\n        var augmentedCandidate = Object.assign(nativeCandidate,\n            parsedCandidate);\n\n        // Add a serializer that does not serialize the extra attributes.\n        augmentedCandidate.toJSON = function() {\n          return {\n            candidate: augmentedCandidate.candidate,\n            sdpMid: augmentedCandidate.sdpMid,\n            sdpMLineIndex: augmentedCandidate.sdpMLineIndex,\n            usernameFragment: augmentedCandidate.usernameFragment,\n          };\n        };\n        return augmentedCandidate;\n      }\n      return new NativeRTCIceCandidate(args);\n    };\n    window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n\n    // Hook up the augmented candidate in onicecandidate and\n    // addEventListener('icecandidate', ...)\n    utils.wrapPeerConnectionEvent(window, 'icecandidate', function(e) {\n      if (e.candidate) {\n        Object.defineProperty(e, 'candidate', {\n          value: new window.RTCIceCandidate(e.candidate),\n          writable: 'false'\n        });\n      }\n      return e;\n    });\n  },\n\n  // shimCreateObjectURL must be called before shimSourceObject to avoid loop.\n\n  shimCreateObjectURL: function(window) {\n    var URL = window && window.URL;\n\n    if (!(typeof window === 'object' && window.HTMLMediaElement &&\n          'srcObject' in window.HTMLMediaElement.prototype &&\n        URL.createObjectURL && URL.revokeObjectURL)) {\n      // Only shim CreateObjectURL using srcObject if srcObject exists.\n      return undefined;\n    }\n\n    var nativeCreateObjectURL = URL.createObjectURL.bind(URL);\n    var nativeRevokeObjectURL = URL.revokeObjectURL.bind(URL);\n    var streams = new Map(), newId = 0;\n\n    URL.createObjectURL = function(stream) {\n      if ('getTracks' in stream) {\n        var url = 'polyblob:' + (++newId);\n        streams.set(url, stream);\n        utils.deprecated('URL.createObjectURL(stream)',\n            'elem.srcObject = stream');\n        return url;\n      }\n      return nativeCreateObjectURL(stream);\n    };\n    URL.revokeObjectURL = function(url) {\n      nativeRevokeObjectURL(url);\n      streams.delete(url);\n    };\n\n    var dsc = Object.getOwnPropertyDescriptor(window.HTMLMediaElement.prototype,\n                                              'src');\n    Object.defineProperty(window.HTMLMediaElement.prototype, 'src', {\n      get: function() {\n        return dsc.get.apply(this);\n      },\n      set: function(url) {\n        this.srcObject = streams.get(url) || null;\n        return dsc.set.apply(this, [url]);\n      }\n    });\n\n    var nativeSetAttribute = window.HTMLMediaElement.prototype.setAttribute;\n    window.HTMLMediaElement.prototype.setAttribute = function() {\n      if (arguments.length === 2 &&\n          ('' + arguments[0]).toLowerCase() === 'src') {\n        this.srcObject = streams.get(arguments[1]) || null;\n      }\n      return nativeSetAttribute.apply(this, arguments);\n    };\n  },\n\n  shimMaxMessageSize: function(window) {\n    if (window.RTCSctpTransport || !window.RTCPeerConnection) {\n      return;\n    }\n    var browserDetails = utils.detectBrowser(window);\n\n    if (!('sctp' in window.RTCPeerConnection.prototype)) {\n      Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n        get: function() {\n          return typeof this._sctp === 'undefined' ? null : this._sctp;\n        }\n      });\n    }\n\n    var sctpInDescription = function(description) {\n      var sections = SDPUtils.splitSections(description.sdp);\n      sections.shift();\n      return sections.some(function(mediaSection) {\n        var mLine = SDPUtils.parseMLine(mediaSection);\n        return mLine && mLine.kind === 'application'\n            && mLine.protocol.indexOf('SCTP') !== -1;\n      });\n    };\n\n    var getRemoteFirefoxVersion = function(description) {\n      // TODO: Is there a better solution for detecting Firefox?\n      var match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n      if (match === null || match.length < 2) {\n        return -1;\n      }\n      var version = parseInt(match[1], 10);\n      // Test for NaN (yes, this is ugly)\n      return version !== version ? -1 : version;\n    };\n\n    var getCanSendMaxMessageSize = function(remoteIsFirefox) {\n      // Every implementation we know can send at least 64 KiB.\n      // Note: Although Chrome is technically able to send up to 256 KiB, the\n      //       data does not reach the other peer reliably.\n      //       See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419\n      var canSendMaxMessageSize = 65536;\n      if (browserDetails.browser === 'firefox') {\n        if (browserDetails.version < 57) {\n          if (remoteIsFirefox === -1) {\n            // FF < 57 will send in 16 KiB chunks using the deprecated PPID\n            // fragmentation.\n            canSendMaxMessageSize = 16384;\n          } else {\n            // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n            // messages. Thus, supporting ~2 GiB when sending.\n            canSendMaxMessageSize = 2147483637;\n          }\n        } else if (browserDetails.version < 60) {\n          // Currently, all FF >= 57 will reset the remote maximum message size\n          // to the default value when a data channel is created at a later\n          // stage. :(\n          // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n          canSendMaxMessageSize =\n            browserDetails.version === 57 ? 65535 : 65536;\n        } else {\n          // FF >= 60 supports sending ~2 GiB\n          canSendMaxMessageSize = 2147483637;\n        }\n      }\n      return canSendMaxMessageSize;\n    };\n\n    var getMaxMessageSize = function(description, remoteIsFirefox) {\n      // Note: 65536 bytes is the default value from the SDP spec. Also,\n      //       every implementation we know supports receiving 65536 bytes.\n      var maxMessageSize = 65536;\n\n      // FF 57 has a slightly incorrect default remote max message size, so\n      // we need to adjust it here to avoid a failure when sending.\n      // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697\n      if (browserDetails.browser === 'firefox'\n           && browserDetails.version === 57) {\n        maxMessageSize = 65535;\n      }\n\n      var match = SDPUtils.matchPrefix(description.sdp, 'a=max-message-size:');\n      if (match.length > 0) {\n        maxMessageSize = parseInt(match[0].substr(19), 10);\n      } else if (browserDetails.browser === 'firefox' &&\n                  remoteIsFirefox !== -1) {\n        // If the maximum message size is not present in the remote SDP and\n        // both local and remote are Firefox, the remote peer can receive\n        // ~2 GiB.\n        maxMessageSize = 2147483637;\n      }\n      return maxMessageSize;\n    };\n\n    var origSetRemoteDescription =\n        window.RTCPeerConnection.prototype.setRemoteDescription;\n    window.RTCPeerConnection.prototype.setRemoteDescription = function() {\n      var pc = this;\n      pc._sctp = null;\n\n      if (sctpInDescription(arguments[0])) {\n        // Check if the remote is FF.\n        var isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n        // Get the maximum message size the local peer is capable of sending\n        var canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n        // Get the maximum message size of the remote peer.\n        var remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n        // Determine final maximum message size\n        var maxMessageSize;\n        if (canSendMMS === 0 && remoteMMS === 0) {\n          maxMessageSize = Number.POSITIVE_INFINITY;\n        } else if (canSendMMS === 0 || remoteMMS === 0) {\n          maxMessageSize = Math.max(canSendMMS, remoteMMS);\n        } else {\n          maxMessageSize = Math.min(canSendMMS, remoteMMS);\n        }\n\n        // Create a dummy RTCSctpTransport object and the 'maxMessageSize'\n        // attribute.\n        var sctp = {};\n        Object.defineProperty(sctp, 'maxMessageSize', {\n          get: function() {\n            return maxMessageSize;\n          }\n        });\n        pc._sctp = sctp;\n      }\n\n      return origSetRemoteDescription.apply(pc, arguments);\n    };\n  },\n\n  shimSendThrowTypeError: function(window) {\n    if (!(window.RTCPeerConnection &&\n        'createDataChannel' in window.RTCPeerConnection.prototype)) {\n      return;\n    }\n\n    // Note: Although Firefox >= 57 has a native implementation, the maximum\n    //       message size can be reset for all data channels at a later stage.\n    //       See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n\n    function wrapDcSend(dc, pc) {\n      var origDataChannelSend = dc.send;\n      dc.send = function() {\n        var data = arguments[0];\n        var length = data.length || data.size || data.byteLength;\n        if (dc.readyState === 'open' &&\n            pc.sctp && length > pc.sctp.maxMessageSize) {\n          throw new TypeError('Message too large (can send a maximum of ' +\n            pc.sctp.maxMessageSize + ' bytes)');\n        }\n        return origDataChannelSend.apply(dc, arguments);\n      };\n    }\n    var origCreateDataChannel =\n      window.RTCPeerConnection.prototype.createDataChannel;\n    window.RTCPeerConnection.prototype.createDataChannel = function() {\n      var pc = this;\n      var dataChannel = origCreateDataChannel.apply(pc, arguments);\n      wrapDcSend(dataChannel, pc);\n      return dataChannel;\n    };\n    utils.wrapPeerConnectionEvent(window, 'datachannel', function(e) {\n      wrapDcSend(e.channel, e.target);\n      return e;\n    });\n  }\n};\n\n},{\"./utils\":14,\"sdp\":2}],8:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar utils = require('../utils');\nvar filterIceServers = require('./filtericeservers');\nvar shimRTCPeerConnection = require('rtcpeerconnection-shim');\n\nmodule.exports = {\n  shimGetUserMedia: require('./getusermedia'),\n  shimPeerConnection: function(window) {\n    var browserDetails = utils.detectBrowser(window);\n\n    if (window.RTCIceGatherer) {\n      if (!window.RTCIceCandidate) {\n        window.RTCIceCandidate = function(args) {\n          return args;\n        };\n      }\n      if (!window.RTCSessionDescription) {\n        window.RTCSessionDescription = function(args) {\n          return args;\n        };\n      }\n      // this adds an additional event listener to MediaStrackTrack that signals\n      // when a tracks enabled property was changed. Workaround for a bug in\n      // addStream, see below. No longer required in 15025+\n      if (browserDetails.version < 15025) {\n        var origMSTEnabled = Object.getOwnPropertyDescriptor(\n            window.MediaStreamTrack.prototype, 'enabled');\n        Object.defineProperty(window.MediaStreamTrack.prototype, 'enabled', {\n          set: function(value) {\n            origMSTEnabled.set.call(this, value);\n            var ev = new Event('enabled');\n            ev.enabled = value;\n            this.dispatchEvent(ev);\n          }\n        });\n      }\n    }\n\n    // ORTC defines the DTMF sender a bit different.\n    // https://github.com/w3c/ortc/issues/714\n    if (window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) {\n      Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n        get: function() {\n          if (this._dtmf === undefined) {\n            if (this.track.kind === 'audio') {\n              this._dtmf = new window.RTCDtmfSender(this);\n            } else if (this.track.kind === 'video') {\n              this._dtmf = null;\n            }\n          }\n          return this._dtmf;\n        }\n      });\n    }\n    // Edge currently only implements the RTCDtmfSender, not the\n    // RTCDTMFSender alias. See http://draft.ortc.org/#rtcdtmfsender2*\n    if (window.RTCDtmfSender && !window.RTCDTMFSender) {\n      window.RTCDTMFSender = window.RTCDtmfSender;\n    }\n\n    var RTCPeerConnectionShim = shimRTCPeerConnection(window,\n        browserDetails.version);\n    window.RTCPeerConnection = function(config) {\n      if (config && config.iceServers) {\n        config.iceServers = filterIceServers(config.iceServers);\n      }\n      return new RTCPeerConnectionShim(config);\n    };\n    window.RTCPeerConnection.prototype = RTCPeerConnectionShim.prototype;\n  },\n  shimReplaceTrack: function(window) {\n    // ORTC has replaceTrack -- https://github.com/w3c/ortc/issues/614\n    if (window.RTCRtpSender &&\n        !('replaceTrack' in window.RTCRtpSender.prototype)) {\n      window.RTCRtpSender.prototype.replaceTrack =\n          window.RTCRtpSender.prototype.setTrack;\n    }\n  }\n};\n\n},{\"../utils\":14,\"./filtericeservers\":9,\"./getusermedia\":10,\"rtcpeerconnection-shim\":1}],9:[function(require,module,exports){\n/*\n *  Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar utils = require('../utils');\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nmodule.exports = function(iceServers, edgeVersion) {\n  var hasTurn = false;\n  iceServers = JSON.parse(JSON.stringify(iceServers));\n  return iceServers.filter(function(server) {\n    if (server && (server.urls || server.url)) {\n      var urls = server.urls || server.url;\n      if (server.url && !server.urls) {\n        utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n      }\n      var isString = typeof urls === 'string';\n      if (isString) {\n        urls = [urls];\n      }\n      urls = urls.filter(function(url) {\n        var validTurn = url.indexOf('turn:') === 0 &&\n            url.indexOf('transport=udp') !== -1 &&\n            url.indexOf('turn:[') === -1 &&\n            !hasTurn;\n\n        if (validTurn) {\n          hasTurn = true;\n          return true;\n        }\n        return url.indexOf('stun:') === 0 && edgeVersion >= 14393 &&\n            url.indexOf('?transport=udp') === -1;\n      });\n\n      delete server.url;\n      server.urls = isString ? urls[0] : urls;\n      return !!urls.length;\n    }\n  });\n};\n\n},{\"../utils\":14}],10:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\n// Expose public methods.\nmodule.exports = function(window) {\n  var navigator = window && window.navigator;\n\n  var shimError_ = function(e) {\n    return {\n      name: {PermissionDeniedError: 'NotAllowedError'}[e.name] || e.name,\n      message: e.message,\n      constraint: e.constraint,\n      toString: function() {\n        return this.name;\n      }\n    };\n  };\n\n  // getUserMedia error shim.\n  var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n      bind(navigator.mediaDevices);\n  navigator.mediaDevices.getUserMedia = function(c) {\n    return origGetUserMedia(c).catch(function(e) {\n      return Promise.reject(shimError_(e));\n    });\n  };\n};\n\n},{}],11:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar utils = require('../utils');\n\nmodule.exports = {\n  shimGetUserMedia: require('./getusermedia'),\n  shimOnTrack: function(window) {\n    if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n        window.RTCPeerConnection.prototype)) {\n      Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n        get: function() {\n          return this._ontrack;\n        },\n        set: function(f) {\n          if (this._ontrack) {\n            this.removeEventListener('track', this._ontrack);\n            this.removeEventListener('addstream', this._ontrackpoly);\n          }\n          this.addEventListener('track', this._ontrack = f);\n          this.addEventListener('addstream', this._ontrackpoly = function(e) {\n            e.stream.getTracks().forEach(function(track) {\n              var event = new Event('track');\n              event.track = track;\n              event.receiver = {track: track};\n              event.transceiver = {receiver: event.receiver};\n              event.streams = [e.stream];\n              this.dispatchEvent(event);\n            }.bind(this));\n          }.bind(this));\n        },\n        enumerable: true,\n        configurable: true\n      });\n    }\n    if (typeof window === 'object' && window.RTCTrackEvent &&\n        ('receiver' in window.RTCTrackEvent.prototype) &&\n        !('transceiver' in window.RTCTrackEvent.prototype)) {\n      Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n        get: function() {\n          return {receiver: this.receiver};\n        }\n      });\n    }\n  },\n\n  shimSourceObject: function(window) {\n    // Firefox has supported mozSrcObject since FF22, unprefixed in 42.\n    if (typeof window === 'object') {\n      if (window.HTMLMediaElement &&\n        !('srcObject' in window.HTMLMediaElement.prototype)) {\n        // Shim the srcObject property, once, when HTMLMediaElement is found.\n        Object.defineProperty(window.HTMLMediaElement.prototype, 'srcObject', {\n          get: function() {\n            return this.mozSrcObject;\n          },\n          set: function(stream) {\n            this.mozSrcObject = stream;\n          }\n        });\n      }\n    }\n  },\n\n  shimPeerConnection: function(window) {\n    var browserDetails = utils.detectBrowser(window);\n\n    if (typeof window !== 'object' || !(window.RTCPeerConnection ||\n        window.mozRTCPeerConnection)) {\n      return; // probably media.peerconnection.enabled=false in about:config\n    }\n    // The RTCPeerConnection object.\n    if (!window.RTCPeerConnection) {\n      window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n        if (browserDetails.version < 38) {\n          // .urls is not supported in FF < 38.\n          // create RTCIceServers with a single url.\n          if (pcConfig && pcConfig.iceServers) {\n            var newIceServers = [];\n            for (var i = 0; i < pcConfig.iceServers.length; i++) {\n              var server = pcConfig.iceServers[i];\n              if (server.hasOwnProperty('urls')) {\n                for (var j = 0; j < server.urls.length; j++) {\n                  var newServer = {\n                    url: server.urls[j]\n                  };\n                  if (server.urls[j].indexOf('turn') === 0) {\n                    newServer.username = server.username;\n                    newServer.credential = server.credential;\n                  }\n                  newIceServers.push(newServer);\n                }\n              } else {\n                newIceServers.push(pcConfig.iceServers[i]);\n              }\n            }\n            pcConfig.iceServers = newIceServers;\n          }\n        }\n        return new window.mozRTCPeerConnection(pcConfig, pcConstraints);\n      };\n      window.RTCPeerConnection.prototype =\n          window.mozRTCPeerConnection.prototype;\n\n      // wrap static methods. Currently just generateCertificate.\n      if (window.mozRTCPeerConnection.generateCertificate) {\n        Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n          get: function() {\n            return window.mozRTCPeerConnection.generateCertificate;\n          }\n        });\n      }\n\n      window.RTCSessionDescription = window.mozRTCSessionDescription;\n      window.RTCIceCandidate = window.mozRTCIceCandidate;\n    }\n\n    // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n    ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n        .forEach(function(method) {\n          var nativeMethod = window.RTCPeerConnection.prototype[method];\n          window.RTCPeerConnection.prototype[method] = function() {\n            arguments[0] = new ((method === 'addIceCandidate') ?\n                window.RTCIceCandidate :\n                window.RTCSessionDescription)(arguments[0]);\n            return nativeMethod.apply(this, arguments);\n          };\n        });\n\n    // support for addIceCandidate(null or undefined)\n    var nativeAddIceCandidate =\n        window.RTCPeerConnection.prototype.addIceCandidate;\n    window.RTCPeerConnection.prototype.addIceCandidate = function() {\n      if (!arguments[0]) {\n        if (arguments[1]) {\n          arguments[1].apply(null);\n        }\n        return Promise.resolve();\n      }\n      return nativeAddIceCandidate.apply(this, arguments);\n    };\n\n    // shim getStats with maplike support\n    var makeMapStats = function(stats) {\n      var map = new Map();\n      Object.keys(stats).forEach(function(key) {\n        map.set(key, stats[key]);\n        map[key] = stats[key];\n      });\n      return map;\n    };\n\n    var modernStatsTypes = {\n      inboundrtp: 'inbound-rtp',\n      outboundrtp: 'outbound-rtp',\n      candidatepair: 'candidate-pair',\n      localcandidate: 'local-candidate',\n      remotecandidate: 'remote-candidate'\n    };\n\n    var nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n    window.RTCPeerConnection.prototype.getStats = function(\n      selector,\n      onSucc,\n      onErr\n    ) {\n      return nativeGetStats.apply(this, [selector || null])\n        .then(function(stats) {\n          if (browserDetails.version < 48) {\n            stats = makeMapStats(stats);\n          }\n          if (browserDetails.version < 53 && !onSucc) {\n            // Shim only promise getStats with spec-hyphens in type names\n            // Leave callback version alone; misc old uses of forEach before Map\n            try {\n              stats.forEach(function(stat) {\n                stat.type = modernStatsTypes[stat.type] || stat.type;\n              });\n            } catch (e) {\n              if (e.name !== 'TypeError') {\n                throw e;\n              }\n              // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n              stats.forEach(function(stat, i) {\n                stats.set(i, Object.assign({}, stat, {\n                  type: modernStatsTypes[stat.type] || stat.type\n                }));\n              });\n            }\n          }\n          return stats;\n        })\n        .then(onSucc, onErr);\n    };\n  },\n\n  shimSenderGetStats: function(window) {\n    if (!(typeof window === 'object' && window.RTCPeerConnection &&\n        window.RTCRtpSender)) {\n      return;\n    }\n    if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {\n      return;\n    }\n    var origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n    if (origGetSenders) {\n      window.RTCPeerConnection.prototype.getSenders = function() {\n        var pc = this;\n        var senders = origGetSenders.apply(pc, []);\n        senders.forEach(function(sender) {\n          sender._pc = pc;\n        });\n        return senders;\n      };\n    }\n\n    var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n    if (origAddTrack) {\n      window.RTCPeerConnection.prototype.addTrack = function() {\n        var sender = origAddTrack.apply(this, arguments);\n        sender._pc = this;\n        return sender;\n      };\n    }\n    window.RTCRtpSender.prototype.getStats = function() {\n      return this.track ? this._pc.getStats(this.track) :\n          Promise.resolve(new Map());\n    };\n  },\n\n  shimReceiverGetStats: function(window) {\n    if (!(typeof window === 'object' && window.RTCPeerConnection &&\n        window.RTCRtpSender)) {\n      return;\n    }\n    if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {\n      return;\n    }\n    var origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n    if (origGetReceivers) {\n      window.RTCPeerConnection.prototype.getReceivers = function() {\n        var pc = this;\n        var receivers = origGetReceivers.apply(pc, []);\n        receivers.forEach(function(receiver) {\n          receiver._pc = pc;\n        });\n        return receivers;\n      };\n    }\n    utils.wrapPeerConnectionEvent(window, 'track', function(e) {\n      e.receiver._pc = e.srcElement;\n      return e;\n    });\n    window.RTCRtpReceiver.prototype.getStats = function() {\n      return this._pc.getStats(this.track);\n    };\n  },\n\n  shimRemoveStream: function(window) {\n    if (!window.RTCPeerConnection ||\n        'removeStream' in window.RTCPeerConnection.prototype) {\n      return;\n    }\n    window.RTCPeerConnection.prototype.removeStream = function(stream) {\n      var pc = this;\n      utils.deprecated('removeStream', 'removeTrack');\n      this.getSenders().forEach(function(sender) {\n        if (sender.track && stream.getTracks().indexOf(sender.track) !== -1) {\n          pc.removeTrack(sender);\n        }\n      });\n    };\n  },\n\n  shimRTCDataChannel: function(window) {\n    // rename DataChannel to RTCDataChannel (native fix in FF60):\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n    if (window.DataChannel && !window.RTCDataChannel) {\n      window.RTCDataChannel = window.DataChannel;\n    }\n  },\n\n  shimGetDisplayMedia: function(window, preferredMediaSource) {\n    if ('getDisplayMedia' in window.navigator) {\n      return;\n    }\n    navigator.getDisplayMedia = function(constraints) {\n      if (!(constraints && constraints.video)) {\n        var err = new DOMException('getDisplayMedia without video ' +\n            'constraints is undefined');\n        err.name = 'NotFoundError';\n        // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n        err.code = 8;\n        return Promise.reject(err);\n      }\n      if (constraints.video === true) {\n        constraints.video = {mediaSource: preferredMediaSource};\n      } else {\n        constraints.video.mediaSource = preferredMediaSource;\n      }\n      return navigator.mediaDevices.getUserMedia(constraints);\n    };\n  }\n};\n\n},{\"../utils\":14,\"./getusermedia\":12}],12:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar utils = require('../utils');\nvar logging = utils.log;\n\n// Expose public methods.\nmodule.exports = function(window) {\n  var browserDetails = utils.detectBrowser(window);\n  var navigator = window && window.navigator;\n  var MediaStreamTrack = window && window.MediaStreamTrack;\n\n  var shimError_ = function(e) {\n    return {\n      name: {\n        InternalError: 'NotReadableError',\n        NotSupportedError: 'TypeError',\n        PermissionDeniedError: 'NotAllowedError',\n        SecurityError: 'NotAllowedError'\n      }[e.name] || e.name,\n      message: {\n        'The operation is insecure.': 'The request is not allowed by the ' +\n        'user agent or the platform in the current context.'\n      }[e.message] || e.message,\n      constraint: e.constraint,\n      toString: function() {\n        return this.name + (this.message && ': ') + this.message;\n      }\n    };\n  };\n\n  // getUserMedia constraints shim.\n  var getUserMedia_ = function(constraints, onSuccess, onError) {\n    var constraintsToFF37_ = function(c) {\n      if (typeof c !== 'object' || c.require) {\n        return c;\n      }\n      var require = [];\n      Object.keys(c).forEach(function(key) {\n        if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n          return;\n        }\n        var r = c[key] = (typeof c[key] === 'object') ?\n            c[key] : {ideal: c[key]};\n        if (r.min !== undefined ||\n            r.max !== undefined || r.exact !== undefined) {\n          require.push(key);\n        }\n        if (r.exact !== undefined) {\n          if (typeof r.exact === 'number') {\n            r. min = r.max = r.exact;\n          } else {\n            c[key] = r.exact;\n          }\n          delete r.exact;\n        }\n        if (r.ideal !== undefined) {\n          c.advanced = c.advanced || [];\n          var oc = {};\n          if (typeof r.ideal === 'number') {\n            oc[key] = {min: r.ideal, max: r.ideal};\n          } else {\n            oc[key] = r.ideal;\n          }\n          c.advanced.push(oc);\n          delete r.ideal;\n          if (!Object.keys(r).length) {\n            delete c[key];\n          }\n        }\n      });\n      if (require.length) {\n        c.require = require;\n      }\n      return c;\n    };\n    constraints = JSON.parse(JSON.stringify(constraints));\n    if (browserDetails.version < 38) {\n      logging('spec: ' + JSON.stringify(constraints));\n      if (constraints.audio) {\n        constraints.audio = constraintsToFF37_(constraints.audio);\n      }\n      if (constraints.video) {\n        constraints.video = constraintsToFF37_(constraints.video);\n      }\n      logging('ff37: ' + JSON.stringify(constraints));\n    }\n    return navigator.mozGetUserMedia(constraints, onSuccess, function(e) {\n      onError(shimError_(e));\n    });\n  };\n\n  // Returns the result of getUserMedia as a Promise.\n  var getUserMediaPromise_ = function(constraints) {\n    return new Promise(function(resolve, reject) {\n      getUserMedia_(constraints, resolve, reject);\n    });\n  };\n\n  // Shim for mediaDevices on older versions.\n  if (!navigator.mediaDevices) {\n    navigator.mediaDevices = {getUserMedia: getUserMediaPromise_,\n      addEventListener: function() { },\n      removeEventListener: function() { }\n    };\n  }\n  navigator.mediaDevices.enumerateDevices =\n      navigator.mediaDevices.enumerateDevices || function() {\n        return new Promise(function(resolve) {\n          var infos = [\n            {kind: 'audioinput', deviceId: 'default', label: '', groupId: ''},\n            {kind: 'videoinput', deviceId: 'default', label: '', groupId: ''}\n          ];\n          resolve(infos);\n        });\n      };\n\n  if (browserDetails.version < 41) {\n    // Work around http://bugzil.la/1169665\n    var orgEnumerateDevices =\n        navigator.mediaDevices.enumerateDevices.bind(navigator.mediaDevices);\n    navigator.mediaDevices.enumerateDevices = function() {\n      return orgEnumerateDevices().then(undefined, function(e) {\n        if (e.name === 'NotFoundError') {\n          return [];\n        }\n        throw e;\n      });\n    };\n  }\n  if (browserDetails.version < 49) {\n    var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n        bind(navigator.mediaDevices);\n    navigator.mediaDevices.getUserMedia = function(c) {\n      return origGetUserMedia(c).then(function(stream) {\n        // Work around https://bugzil.la/802326\n        if (c.audio && !stream.getAudioTracks().length ||\n            c.video && !stream.getVideoTracks().length) {\n          stream.getTracks().forEach(function(track) {\n            track.stop();\n          });\n          throw new DOMException('The object can not be found here.',\n                                 'NotFoundError');\n        }\n        return stream;\n      }, function(e) {\n        return Promise.reject(shimError_(e));\n      });\n    };\n  }\n  if (!(browserDetails.version > 55 &&\n      'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n    var remap = function(obj, a, b) {\n      if (a in obj && !(b in obj)) {\n        obj[b] = obj[a];\n        delete obj[a];\n      }\n    };\n\n    var nativeGetUserMedia = navigator.mediaDevices.getUserMedia.\n        bind(navigator.mediaDevices);\n    navigator.mediaDevices.getUserMedia = function(c) {\n      if (typeof c === 'object' && typeof c.audio === 'object') {\n        c = JSON.parse(JSON.stringify(c));\n        remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n        remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n      }\n      return nativeGetUserMedia(c);\n    };\n\n    if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n      var nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n      MediaStreamTrack.prototype.getSettings = function() {\n        var obj = nativeGetSettings.apply(this, arguments);\n        remap(obj, 'mozAutoGainControl', 'autoGainControl');\n        remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n        return obj;\n      };\n    }\n\n    if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n      var nativeApplyConstraints = MediaStreamTrack.prototype.applyConstraints;\n      MediaStreamTrack.prototype.applyConstraints = function(c) {\n        if (this.kind === 'audio' && typeof c === 'object') {\n          c = JSON.parse(JSON.stringify(c));\n          remap(c, 'autoGainControl', 'mozAutoGainControl');\n          remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n        }\n        return nativeApplyConstraints.apply(this, [c]);\n      };\n    }\n  }\n  navigator.getUserMedia = function(constraints, onSuccess, onError) {\n    if (browserDetails.version < 44) {\n      return getUserMedia_(constraints, onSuccess, onError);\n    }\n    // Replace Firefox 44+'s deprecation warning with unprefixed version.\n    utils.deprecated('navigator.getUserMedia',\n        'navigator.mediaDevices.getUserMedia');\n    navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n  };\n};\n\n},{\"../utils\":14}],13:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n'use strict';\nvar utils = require('../utils');\n\nmodule.exports = {\n  shimLocalStreamsAPI: function(window) {\n    if (typeof window !== 'object' || !window.RTCPeerConnection) {\n      return;\n    }\n    if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n      window.RTCPeerConnection.prototype.getLocalStreams = function() {\n        if (!this._localStreams) {\n          this._localStreams = [];\n        }\n        return this._localStreams;\n      };\n    }\n    if (!('getStreamById' in window.RTCPeerConnection.prototype)) {\n      window.RTCPeerConnection.prototype.getStreamById = function(id) {\n        var result = null;\n        if (this._localStreams) {\n          this._localStreams.forEach(function(stream) {\n            if (stream.id === id) {\n              result = stream;\n            }\n          });\n        }\n        if (this._remoteStreams) {\n          this._remoteStreams.forEach(function(stream) {\n            if (stream.id === id) {\n              result = stream;\n            }\n          });\n        }\n        return result;\n      };\n    }\n    if (!('addStream' in window.RTCPeerConnection.prototype)) {\n      var _addTrack = window.RTCPeerConnection.prototype.addTrack;\n      window.RTCPeerConnection.prototype.addStream = function(stream) {\n        if (!this._localStreams) {\n          this._localStreams = [];\n        }\n        if (this._localStreams.indexOf(stream) === -1) {\n          this._localStreams.push(stream);\n        }\n        var pc = this;\n        stream.getTracks().forEach(function(track) {\n          _addTrack.call(pc, track, stream);\n        });\n      };\n\n      window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n        if (stream) {\n          if (!this._localStreams) {\n            this._localStreams = [stream];\n          } else if (this._localStreams.indexOf(stream) === -1) {\n            this._localStreams.push(stream);\n          }\n        }\n        return _addTrack.call(this, track, stream);\n      };\n    }\n    if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n      window.RTCPeerConnection.prototype.removeStream = function(stream) {\n        if (!this._localStreams) {\n          this._localStreams = [];\n        }\n        var index = this._localStreams.indexOf(stream);\n        if (index === -1) {\n          return;\n        }\n        this._localStreams.splice(index, 1);\n        var pc = this;\n        var tracks = stream.getTracks();\n        this.getSenders().forEach(function(sender) {\n          if (tracks.indexOf(sender.track) !== -1) {\n            pc.removeTrack(sender);\n          }\n        });\n      };\n    }\n  },\n  shimRemoteStreamsAPI: function(window) {\n    if (typeof window !== 'object' || !window.RTCPeerConnection) {\n      return;\n    }\n    if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n      window.RTCPeerConnection.prototype.getRemoteStreams = function() {\n        return this._remoteStreams ? this._remoteStreams : [];\n      };\n    }\n    if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n      Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n        get: function() {\n          return this._onaddstream;\n        },\n        set: function(f) {\n          if (this._onaddstream) {\n            this.removeEventListener('addstream', this._onaddstream);\n          }\n          this.addEventListener('addstream', this._onaddstream = f);\n        }\n      });\n      var origSetRemoteDescription =\n          window.RTCPeerConnection.prototype.setRemoteDescription;\n      window.RTCPeerConnection.prototype.setRemoteDescription = function() {\n        var pc = this;\n        if (!this._onaddstreampoly) {\n          this.addEventListener('track', this._onaddstreampoly = function(e) {\n            e.streams.forEach(function(stream) {\n              if (!pc._remoteStreams) {\n                pc._remoteStreams = [];\n              }\n              if (pc._remoteStreams.indexOf(stream) >= 0) {\n                return;\n              }\n              pc._remoteStreams.push(stream);\n              var event = new Event('addstream');\n              event.stream = stream;\n              pc.dispatchEvent(event);\n            });\n          });\n        }\n        return origSetRemoteDescription.apply(pc, arguments);\n      };\n    }\n  },\n  shimCallbacksAPI: function(window) {\n    if (typeof window !== 'object' || !window.RTCPeerConnection) {\n      return;\n    }\n    var prototype = window.RTCPeerConnection.prototype;\n    var createOffer = prototype.createOffer;\n    var createAnswer = prototype.createAnswer;\n    var setLocalDescription = prototype.setLocalDescription;\n    var setRemoteDescription = prototype.setRemoteDescription;\n    var addIceCandidate = prototype.addIceCandidate;\n\n    prototype.createOffer = function(successCallback, failureCallback) {\n      var options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n      var promise = createOffer.apply(this, [options]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n\n    prototype.createAnswer = function(successCallback, failureCallback) {\n      var options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n      var promise = createAnswer.apply(this, [options]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n\n    var withCallback = function(description, successCallback, failureCallback) {\n      var promise = setLocalDescription.apply(this, [description]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n    prototype.setLocalDescription = withCallback;\n\n    withCallback = function(description, successCallback, failureCallback) {\n      var promise = setRemoteDescription.apply(this, [description]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n    prototype.setRemoteDescription = withCallback;\n\n    withCallback = function(candidate, successCallback, failureCallback) {\n      var promise = addIceCandidate.apply(this, [candidate]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n    prototype.addIceCandidate = withCallback;\n  },\n  shimGetUserMedia: function(window) {\n    var navigator = window && window.navigator;\n\n    if (!navigator.getUserMedia) {\n      if (navigator.webkitGetUserMedia) {\n        navigator.getUserMedia = navigator.webkitGetUserMedia.bind(navigator);\n      } else if (navigator.mediaDevices &&\n          navigator.mediaDevices.getUserMedia) {\n        navigator.getUserMedia = function(constraints, cb, errcb) {\n          navigator.mediaDevices.getUserMedia(constraints)\n          .then(cb, errcb);\n        }.bind(navigator);\n      }\n    }\n  },\n  shimRTCIceServerUrls: function(window) {\n    // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n    var OrigPeerConnection = window.RTCPeerConnection;\n    window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n      if (pcConfig && pcConfig.iceServers) {\n        var newIceServers = [];\n        for (var i = 0; i < pcConfig.iceServers.length; i++) {\n          var server = pcConfig.iceServers[i];\n          if (!server.hasOwnProperty('urls') &&\n              server.hasOwnProperty('url')) {\n            utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n            server = JSON.parse(JSON.stringify(server));\n            server.urls = server.url;\n            delete server.url;\n            newIceServers.push(server);\n          } else {\n            newIceServers.push(pcConfig.iceServers[i]);\n          }\n        }\n        pcConfig.iceServers = newIceServers;\n      }\n      return new OrigPeerConnection(pcConfig, pcConstraints);\n    };\n    window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n    // wrap static methods. Currently just generateCertificate.\n    if ('generateCertificate' in window.RTCPeerConnection) {\n      Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n        get: function() {\n          return OrigPeerConnection.generateCertificate;\n        }\n      });\n    }\n  },\n  shimTrackEventTransceiver: function(window) {\n    // Add event.transceiver member over deprecated event.receiver\n    if (typeof window === 'object' && window.RTCPeerConnection &&\n        ('receiver' in window.RTCTrackEvent.prototype) &&\n        // can't check 'transceiver' in window.RTCTrackEvent.prototype, as it is\n        // defined for some reason even when window.RTCTransceiver is not.\n        !window.RTCTransceiver) {\n      Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n        get: function() {\n          return {receiver: this.receiver};\n        }\n      });\n    }\n  },\n\n  shimCreateOfferLegacy: function(window) {\n    var origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n    window.RTCPeerConnection.prototype.createOffer = function(offerOptions) {\n      var pc = this;\n      if (offerOptions) {\n        if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n          // support bit values\n          offerOptions.offerToReceiveAudio = !!offerOptions.offerToReceiveAudio;\n        }\n        var audioTransceiver = pc.getTransceivers().find(function(transceiver) {\n          return transceiver.sender.track &&\n              transceiver.sender.track.kind === 'audio';\n        });\n        if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {\n          if (audioTransceiver.direction === 'sendrecv') {\n            if (audioTransceiver.setDirection) {\n              audioTransceiver.setDirection('sendonly');\n            } else {\n              audioTransceiver.direction = 'sendonly';\n            }\n          } else if (audioTransceiver.direction === 'recvonly') {\n            if (audioTransceiver.setDirection) {\n              audioTransceiver.setDirection('inactive');\n            } else {\n              audioTransceiver.direction = 'inactive';\n            }\n          }\n        } else if (offerOptions.offerToReceiveAudio === true &&\n            !audioTransceiver) {\n          pc.addTransceiver('audio');\n        }\n\n\n        if (typeof offerOptions.offerToReceiveVideo !== 'undefined') {\n          // support bit values\n          offerOptions.offerToReceiveVideo = !!offerOptions.offerToReceiveVideo;\n        }\n        var videoTransceiver = pc.getTransceivers().find(function(transceiver) {\n          return transceiver.sender.track &&\n              transceiver.sender.track.kind === 'video';\n        });\n        if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n          if (videoTransceiver.direction === 'sendrecv') {\n            videoTransceiver.setDirection('sendonly');\n          } else if (videoTransceiver.direction === 'recvonly') {\n            videoTransceiver.setDirection('inactive');\n          }\n        } else if (offerOptions.offerToReceiveVideo === true &&\n            !videoTransceiver) {\n          pc.addTransceiver('video');\n        }\n      }\n      return origCreateOffer.apply(pc, arguments);\n    };\n  }\n};\n\n},{\"../utils\":14}],14:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar logDisabled_ = true;\nvar deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nfunction extractVersion(uastring, expr, pos) {\n  var match = uastring.match(expr);\n  return match && match.length >= pos && parseInt(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nfunction wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n  if (!window.RTCPeerConnection) {\n    return;\n  }\n  var proto = window.RTCPeerConnection.prototype;\n  var nativeAddEventListener = proto.addEventListener;\n  proto.addEventListener = function(nativeEventName, cb) {\n    if (nativeEventName !== eventNameToWrap) {\n      return nativeAddEventListener.apply(this, arguments);\n    }\n    var wrappedCallback = function(e) {\n      var modifiedEvent = wrapper(e);\n      if (modifiedEvent) {\n        cb(modifiedEvent);\n      }\n    };\n    this._eventMap = this._eventMap || {};\n    this._eventMap[cb] = wrappedCallback;\n    return nativeAddEventListener.apply(this, [nativeEventName,\n      wrappedCallback]);\n  };\n\n  var nativeRemoveEventListener = proto.removeEventListener;\n  proto.removeEventListener = function(nativeEventName, cb) {\n    if (nativeEventName !== eventNameToWrap || !this._eventMap\n        || !this._eventMap[cb]) {\n      return nativeRemoveEventListener.apply(this, arguments);\n    }\n    var unwrappedCb = this._eventMap[cb];\n    delete this._eventMap[cb];\n    return nativeRemoveEventListener.apply(this, [nativeEventName,\n      unwrappedCb]);\n  };\n\n  Object.defineProperty(proto, 'on' + eventNameToWrap, {\n    get: function() {\n      return this['_on' + eventNameToWrap];\n    },\n    set: function(cb) {\n      if (this['_on' + eventNameToWrap]) {\n        this.removeEventListener(eventNameToWrap,\n            this['_on' + eventNameToWrap]);\n        delete this['_on' + eventNameToWrap];\n      }\n      if (cb) {\n        this.addEventListener(eventNameToWrap,\n            this['_on' + eventNameToWrap] = cb);\n      }\n    },\n    enumerable: true,\n    configurable: true\n  });\n}\n\n// Utility methods.\nmodule.exports = {\n  extractVersion: extractVersion,\n  wrapPeerConnectionEvent: wrapPeerConnectionEvent,\n  disableLog: function(bool) {\n    if (typeof bool !== 'boolean') {\n      return new Error('Argument type: ' + typeof bool +\n          '. Please use a boolean.');\n    }\n    logDisabled_ = bool;\n    return (bool) ? 'adapter.js logging disabled' :\n        'adapter.js logging enabled';\n  },\n\n  /**\n   * Disable or enable deprecation warnings\n   * @param {!boolean} bool set to true to disable warnings.\n   */\n  disableWarnings: function(bool) {\n    if (typeof bool !== 'boolean') {\n      return new Error('Argument type: ' + typeof bool +\n          '. Please use a boolean.');\n    }\n    deprecationWarnings_ = !bool;\n    return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n  },\n\n  log: function() {\n    if (typeof window === 'object') {\n      if (logDisabled_) {\n        return;\n      }\n      if (typeof console !== 'undefined' && typeof console.log === 'function') {\n        console.log.apply(console, arguments);\n      }\n    }\n  },\n\n  /**\n   * Shows a deprecation warning suggesting the modern and spec-compatible API.\n   */\n  deprecated: function(oldMethod, newMethod) {\n    if (!deprecationWarnings_) {\n      return;\n    }\n    console.warn(oldMethod + ' is deprecated, please use ' + newMethod +\n        ' instead.');\n  },\n\n  /**\n   * Browser detector.\n   *\n   * @return {object} result containing browser and version\n   *     properties.\n   */\n  detectBrowser: function(window) {\n    var navigator = window && window.navigator;\n\n    // Returned result object.\n    var result = {};\n    result.browser = null;\n    result.version = null;\n\n    // Fail early if it's not a browser\n    if (typeof window === 'undefined' || !window.navigator) {\n      result.browser = 'Not a browser.';\n      return result;\n    }\n\n    if (navigator.mozGetUserMedia) { // Firefox.\n      result.browser = 'firefox';\n      result.version = extractVersion(navigator.userAgent,\n          /Firefox\\/(\\d+)\\./, 1);\n    } else if (navigator.webkitGetUserMedia) {\n      // Chrome, Chromium, Webview, Opera.\n      // Version matches Chrome/WebRTC version.\n      result.browser = 'chrome';\n      result.version = extractVersion(navigator.userAgent,\n          /Chrom(e|ium)\\/(\\d+)\\./, 2);\n    } else if (navigator.mediaDevices &&\n        navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)) { // Edge.\n      result.browser = 'edge';\n      result.version = extractVersion(navigator.userAgent,\n          /Edge\\/(\\d+).(\\d+)$/, 2);\n    } else if (window.RTCPeerConnection &&\n        navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) { // Safari.\n      result.browser = 'safari';\n      result.version = extractVersion(navigator.userAgent,\n          /AppleWebKit\\/(\\d+)\\./, 1);\n    } else { // Default fallthrough: not supported.\n      result.browser = 'Not a supported browser.';\n      return result;\n    }\n\n    return result;\n  }\n};\n\n},{}]},{},[3])(3)\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport { pluralize } from 'ember-inflector';\nimport { BASE_GROUP_FIELDS } from '../models/group';\nimport { BASE_PERSON, FULL_PERSON } from '../models/person';\nimport SearchAdapterMixin from '../search/adapter-mixin';\n\nconst versions = {\n    people: 'v2',\n    groups: 'v2',\n    locations: 'v1',\n    users: 'v1',\n    messages: 'v1',\n    notifications: 'v1'\n};\n\nconst ApplicationAdapter = DS.RESTAdapter.extend(SearchAdapterMixin, {\n    logger: Ember.inject.service('stash-logger'),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    defaultSerializer: 'application',\n\n    namespace: 'api',\n\n    shouldReloadAll() {\n        return true;\n    },\n\n    shouldBackgroundReloadRecord() {\n        return false;\n    },\n\n    normalizeErrorResponse(status, headers, payload) {\n        // force json-api error format\n        let data = {};\n        data.errors = [payload];\n        return this._super(status, headers, data);\n    },\n\n    modelFor(type) {\n        return this.pathForType(type);\n    },\n\n    pathForType(type) {\n        if (type.modelName) {\n            type = type.modelName;\n        }\n\n        type = Ember.String.camelize(type);\n        return pluralize(type);\n    },\n\n    createRecord(store, type, record) {\n        var snapshot = record._createSnapshot();\n        var data = store.serializerFor(type.modelName).serialize(snapshot, { includeId: true });\n        return this.ajax(this.buildURL(type.modelName), 'POST', { data: data });\n    },\n\n    updateRecord(store, type, snapshot) {\n        let data = {};\n        store.serializerFor(type.modelName).serializeIntoHash(data, type, snapshot);\n        if (data[type.modelName]) {\n            data = data[type.modelName];\n        }\n        Ember.set(data, 'version', snapshot.attr('version'));\n        return this.ajax(this.urlForUpdateRecord(snapshot.id, type.modelName), 'POST', { data: data });\n    },\n\n    buildURL(type, id) {\n        return this._directoryUrl(type, id);\n    },\n\n    findRecord(store, type, id, snapshot) {\n        let data = {};\n        const traditional = true;\n\n        if (type.modelName === 'person') {\n            data = Object.assign({}, data, FULL_PERSON);\n        } else {\n            data = Object.assign({}, data, { fl: '*' });\n        }\n\n        return this.ajax(this.buildURL(type.modelName, id, snapshot, 'findRecord'), 'GET', { data, traditional });\n    },\n\n    findQuery() {\n        return this.query(...arguments);\n    },\n\n    entityEndpoint(path, type, id) {\n        let modelEndpoint = this.pathForType(type);\n        let apiVersion = versions[modelEndpoint];\n        let host = !!this.host ? this.host : '';\n        if (type === 'person') {\n            return `${host}/platform/directory/${this.namespace}/${apiVersion}/${modelEndpoint}/${id}/${path}`;\n        }\n\n        return `${host}/${this.namespace}/${apiVersion}/${modelEndpoint}/${id}/${path}`;\n    },\n\n    findMultiEntity(store, params, requestType) {\n        if (!params) {\n            params = { limit: 25, fl: '*', _entity: 'all', facets: '*' };\n        }\n\n        if (requestType === 'search') {\n            // new style search instead of query\n            params = Object.assign({}, params, {\n                returnFields: [...BASE_PERSON.fl.split(','), ...BASE_GROUP_FIELDS]\n            });\n            return this.performSearch(params);\n        }\n\n        return Ember.RSVP.reject(new Error('old style search has been removed. Please update to new search'));\n    },\n\n    findFavorites() {\n        return this.findFavoritesPublicApiV2();\n    },\n\n    findFavoritesPublicApiV2() {\n        const url = this.get('application').pcV2Uri('api/v2/users/favorites');\n        const deferred = Ember.RSVP.defer();\n        this._findFavoritesPublicApiV2(url)\n            .then(res => {\n                this._handleFavorites(res, [], deferred, url);\n            })\n            .catch(error => {\n                this.get('logger').error('Error trying to find favorites:', error);\n                deferred.resolve([]);\n            });\n        return deferred.promise;\n    },\n\n    _findFavoritesPublicApiV2(url, page = 1) {\n        return this.ajax(url, 'GET', {\n            data: {\n                pageNumber: page,\n                pageSize: 25\n            },\n            cache: false\n        });\n    },\n\n    _handleFavorites(data, collection, deferred, url) {\n        const results = data.entities;\n        if (results && results.length === 0) {\n            return deferred.resolve(collection);\n        }\n\n        collection = collection.concat(results);\n\n        const nextPage = data.page + 1;\n        return this._findFavoritesPublicApiV2(url, nextPage)\n            .then(data => {\n                return this._handleFavorites(data, collection, deferred, url);\n            })\n            .catch(error => {\n                this.get('logger').error('Error while loading favorites:', {\n                    error,\n                    page: nextPage,\n                    currentCount: collection.length\n                });\n                deferred.resolve(collection);\n            });\n    },\n\n    forwardVoicemail(voicemail, recipient, type, params = {}) {\n        let host = !!this.host ? this.host : '';\n        const url = `${host}/platform/${this.namespace}/v2/voicemail/messages`;\n        params = Object.assign({}, params, {\n            voicemailMessageId: voicemail,\n            userId: type === 'person' ? recipient : null,\n            groupId: type === 'group' ? recipient : null\n        });\n        return this.ajax(url, 'POST', { data: params, cache: false });\n    },\n\n    _findDirectReports(url, page = 1) {\n        const count = 25;\n        const offset = count * (page - 1);\n        return this.ajax(url, 'GET', {\n            data: { count, offset, fl: BASE_PERSON.fl }\n        });\n    },\n\n    _handleReports(data, collection, deferred, url, page) {\n        const results = data.res;\n\n        if (results && results.length === 0) {\n            return deferred.resolve(collection);\n        }\n\n        collection = [].concat(collection, results);\n\n        const nextPage = page + 1;\n        return this._findDirectReports(url, nextPage)\n            .then(data => {\n                return this._handleReports(data, collection, deferred, url, nextPage);\n            })\n            .catch(error => {\n                this.get('logger').error('Error while loading directs report page', {\n                    error,\n                    page: nextPage,\n                    currentCount: collection.length\n                });\n                deferred.resolve(collection);\n            });\n    },\n\n    findDirectReports(store, type, id, params) {\n        if (!params) {\n            params = { fl: '*' };\n        }\n\n        const deferred = Ember.RSVP.defer();\n        const url = this.entityEndpoint('directReports', type, id);\n        this._findDirectReports(url, 1)\n            .then(data => {\n                return this._handleReports(data, [], deferred, url, 1);\n            })\n            .catch(error => {\n                this.get('logger').error('Error while attempting to find reports', {\n                    error,\n                    id\n                });\n                deferred.resolve([]);\n            });\n        return deferred.promise;\n    },\n\n    findSuperiors(store, type, id, params) {\n        if (!params) {\n            params = { fl: '*' };\n        }\n\n        var url = this.entityEndpoint('superiors', type, id);\n        return this.ajax(url, 'GET', { data: params });\n    },\n\n    urlForUpdateRecord(id, type) {\n        let modelEndpoint = this.pathForType(type);\n        let apiVersion = versions[modelEndpoint];\n        let url = `/${this.namespace}/${apiVersion}/${modelEndpoint}`;\n        if (id) {\n            url += `/${id}`;\n        }\n\n        return url;\n    },\n\n    _directoryUrl(type, id) {\n        let modelEndpoint = this.pathForType(type);\n        let apiVersion = versions[modelEndpoint];\n        let url = `/${this.namespace}/${apiVersion}/${modelEndpoint}`;\n        if (type === 'person') {\n            url = `/platform/directory${url}`;\n        }\n\n        if (id) {\n            url += `/${id}`;\n        }\n\n        return url;\n    }\n});\n\nexport default ApplicationAdapter;\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject, computed } = Ember;\n\nconst { RESTAdapter } = DS;\n\nexport default RESTAdapter.extend({\n    session: inject.service(),\n    application: inject.service(),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n\n    updateRecord(store, type, snapshot) {\n        const data = {};\n        const serializer = store.serializerFor(type.modelName);\n\n        serializer.serializeIntoHash(data, type, snapshot);\n\n        const id = snapshot.id;\n        const url = this.buildURL(type.modelName, id, snapshot, 'updateRecord');\n\n        let method = 'PUT';\n        if (snapshot.adapterOptions && snapshot.adapterOptions.patch) {\n            method = 'PATCH';\n        }\n\n        return this.ajax(url, method, { data: data });\n    },\n\n    urlForFindRecord(id) {\n        // the id provided should be the the user guid\n        return `${this.get('host')}/${this.get('namespace')}/users/${id}/callforwarding`;\n    },\n\n    urlForUpdateRecord(id) {\n        return this.urlForFindRecord(id);\n    },\n\n    // Typically we wouldnt rewrite this private function, but we need to modify how errors are extracted\n    // See: https://github.com/emberjs/data/issues/4934\n    handleResponse(status, headers, payload, requestData) {\n        let data = {};\n        if (payload && status !== 200) {\n            data.errors = [payload];\n        } else {\n            data = payload;\n        }\n        return this._super(status, headers, data, requestData);\n    }\n});\n","import Ember from 'ember';\nimport ApplicationAdapter from './application';\nimport moment from '../utils/dates';\nimport _ from 'lodash';\n\nconst {\n    inject: { service }\n} = Ember;\n\nexport default ApplicationAdapter.extend({\n    session: service(),\n    application: service(),\n\n    useExternalContactExpand: true,\n\n    paging: {\n        pageSize: 25,\n        pageNumber: 1\n    },\n    queryDefaults: {\n        currentInterval: moment(),\n        previousInterval: moment().subtract(1, 'week')\n    },\n\n    query(store, typeClass, query) {\n        if (query.findLatestCalls) {\n            return this._fetchLatestCalls(...arguments);\n        }\n        return this._fetchHistory(...arguments);\n    },\n\n    /**\n     * _fetchLatestCalls - Fetch the latest calls\n     * @return Promise\n     */\n    _fetchLatestCalls() {\n        const guid = this.get('session.person.guid');\n        if (!guid) {\n            return Ember.RSVP.resolve([]);\n        }\n        const data = {\n            interval: `${moment().subtract(2, 'hours').toISOString()}/${moment().add(2, 'hours').toISOString()}`\n        };\n        return this.ajax(this.getHistoryPath(), 'GET', { data });\n    },\n\n    /**\n     * _fetchHistory - Fetch the history in a given interval. This method handles paging and adjusting the interval parameter\n     * depending on how many entities are returned so that subsequent calls will fetch previous conversations.\n     * @param  {Object}  query     The default query passed in.\n     * @return {Promise}\n     */\n    _fetchHistory(...params) {\n        let query = params[2];\n        const guid = this.get('session.person.guid');\n        if (!guid) {\n            return Ember.RSVP.resolve([]);\n        }\n        const queryDefaults = this.get('queryDefaults');\n        const meta = _.merge(queryDefaults, query);\n        const paging = this.get('paging');\n        const data = {\n            interval: `${meta.previousInterval.toISOString()}/${meta.currentInterval.toISOString()}`,\n            pageSize: paging.pageSize,\n            pageNumber: paging.pageNumber\n        };\n        return this.ajax(this.getHistoryPath(), 'GET', { data }).then(data => {\n            if (data.entities && data.entities.length === this.get('paging.pageSize')) {\n                this.incrementPageNumber();\n            } else {\n                this.decrementWeek();\n            }\n            return data;\n        });\n    },\n\n    /**\n     * incrementPageNumber - Increments the page number\n     */\n    incrementPageNumber() {\n        this.set('paging.pageNumber', this.get('paging.pageNumber') + 1);\n    },\n\n    /**\n     * decrementWeek - Modifies interval to previous week\n     */\n    decrementWeek() {\n        this.set('paging.pageNumber', 1);\n        let currentInterval = this.get('queryDefaults.currentInterval');\n        let previousInterval = this.get('queryDefaults.previousInterval');\n        this.set('queryDefaults.currentInterval', currentInterval.subtract(1, 'week'));\n        this.set('queryDefaults.previousInterval', previousInterval.subtract(1, 'week'));\n    },\n\n    /**\n     * getHistoryPath - Generates history uri for xhr\n     */\n    getHistoryPath() {\n        if (this.get('useExternalContactExpand')) {\n            return this.get('application').pcUri('api/v2/conversations/calls/history?expand=externalcontact');\n        }\n        return this.get('application').pcUri('api/v2/conversations/calls/history');\n    }\n});\n","import Geolocation from './geolocation';\n\nexport default Geolocation.extend();\n","import PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({\n    // This ensures conversation models use the purecloud adapter\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport { pluralize } from 'ember-inflector';\nconst { inject, computed } = Ember;\n\nexport default DS.RESTAdapter.extend({\n    application: inject.service(),\n    namespace: 'api/v2/authorization',\n    host: computed.reads('application.purecloudV2BaseUri'),\n    divisionLimit: null,\n\n    pathForType(modelName) {\n        return pluralize(modelName);\n    },\n\n    // custom findAll method sets pageSize equal to division limit\n    findAll(store, type, sinceToken, snapshotRecordArray) {\n        let objectCount = Ember.get(snapshotRecordArray, 'adapterOptions.objectCount');\n        let url = this.buildURL(type.modelName, null, snapshotRecordArray, 'findAll');\n        const limitPath = 'api/v2/authorization/divisions/limit';\n        const limitUrl = this.get('application').pcV2Uri(limitPath);\n        return Ember.RSVP.resolve(\n            this.get('divisionLimit') ||\n                Ember.$.ajax({\n                    type: 'GET',\n                    url: limitUrl\n                })\n        ).then(divisionLimit => {\n            this.set('divisionLimit', divisionLimit);\n            return this.ajax(url, 'GET', {\n                data: {\n                    pageSize: divisionLimit,\n                    objectCount: objectCount ? true : false\n                }\n            });\n        });\n    }\n});\n","import Ember from 'ember';\nimport PurecloudAdapter from '../purecloud';\nimport { addPageAction } from 'connections-ui/utils/newrelic';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\n\nconst { computed, inject } = Ember;\n\nconst STRICT = true;\nconst EXPAND = 'externalOrganization,externalDataSources,division';\nconst PHONE_LOOKUP_EXPAND = 'contacts.externalOrganization,externalDataSources';\nconst TIME_OUT = 15000; // public API takes 10 seconds to time out - but adding a little more than 10 as fudge factor\nconst QUERY_MAX_LENGTH = 256;\nconst ORIGINATOR = 'connections-ui';\n\nexport default PurecloudAdapter.extend(LoggerMixin, RelateFeaturesMixin, {\n    logger: inject.service('stash-logger'),\n    application: inject.service(),\n    relate: inject.service(),\n    addressformat: inject.service(),\n    permissions: inject.service(),\n\n    namespace: 'api/v2',\n\n    defaultSerializer: 'externalcontacts/contact',\n\n    pathForType: function () {\n        return 'externalcontacts/contacts';\n    },\n\n    cannotViewExternalContacts: computed.not('permissions.hasExternalContactsViewContactAccess'),\n\n    createRecord(store, type, record) {\n        this.get('relate').clearCachedAdapter();\n        const data = Object.assign(store.serializerFor(type.modelName).serialize(record, { includeId: true }), {\n            originator: ORIGINATOR\n        });\n        return this.ajax(this.buildURL(type.modelName), 'POST', { data: data });\n    },\n\n    findRecord(store, type, id) {\n        const urlAndModel = this.buildURL(type.modelName);\n        const params = `?${Ember.$.param({ expand: EXPAND })}`;\n\n        return this.ajax(`${urlAndModel}/${id}${params}`, 'GET', { timeout: TIME_OUT });\n    },\n\n    deleteRecord() {\n        const returnValue = this._super(...arguments);\n        this.get('relate').clearCachedAdapter();\n        return returnValue;\n    },\n\n    query(store, type, queryParams) {\n        const addressFormat = this.get('addressformat');\n\n        let { searchTerm, pageNumber, pageSize, expandField, sortOrder, originator, subType } = queryParams;\n        const hasValidSearchTerm = searchTerm && typeof searchTerm === 'string';\n        const isValidPhoneNumber = addressFormat.isValidNumber(searchTerm, null, STRICT);\n\n        // only attempt to phone format search strings that look like phone numbers and contain only phone number like characters\n        const containsOnlyPhoneNumberChars = /^(\\+|\\d|\\)|\\(|\\.|-|\\s)+$/gim.test(searchTerm);\n\n        // only mutate search if not wrapped in \"\"\n        const isExactSearch = /^\"(.*)\"$/.test(searchTerm);\n        if (isExactSearch) {\n            // Log exact search occurrences for tracking usage\n            addPageAction('externalContactExactSearch', {\n                userId: this.get('session.user.id'),\n                orgId: this.get('session.org.guid')\n            });\n        } else if (containsOnlyPhoneNumberChars && isValidPhoneNumber) {\n            searchTerm = addressFormat.formatAddress(searchTerm);\n        }\n\n        let data = {};\n        if (expandField) {\n            data.expand = expandField;\n        }\n        if (originator) {\n            data.originator = originator;\n        }\n        if (subType) {\n            data.subType = subType;\n        }\n        let url = this.buildURL(type.modelName);\n\n        if (this.get('cannotViewExternalContacts')) {\n            // Logging a failure of the permissions check here is unnecessary because this is merely the ultimate\n            // backstop to catch unpermitted external contaxts service calls. It's the responsibility of the caller\n            // to handle the response and either log and/or alert the user.  See RELATE-1776\n            return Ember.RSVP.resolve({});\n        }\n\n        if (queryParams.useLookupService) {\n            // Use the \"reverse whitepages\" search endpoint\n            url = this.get('application').pcUri(`api/v2/externalcontacts/reversewhitepageslookup`);\n\n            data.lookupVal = searchTerm;\n            if (expandField) {\n                data.expand = PHONE_LOOKUP_EXPAND;\n            }\n            if (originator) {\n                data.originator = originator;\n            }\n        } else {\n            if (hasValidSearchTerm) {\n                const term = encodeURI(searchTerm.replace('tel:', ''));\n\n                try {\n                    if (term.length > QUERY_MAX_LENGTH) {\n                        throw new Error('Query length limit encountered');\n                    }\n                } catch (error) {\n                    this.get('logger').error(\n                        `ACD: Attempted to send query larger than limit. From: ${originator} `,\n                        error\n                    );\n                }\n\n                data.q = decodeURI(term.substr(0, QUERY_MAX_LENGTH)); // remove characters beyond limit\n            }\n            if (pageNumber) {\n                data.pageNumber = pageNumber;\n            }\n            if (pageSize) {\n                data.pageSize = pageSize;\n            }\n            if (sortOrder) {\n                data.sortOrder = sortOrder;\n            }\n            if (originator) {\n                data.originator = originator;\n            }\n        }\n        if (queryParams.bypassCache) {\n            return this.get('relate').findMatchingExternalContacts(\n                searchTerm,\n                pageNumber,\n                pageSize,\n                expandField,\n                originator\n            );\n        }\n        return this.get('relate').getCachedAdapter({ url, data, TIME_OUT }, this);\n    }\n});\n","import Ember from 'ember';\nimport PurecloudAdapter from '../purecloud';\nconst EXPAND = 'externalDataSources';\n\nconst TIME_OUT = 10000;\nconst ORIGINATOR = 'connections-ui';\n\nexport default PurecloudAdapter.extend({\n    relate: Ember.inject.service(),\n\n    namespace: 'api/v2',\n    defaultSerializer: 'externalcontacts/organizations',\n\n    pathForType: function () {\n        return 'externalcontacts/organizations';\n    },\n\n    createRecord(store, type, record) {\n        this.get('relate').clearCachedAdapter();\n        const data = Object.assign(store.serializerFor(type.modelName).serialize(record, { includeId: true }), {\n            originator: ORIGINATOR\n        });\n        return this.ajax(this.buildURL(type.modelName), 'POST', { data: data });\n    },\n\n    findRecord(store, type, id) {\n        const urlAndModel = this.buildURL(type.modelName);\n        const params = `?${Ember.$.param({ expand: EXPAND })}`;\n\n        return this.ajax(`${urlAndModel}/${id}${params}`, 'GET', { timeout: TIME_OUT }); // msec - we saw ~100 msec latency for this call in DCA testing.  This ought to cover it.\n    },\n\n    updateRecord(store, type, snapshot) {\n        const id = snapshot.id;\n        const url = this.buildURL(type.modelName) + '/' + id;\n        const dataType = 'json';\n        const data = Object.assign(this.serialize(snapshot, { includeId: true }), { originator: ORIGINATOR });\n\n        return this.ajax(url, 'PUT', { dataType, data });\n    },\n\n    deleteRecord() {\n        const returnValue = this._super(...arguments);\n        this.get('relate').clearCachedAdapter();\n        return returnValue;\n    },\n\n    query(store, type, queryParams) {\n        const url = this.buildURL(type.modelName);\n        let searchTerm = queryParams.searchTerm;\n        let pageNumber = queryParams.pageNumber;\n        let pageSize = queryParams.pageSize;\n        let originator = queryParams.originator;\n\n        let data = {};\n        data.expand = EXPAND;\n\n        if (searchTerm) {\n            data.q = searchTerm.replace('tel:', ''); // Strip the 'tel:', if any\n        }\n        if (pageNumber) {\n            data.pageNumber = pageNumber;\n        }\n        if (pageSize) {\n            data.pageSize = pageSize;\n        }\n        if (originator) {\n            data.originator = originator;\n        }\n        return this.get('relate').getCachedAdapter({ url, data, TIME_OUT }, this);\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nexport default DS.RESTAdapter.extend({\n    application: Ember.inject.service(),\n\n    urlForFindRecord() {\n        return this.get('application').pcV2Uri(`api/v2/geolocations/settings`);\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nexport default DS.RESTAdapter.extend({\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    updateRecord(store, type, snapshot) {\n        var data = {};\n        var serializer = store.serializerFor(type.modelName);\n\n        serializer.serializeIntoHash(data, type, snapshot);\n\n        var id = snapshot.id;\n        var url = this.buildURL(type.modelName, id, snapshot, 'updateRecord');\n\n        if (url.indexOf('undefined') !== -1 || !this.get('session.person.guid')) {\n            // ignore this by resolving undefined. something trying to save geolocation when not authenticated\n            return Ember.RSVP.resolve();\n        }\n\n        return this.ajax(url, 'PATCH', { data: data });\n    },\n\n    urlForUpdateRecord(id) {\n        return this.get('application').pcV2Uri(`api/v2/users/${this.get('session.person.guid')}/geolocations/${id}`);\n    },\n\n    handleResponse(status) {\n        let response = this._super(...arguments);\n        if (response && response.name && response.name === 'Error') {\n            response.code = status;\n        }\n        return response;\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject } = Ember;\n\nexport default DS.RESTAdapter.extend({\n    application: inject.service(),\n    createRecord(store, type, snapshot) {\n        const path = `api/v2/authorization/subjects/${snapshot.record.get('subjectId')}/divisions/${snapshot.record.get(\n            'division.id'\n        )}/roles/${snapshot.record.get('role.id')}?subjectType=PC_GROUP`;\n        const url = this.get('application').pcV2Uri(path);\n        return this.ajax(url, 'POST', {\n            dataType: 'text'\n        });\n    },\n\n    deleteRecord(store, type, snapshot) {\n        const path = `api/v2/authorization/subjects/${snapshot.record.get('subjectId')}/divisions/${snapshot.record.get(\n            'division.id'\n        )}/roles/${snapshot.record.get('role.id')}`;\n        const url = this.get('application').pcV2Uri(path);\n        return this.ajax(url, 'DELETE');\n    },\n\n    saveBulk(roleId, subjectIds, divisionIds) {\n        const path = `api/v2/authorization/roles/${roleId}?subjectType=PC_GROUP`;\n        const url = this.get('application').pcV2Uri(path);\n        return this.ajax(url, 'POST', {\n            data: {\n                subjectIds,\n                divisionIds\n            }\n        });\n    },\n\n    ajaxOptions(url, type, options) {\n        // get the default RESTAdapter 'ajaxOptions'\n        let hash = this._super(url, type, options);\n        if (type === 'DELETE' || type === 'POST') {\n            hash.dataType = 'text';\n        }\n        return hash;\n    },\n\n    ajaxSuccess(jqXHR, data) {\n        if (typeof data === 'string') {\n            // return an empty object so the Serializer\n            // handles it correctly\n            return {};\n        } else {\n            return data;\n        }\n    },\n\n    normalizeErrorResponse(status, headers, payload) {\n        // force json-api error format\n        let data = {};\n        data.errors = [payload];\n        return this._super(status, headers, data);\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject, computed } = Ember;\n\nexport default DS.RESTAdapter.extend({\n    session: inject.service(),\n    application: inject.service(),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n    namespace: `api/v2`,\n\n    urlForFindRecord(id) {\n        return this._baseUrl(id);\n    },\n\n    urlForUpdateRecord(id) {\n        return this._baseUrl(id);\n    },\n\n    updateRecord(store, type, snapshot) {\n        let data = {};\n        let serializer = store.serializerFor(type.modelName);\n\n        serializer.serializeIntoHash(data, type, snapshot);\n\n        let id = snapshot.id;\n        let url = this.buildURL(type.modelName, id, snapshot, 'updateRecord');\n\n        return this.ajax(url, 'PATCH', { data: data.groupPolicy });\n    },\n\n    handleResponse(status, headers, payload, requestData) {\n        if (status < 400) {\n            return this._super(...arguments);\n        }\n\n        payload.errors = [\n            {\n                status,\n                title: payload.message,\n                details: payload\n            }\n        ];\n\n        return this._super(status, headers, payload, requestData);\n    },\n\n    _baseUrl(guid) {\n        return `${this.get('host')}/${this.get('namespace')}/voicemail/groups/${guid}/policy`;\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject } = Ember;\nconst { RESTAdapter } = DS;\n\nexport default RESTAdapter.extend({\n    session: inject.service(),\n    application: inject.service(),\n    store: Ember.inject.service(),\n\n    buildQuery() {\n        return {\n            fl: '*'\n        };\n    },\n\n    baseUrl() {\n        return this.get('application').pcV2Uri('api/v2/groups');\n    },\n\n    urlForFindRecord(id) {\n        return `${this.baseUrl()}/${id}/profile`;\n    },\n\n    urlForUpdateRecord(id) {\n        return `${this.baseUrl()}/${id}/profile`;\n    },\n\n    entityEndpoint(endpoint, type, id) {\n        return `${this.baseUrl()}/${id}/${endpoint}`;\n    },\n\n    urlForFindMany() {\n        return this.get('application').pcV2Uri('api/v2/profiles/groups');\n    },\n\n    urlForDeleteRecord(id) {\n        return `${this.baseUrl()}/${id}`;\n    },\n\n    findRecord(store, type, id, snapshot) {\n        const url = this.buildURL(type.modelName, id, snapshot, 'findRecord');\n        const traditional = true;\n        const data = Object.assign({}, data, { fields: '*' });\n        return this.ajax(url, 'GET', { data, traditional }).then(gProfile => {\n            if (snapshot.record.get('version') && gProfile.version !== snapshot.attr('version')) {\n                snapshot.record.set('version', gProfile.version);\n            }\n\n            /*\n                Is this a new Group?\n                When creating a group by default there is only one owner so\n                the member count will always be 1 on a create.  The bevy service\n                is eventually consistent so we may have a member count of 0\n                after our next GET.  Therefore we set the memberCount to 1\n                by default.\n            */\n            if (\n                gProfile.general.memberCount[0].value === 0 &&\n                gProfile.individuals.individuals.length === 0 &&\n                gProfile.owners.owners.length === 1\n            ) {\n                gProfile.general.memberCount[0].value = 1;\n            }\n\n            return gProfile;\n        });\n    },\n\n    // Need to overwrite so that we can provide the version on all updates\n    // and make sure data isn't key'd by type\n    updateRecord(store, type, snapshot) {\n        let data = {};\n        const groupSerializer = store.serializerFor(type.modelName);\n        groupSerializer.serializeIntoHash(data, type, snapshot);\n\n        if (this.get('session.features.groupProileNoIndividualsSave') && data.group.individuals) {\n            return this.get('store')\n                .findRecord('group-policy', data.group.guid)\n                .then(policy => {\n                    data = this.generateGroupProfilePayload(groupSerializer, data, policy);\n\n                    if (data[type.modelName]) {\n                        data = data[type.modelName];\n                    }\n                    return this.ajax(this.urlForUpdateRecord(snapshot.id, type.modelName), 'PUT', { data: data });\n                });\n        } else {\n            data = this.generateGroupProfilePayload(groupSerializer, data);\n\n            if (data[type.modelName]) {\n                data = data[type.modelName];\n            }\n            return this.ajax(this.urlForUpdateRecord(snapshot.id, type.modelName), 'PUT', { data: data });\n        }\n    },\n\n    deleteRecord(store, type, snapshot) {\n        let id = snapshot.id;\n        return this.ajax(this.buildURL(type.modelName, id, snapshot, 'deleteRecord'), 'DELETE', {\n            dataType: 'text'\n        }).then(() => {\n            // After a delete using the public API we need to go get that deleted group\n            // to keep ember-data happy.\n            const jIdNumber = this.getJidIdNumber(snapshot.record.data.contactInfo.chat[0].value.jid);\n            return this.getDeletedGroup(jIdNumber);\n        });\n    },\n\n    ajaxOptions(url, type) {\n        const hash = this._super(...arguments);\n        // Our apis are silly...\n        if (type && type.toLowerCase() === 'delete') {\n            hash.dataType = 'text';\n        }\n        return hash;\n    },\n\n    findMany(store, type, ids, snapshots) {\n        const url = this.buildURL(type.modelName, ids, snapshots, 'findMany');\n\n        let uuids = '';\n        let jIds = '';\n        let urlWithAppendedIds = '';\n        let urlDeletedWithAppendedIds = `${this.baseUrl()}/bulk/deleted?jabberId=`;\n\n        ids.forEach(id => {\n            // accepts jIds or ids\n            if (id.indexOf('-') > -1) {\n                uuids = uuids.concat(id, ',');\n            } else {\n                id = this.getJidIdNumber(id);\n                jIds = jIds.concat(id, ',');\n            }\n        });\n\n        if (uuids.length > 0) {\n            uuids = uuids.substring(0, uuids.length - 1);\n            urlWithAppendedIds = urlWithAppendedIds.concat('id=', uuids);\n            urlWithAppendedIds = `${url}?${urlWithAppendedIds}`;\n        } else if (jIds.length > 0) {\n            jIds = jIds.substring(0, jIds.length - 1);\n            urlWithAppendedIds = urlWithAppendedIds.concat('jabberId=', jIds);\n            urlWithAppendedIds = `${url}?${urlWithAppendedIds}`;\n            urlDeletedWithAppendedIds = urlDeletedWithAppendedIds.concat(jIds);\n        } else {\n            urlWithAppendedIds = `${url}`;\n        }\n\n        /*\n            When using public API / bevy deleted groups are not returned yet they are needed.\n            We need to make speical request to get those deleted groups.  WebRtc provides a list\n            that is used to fill out is roster...in the form of jabberIds.  As part of this\n            we need to evaluate the jabberIds that are missing in the initial GET request,\n            find the missing deleted ones and make a request to get those deleted groups.\n        */\n        if (jIds.length > 0) {\n            return this.ajax(urlWithAppendedIds, 'GET').then(activeResults => {\n                return this.getDeletedGroups(urlDeletedWithAppendedIds, activeResults);\n            });\n        }\n\n        return this.ajax(urlWithAppendedIds, 'GET');\n    },\n\n    getDeletedGroups(deleteUrl, groupsResults) {\n        return new Ember.RSVP.Promise(resolve => {\n            this.ajax(deleteUrl, 'GET').then(deletedGroups => {\n                deletedGroups.entities.forEach(g => {\n                    groupsResults.entities.push(this.normalizeDeletedGroup(g));\n                });\n                return resolve(groupsResults);\n            });\n        });\n    },\n\n    getDeletedGroup(id) {\n        const getUrl = `${this.baseUrl()}/bulk/deleted?jabberId=${id}`;\n        return new Ember.RSVP.Promise(resolve => {\n            this.ajax(getUrl, 'GET').then(deletedGroup => {\n                return resolve(deletedGroup);\n            });\n        });\n    },\n\n    findFavorites() {\n        const adapter = this.store.adapterFor('application');\n        return adapter.findFavorites(...arguments);\n    },\n\n    findGroupMembership(id, params) {\n        const query = params;\n\n        if (typeof params.offset === 'number' && params.limit) {\n            query.pageNumber = 1 + Math.ceil(params.offset / params.limit);\n            query.pageSize = params.limit;\n        }\n        const url = `${this.baseUrl()}/${id}/members`;\n        return this.ajax(url, 'GET', { data: params });\n    },\n\n    generateGroupProfilePayload(groupSerializer, json, vmPolicy) {\n        let gProfile = json.group;\n\n        gProfile.organizationId = this.get('session.org.guid');\n        gProfile.id = gProfile.guid;\n        delete gProfile.guid;\n\n        if (gProfile.mt) {\n            delete gProfile.mt;\n        }\n\n        if (gProfile.meta) {\n            delete gProfile.meta;\n        }\n\n        delete gProfile.membershipDraft;\n\n        if (gProfile.general.needsCommit) {\n            delete gProfile.general.needsCommit;\n        }\n\n        if (gProfile.general.exchangeSync) {\n            delete gProfile.general.exchangeSync;\n        }\n\n        if (gProfile.general.links && gProfile.general.links.length > 0) {\n            groupSerializer.cleanGroupLinkIds(gProfile.general.links);\n        }\n\n        if (\n            gProfile.contactInfo.email &&\n            gProfile.contactInfo.email.length > 0 &&\n            gProfile.contactInfo.email[0].value == ''\n        ) {\n            delete gProfile.contactInfo.email;\n        }\n\n        if (!Array.isArray(gProfile.contactInfo.groupNumber)) {\n            delete gProfile.contactInfo.groupNumber;\n        }\n\n        if (gProfile.contactInfo.phone) {\n            delete gProfile.contactInfo.phone;\n        }\n\n        if (gProfile.contactInfo.groupNumber && gProfile.contactInfo.groupNumber.length > 0) {\n            if (gProfile.contactInfo.groupNumber[0].labelKey) {\n                delete gProfile.contactInfo.groupNumber[0].labelKey;\n            }\n\n            if (!this.hasGroupPhone(gProfile.contactInfo.groupNumber[0])) {\n                delete gProfile.contactInfo.groupNumber;\n            }\n        }\n\n        // The members API already adds individuals to groups,  we\n        // do not send the individuals to keep the request size down.\n        if (this.get('session.features.groupProileNoIndividualsSave') && gProfile.individuals) {\n            // The exception is when a voicemail policy of SEQUENTIAL is in place,\n            // then the individuals must be sent to maintain the order of individuals.\n            if (!vmPolicy || vmPolicy.data.groupAlertType !== 'SEQUENTIAL') {\n                delete gProfile.individuals;\n            }\n        }\n\n        return gProfile;\n    },\n\n    hasGroupPhone(numberInfo) {\n        const hasNumber = numberInfo.value && numberInfo.value.number && numberInfo.value.number !== '';\n        const hasExtension = numberInfo.value && numberInfo.value.extension && numberInfo.value.extension !== '';\n\n        if (hasNumber || hasExtension) {\n            return true;\n        }\n\n        return false;\n    },\n\n    getJidIdNumber(jid) {\n        return jid.indexOf('@') > -1 ? jid.split('@')[0] : jid;\n    },\n\n    normalizeDeletedGroup(deletedGroup) {\n        deletedGroup.general = {\n            name: [\n                {\n                    value: deletedGroup.name,\n                    labelKey: 'name'\n                }\n            ],\n            groupType: [\n                {\n                    value: deletedGroup.type === 'offical' ? 'groups.offical' : deletedGroup.type,\n                    labelKey: 'groupType'\n                }\n            ],\n            memberCount: [\n                {\n                    value: deletedGroup.memberCount,\n                    labelKey: 'memberCount'\n                }\n            ]\n        };\n        deletedGroup.contactInfo = {\n            chat: [\n                {\n                    value: {\n                        jid: deletedGroup.chat.jabberId\n                    },\n                    labelKey: 'chat'\n                }\n            ]\n        };\n        delete deletedGroup.name;\n        delete deletedGroup.chat;\n        delete deletedGroup.groupType;\n        delete deletedGroup.memberCount;\n\n        return deletedGroup;\n    }\n});\n","import PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({\n    pathForType: function () {\n        return 'v2/responsemanagement/libraries';\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport { BASE_LOCATION_FIELDS } from '../models/location';\n\nconst { inject, computed } = Ember;\n\nconst { RESTAdapter } = DS;\n\nexport default RESTAdapter.extend({\n    session: inject.service(),\n    application: inject.service(),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n\n    buildQuery() {\n        return {\n            expand: BASE_LOCATION_FIELDS.join(',')\n        };\n    },\n\n    baseUrl(id) {\n        return `${this.get('host')}/${this.get('namespace')}/locations/${id}`;\n    },\n\n    urlForUpdateRecord(id) {\n        return this.baseUrl(id);\n    },\n\n    urlForFindRecord(id) {\n        // the id provided should be the the user guid\n        return this.baseUrl(id);\n    },\n\n    urlForHasMany(id) {\n        return `${this.baseUrl(id)}/sublocations`;\n    },\n\n    // Need to overwrite the private function to load activities we need\n    findRecord(store, type, id, snapshot) {\n        const url = this.buildURL(type.modelName, id, snapshot, 'findRecord');\n        const query = this.buildQuery(snapshot);\n        return Ember.RSVP.hash({\n            location: this.ajax(url, 'GET', { data: query }),\n            floors: this.ajax(this.urlForHasMany(id), 'GET', { data: query }).catch(() => Ember.RSVP.resolve({}))\n        });\n    },\n\n    // Need to overwrite so that we can provide the version on all updates\n    // and make sure data isnt key'd by type\n    updateRecord(store, type, snapshot) {\n        let data = {};\n        store.serializerFor(type.modelName).serializeIntoHash(data, type, snapshot);\n        if (data[type.modelName]) {\n            data = data[type.modelName];\n        }\n        Ember.set(data, 'version', snapshot.attr('version'));\n        return this.ajax(this.urlForUpdateRecord(snapshot.id, type.modelName), 'PUT', { data: data });\n    },\n\n    handleResponse(status, headers, payload, requestData) {\n        if (status < 400) {\n            return this._super(...arguments);\n        }\n\n        payload.errors = [\n            {\n                status,\n                title: payload.message,\n                details: payload\n            }\n        ];\n\n        return this._super(status, headers, payload, requestData);\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject, computed } = Ember;\n\nexport default DS.RESTAdapter.extend({\n    session: inject.service(),\n    application: inject.service(),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n\n    init() {\n        this._super(...arguments);\n    },\n\n    urlForFindAll() {\n        const userId = this.get('session.person.guid');\n        return `${this.get('host')}/${this.get('namespace')}/users/${userId}/meetings`;\n    },\n\n    urlForFindRecord(id, modelName, snapshot) {\n        const meeting = snapshot.attr('meeting');\n        if (meeting) {\n            const meetingId = meeting.id;\n            return `${this.get('host')}/${this.get('namespace')}/meetings/${meetingId}/occurrences/${id}`;\n        }\n        return `${this.get('host')}/${this.get('namespace')}/meetings/${id}`;\n    },\n\n    urlForQuery() {\n        return this.urlForFindAll();\n    },\n\n    urlForUpdateRecord(id, modelName, snapshot) {\n        if (!!Ember.get(snapshot, 'adapterOptions.updateSeries')) {\n            return `${this.get('host')}/${this.get('namespace')}/meetings/${id}`;\n        }\n        const meetingId = snapshot.attr('meeting').id;\n        return `${this.get('host')}/${this.get('namespace')}/meetings/${meetingId}/occurrences/${id}`;\n    },\n\n    urlForCreateRecord() {\n        return `${this.get('host')}/${this.get('namespace')}/meetings`;\n    },\n\n    urlForDeleteRecord(id, modelName, snapshot) {\n        const meeting = snapshot.attr('meeting');\n        if (!meeting) {\n            return `${this.get('host')}/${this.get('namespace')}/meetings/${id}`;\n        }\n\n        const meetingId = meeting.id;\n        if (!!Ember.get(snapshot, 'adapterOptions.deleteSeries')) {\n            return `${this.get('host')}/${this.get('namespace')}/meetings/${meetingId}`;\n        }\n        return `${this.get('host')}/${this.get('namespace')}/meetings/${meetingId}/occurrences/${id}`;\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nimport { batchEntityIds } from '../services/store';\nimport { BASE_PERSON } from '../models/person';\n\nconst { inject, computed } = Ember;\n\nconst { RESTAdapter } = DS;\n\nexport default RESTAdapter.extend({\n    ajaxService: inject.service('ajax'),\n    session: inject.service(),\n    application: inject.service(),\n    integrationsPresenceSvc: inject.service('integrations-presence'),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n\n    namespace: 'api/v2',\n\n    buildQuery() {\n        return {\n            fl: '*',\n            expand: BASE_PERSON.expand\n        };\n    },\n\n    baseUrl(id) {\n        return `${this.get('host')}/${this.get('namespace')}/users/${id}`;\n    },\n\n    urlForUpdateRecord(id) {\n        return `${this.baseUrl(id)}/profile`;\n    },\n\n    urlForFindRecord(id) {\n        // the id provided should be the the user guid\n        return `${this.baseUrl(id)}/profile`;\n    },\n\n    urlForFindMany() {\n        return `${this.get('host')}/${this.get('namespace')}/profiles/users`;\n    },\n\n    // Need to overwrite the private function to load activities we need\n    findRecord(store, type, id, options) {\n        const url = this.buildURL(type.modelName, id, options, 'findRecord');\n        const query = this.buildQuery(options);\n\n        let usingIntegrationSource =\n            options && options.adapterOptions && options.adapterOptions.integrationPresenceSource;\n        // use the provided presence source\n        if (usingIntegrationSource) {\n            query.integrationPresenceSource = options.adapterOptions.integrationPresenceSource;\n            query.expand = `${query.expand},integrationPresence`;\n        }\n\n        return this.ajax(url, 'GET', { data: query });\n    },\n\n    // Need to overwrite so that we can provide the version on all updates\n    // and make sure data isnt key'd by type\n    updateRecord(store, type, snapshot) {\n        let data = {};\n        store.serializerFor(type.modelName).serializeIntoHash(data, type, snapshot);\n        if (data[type.modelName]) {\n            data = data[type.modelName];\n        }\n        Ember.set(data, 'version', snapshot.attr('version'));\n        return this.ajax(this.urlForUpdateRecord(snapshot.id, type.modelName), 'PUT', { data: data });\n    },\n\n    // allows looking up by jid or by guid, but not both\n    findMany(store, type, ids, snapshotsOrOptions) {\n        const url = this.buildURL(type.modelName, ids, snapshotsOrOptions, 'findMany');\n\n        const guids = ids.filter(id => id.indexOf('@') === -1);\n        const jids = ids.filter(id => id.indexOf('@') > -1);\n\n        if (jids.length > 0 && guids.length > 0) {\n            return Ember.RSVP.reject(new Error('Mixed jid and guid person lookup'));\n        }\n        if (jids.length > 0) {\n            return this._findMany(url, jids, 'jids', snapshotsOrOptions);\n        }\n        if (guids.length > 0) {\n            return this._findMany(url, guids, 'guids', snapshotsOrOptions);\n        }\n\n        return Ember.RSVP.reject(new Error('findMany person without ids'));\n    },\n\n    findFavorites() {\n        const adapter = this.store.adapterFor('application');\n        return adapter.findFavorites(...arguments);\n    },\n\n    findSuperiors(store, id, params) {\n        const url = `${this.baseUrl(id)}/superiors`;\n        return this.ajax(url, 'GET', {\n            data: params\n        }).then(superiors => {\n            if (!superiors || !superiors.length) {\n                return [];\n            }\n            return this.findMany(store, 'person', superiors.mapBy('id'));\n        });\n    },\n\n    findDirectReports(store, id, params) {\n        const url = `${this.baseUrl(id)}/directreports`;\n        return this.ajax(url, 'GET', {\n            data: params\n        }).then(directReports => {\n            if (!directReports || !directReports.length) {\n                return [];\n            }\n            return this.findMany(store, 'person', directReports.mapBy('id'));\n        });\n    },\n\n    _findMany(url, ids, type, options) {\n        let key = 'id';\n        if (type === 'jids') {\n            key = 'jid';\n        }\n        let baseRequestData = {\n            fl: '*',\n            expand: BASE_PERSON.expand\n        };\n        let batchAmount = 25;\n        // use the provided presence source\n        let usingIntegrationSource =\n            options && options.adapterOptions && options.adapterOptions.integrationPresenceSource;\n        // use the provided presence source\n        if (usingIntegrationSource) {\n            baseRequestData.integrationPresenceSource = options.adapterOptions.integrationPresenceSource;\n            baseRequestData.expand = `${baseRequestData.expand},integrationPresence`;\n        }\n        const promises = batchEntityIds(ids, batchAmount).map(ids => {\n            const requestData = Object.assign({}, baseRequestData, {\n                [key]: ids.join(',')\n            });\n            if (this.get('session.features.enableUIAjaxRetryHeader')) {\n                let promise = this.get('ajaxService').raw(url, {\n                    method: 'GET',\n                    contentType: 'application/json',\n                    data: requestData,\n                    dataType: 'json',\n                    retry: true\n                });\n                return promise\n                    .then(({ response }) => Ember.RSVP.resolve(response))\n                    .catch(({ response }) => Ember.RSVP.reject(response));\n            } else {\n                return this.ajax(url, 'GET', {\n                    data: requestData\n                });\n            }\n        });\n        return Ember.RSVP.all(promises).then(res => {\n            let data = {\n                entities: res.map(d => d.entities).flat()\n            };\n            if (usingIntegrationSource) {\n                data.meta = {\n                    integrationSource:\n                        options && options.adapterOptions && options.adapterOptions.integrationPresenceSource,\n                    usingIntegrationSource: true\n                };\n            }\n            return data;\n        });\n    },\n\n    _loadActivities(id) {\n        const url = `${this.get('host')}/${this.get('namespace')}/users/${id}`;\n        return this.ajax(url, 'GET', {\n            data: {\n                expand: BASE_PERSON.expand\n            }\n        });\n    },\n\n    handleResponse(status, headers, payload, requestData) {\n        if (status < 400) {\n            return this._super(...arguments);\n        }\n\n        payload.errors = [\n            {\n                status,\n                title: payload.message,\n                details: payload\n            }\n        ];\n\n        return this._super(status, headers, payload, requestData);\n    }\n});\n","import Ember from 'ember';\nimport PurecloudAdapter from './purecloud';\nconst { computed, inject } = Ember;\n\nexport default PurecloudAdapter.extend({\n    session: inject.service(),\n    permissions: inject.service(),\n    application: inject.service(),\n    host: computed.reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n\n    buildQuery(snapshot) {\n        let query = {\n            state: 'deleted'\n        };\n\n        if (snapshot.adapterOptions && snapshot.adapterOptions.expand) {\n            query.expand = snapshot.adapterOptions.expand;\n        }\n\n        return query;\n    },\n\n    urlForQuery() {\n        if (this.get('permissions.canTargetUserSearchOutsideOfDivision')) {\n            return `${this.get('host')}/${this.namespace}/users/search/conversation/target`;\n        } else {\n            return `${this.get('host')}/${this.namespace}/users/search`;\n        }\n    },\n\n    findBelongsTo(store, snapshot, link, relationship) {\n        // We only support person belongsTo relationship for profiles\n        const adapter = this.store.adapterFor(relationship.type);\n        return adapter.findRecord(store, store.modelFor('person'), snapshot.id, snapshot);\n    },\n\n    buildURL(modelName, id, modelClass, requestType, snapshotOrQuery) {\n        if (requestType === 'query') {\n            return this.urlForQuery(id, 'public-api-user', snapshotOrQuery);\n        }\n        const host = this.get('host') ? this.get('host') : '';\n        return `${host}/${this.namespace}/${this.pathForType('users')}/${id}`;\n    },\n\n    /**\n     * Overridden to support our custom seach API\n     * This is copied directly from the ember-data codebase:\n     * https://github.com/emberjs/data/blob/v2.16.0/addon/adapters/rest.js#L541\n     */\n    query(store, type, query) {\n        let url = this.buildURL(type.modelName, null, null, 'query', query);\n        return this.ajax(url, 'POST', { data: query });\n    }\n});\n","import PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nexport default DS.RESTAdapter.extend({\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    defaultSerializer: 'purecloud',\n\n    host: '/platform',\n    namespace: 'api',\n\n    shouldReloadAll() {\n        return true;\n    },\n\n    shouldBackgroundReloadRecord() {\n        return false;\n    },\n\n    modelFor(type) {\n        return this.pathForType(type);\n    },\n\n    normalizeErrorResponse(status, headers, payload) {\n        if (payload && typeof payload === 'object') {\n            return [\n                {\n                    status: `${status}`,\n                    title: payload.code,\n                    detail: {\n                        message: payload.message,\n                        contextId: payload.contextId\n                    }\n                }\n            ];\n        }\n\n        return [{ status, payload }];\n    },\n\n    ajaxOptions(url, type, hash) {\n        // https://github.com/emberjs/data/issues/1398\n        // https://github.com/emberjs/data/blob/v2.7.0/addon/adapters/rest.js#L1065\n        hash = this._super(url, type, hash);\n\n        if (type === 'DELETE') {\n            hash.dataType = 'text';\n        }\n\n        return hash;\n    },\n\n    // TODO: replace this private function with request type hooks\n    buildURL(modelName, id, snapshot, requestType) {\n        if (requestType === 'query' && modelName === 'voicemail-message') {\n            return this._super(...arguments);\n        }\n        if (requestType === 'findAll' && modelName === 'conversation') {\n            return null;\n        }\n\n        const objId = id ? `/${id}` : '';\n        const path = `${this.get('namespace')}/${this.pathForType(modelName)}${objId}`;\n        const url = this.get('application').pcV2Uri(path);\n\n        return url;\n    },\n\n    updateRecord(store, type, record) {\n        var data = this.serialize(record, {\n            includeId: true\n        });\n        var id = Ember.get(record, 'id');\n\n        if (type.modelName === 'voicemail-message') {\n            return this.ajax(this.buildURL(type.modelName, id), 'PATCH', { data: data });\n        }\n        return this.ajax(this.buildURL(type.modelName, id), 'PUT', { data: data });\n    },\n\n    deleteRecord(store, type, record) {\n        const id = Ember.get(record, 'id');\n        const url = this.buildURL(type.modelName, id);\n        return this.ajax(url, 'DELETE', { dataType: 'text' });\n    }\n});\n","import Ember from 'ember';\nimport PurecloudAdapter from './purecloud';\n\nconst TARGET_QUEUE_SEARCH_PERMISSION = 'conversation:communication:target';\nconst DIVISION_PERMITTED_URL = 'api/v2/authorization/divisionspermitted/paged/me';\nconst DIVISION_LIMIT_URL = 'api/v2/authorization/divisions/limit';\n\nconst { inject, computed, RSVP } = Ember;\n\nexport default PurecloudAdapter.extend({\n    application: inject.service(),\n    session: inject.service(),\n    permissions: inject.service(),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n\n    divisionLimit: null,\n\n    pathForType: function (type) {\n        switch (type) {\n            case 'divisionAgnostic':\n                return 'routing/queues/divisionviews';\n            case 'myQueues':\n                return 'routing/queues/me';\n            default:\n                return 'routing/queues';\n        }\n    },\n\n    async query(store, type, query) {\n        let fetchDivisions = false;\n        let path = this.buildURL(type);\n        query.name = query.name ? query.name.toLowerCase() : '';\n\n        if (query.divisionAgnostic) {\n            path = this.buildURL('divisionAgnostic');\n            delete query.divisionAgnostic;\n            if (this.get('permissions.canTargetQueueSearchOutsideOfDivision')) {\n                fetchDivisions = true;\n            }\n        } else if (!this.get('permissions.canTargetQueueSearchOutsideOfDivision')) {\n            // Handle case where permission is actually false\n            // When permission is false revert back to fetching across all divisions\n            path = this.buildURL('divisionAgnostic');\n            delete query.divisionAgnostic;\n        }\n\n        if (query.myQueuesOnly) {\n            path = `${this.buildURL('myQueues')}`;\n            fetchDivisions = false;\n        }\n\n        if (fetchDivisions) {\n            const response = await this.fetchDivisionsForTargetQueueSearch();\n            const results = response && response.entities ? response.entities : [];\n            const divisionIds = results.map(entity => entity.id);\n            if (divisionIds.length > 0) {\n                query.divisionId = divisionIds.join(',');\n            }\n        }\n\n        return this.ajax(path, 'GET', { data: query });\n    },\n\n    getDivisionLimits() {\n        const url = this.get('application').pcV2Uri(DIVISION_LIMIT_URL);\n        return RSVP.resolve(this.get('divisionLimit') || this.ajax(url, 'GET'));\n    },\n\n    async fetchDivisionsForTargetQueueSearch() {\n        const divisionLimit = await this.getDivisionLimits();\n        const pageSize = divisionLimit || 25;\n        this.set('divisionLimit', pageSize);\n        const url = this.get('application').pcV2Uri(DIVISION_PERMITTED_URL);\n        return this.ajax(url, 'GET', {\n            data: {\n                pageSize,\n                permission: TARGET_QUEUE_SEARCH_PERMISSION\n            }\n        });\n    },\n\n    findRecord(store, type, id, snapshot) {\n        if (snapshot.adapterOptions && snapshot.adapterOptions.divisionAware) {\n            const path = this.buildURL('divisionAgnostic');\n            return this.ajax(path, 'GET', { data: { id } });\n        }\n        return this._super(...arguments);\n    }\n});\n","import PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({\n    pathForType: function () {\n        return 'v2/userrecordings';\n    },\n\n    findAll: function (store, type) {\n        return this.ajax(this.buildURL(type.modelName) + '?expand=conversation', 'GET');\n    }\n});\n","define(\"connections-ui/adapters/recording\", [\"exports\", \"ember-purecloud-components/adapters/recording\"], function (_exports, _recording) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _recording.default;\n    }\n  });\n});\n","import PurecloudAdapter from './purecloud';\nimport _ from 'lodash';\n\nexport default PurecloudAdapter.extend({\n    defaultSerializer: 'response',\n\n    pathForType: function () {\n        return 'v2/responsemanagement/responses';\n    },\n\n    query: function (store, type, query) {\n        return this.ajax(`${this.buildURL(type)}/query`, 'POST', { data: query });\n    },\n\n    findMany: function (store, type, ids, pageNumber, pageSize) {\n        const currentPage = pageNumber || 1,\n            currentPageSize = pageSize || 25;\n\n        const query = {\n            pageSize: currentPageSize,\n            pageNumber: currentPage,\n            libraryId: _.head(ids)\n        };\n\n        return this.ajax(this.buildURL(type), 'GET', { data: query });\n    }\n});\n","import ApplicationAdapter from './application';\nimport Ember from 'ember';\n\nconst { inject } = Ember;\n\nexport default ApplicationAdapter.extend({\n    application: inject.service(),\n\n    buildURL(type, id) {\n        const modelEndpoint = this.pathForType(type);\n        const path = `api/v2/authorization/${modelEndpoint}` + id ? `/${id}` : '';\n        return this.get('application').pcV2Uri(path);\n    },\n\n    findAll() {\n        const initialPage = 1;\n        const pageSize = 100;\n        let records = [];\n        let aggregatePayload;\n        return this._getPage(initialPage, pageSize)\n            .then(result => {\n                aggregatePayload = result;\n                records.concat(result.entities);\n                let promises = [];\n                for (let page = 2; page <= result.pageCount; page++) {\n                    promises.push(this._getPage(page, pageSize));\n                }\n                return Ember.RSVP.all(promises);\n            })\n            .then(results => {\n                results.forEach(result => {\n                    aggregatePayload.entities = aggregatePayload.entities.concat(result.entities);\n                });\n                aggregatePayload.entities.sort(function (roleA, roleB) {\n                    if (roleA.name < roleB.name) {\n                        return -1;\n                    } else if (roleA.name > roleB.name) {\n                        return 1;\n                    } else {\n                        return 0;\n                    }\n                });\n                return aggregatePayload;\n            });\n    },\n\n    _getPage(pageNumber, pageSize) {\n        const path = `api/v2/authorization/roles?pageSize=${pageSize}&pageNumber=${pageNumber}&userCount=false`;\n        const url = this.get('application').pcV2Uri(path);\n        return this.ajax(url, 'GET');\n    }\n});\n","import PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({\n    pathForType: function () {\n        return 'v2/stations';\n    }\n});\n","import ApplicationAdapter from './application';\n\nvar UserAdapter = ApplicationAdapter.extend({\n    findQuery: function (store, type, query) {\n        return this.ajax(this.buildURL(type), 'GET', { data: query });\n    }\n});\n\nexport default UserAdapter;\n","import PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({\n    pathForType() {\n        return 'v2/voicemail/messages';\n    },\n\n    urlForQuery() {\n        return `${this.host}/${this.namespace}/v2/voicemail/search`;\n    },\n\n    updateRecord() {\n        return this._super(...arguments);\n    },\n\n    // Override private function (copying default impl)\n    // so we can 'POST' to the API\n    // TODO: Remove ds-improved-ajax lands\n    query(store, type, query) {\n        const url = this.buildURL(type.modelName, null, null, 'query', query);\n\n        if (this.sortQueryParams) {\n            query = this.sortQueryParams(query);\n        }\n\n        return this.ajax(url, 'POST', { data: query });\n    },\n\n    // Use this in place of:\n    //   methodForRequest\n    //   dataForRequest\n    // TODO: Remove ds-improved-ajax lands\n    sortQueryParams(query) {\n        return {\n            pageSize: query.pageSize || 15,\n            pageNumber: query.pageNumber || 1,\n            sortOrder: 'DESC',\n            sortBy: 'createdTime',\n            query: [\n                {\n                    type: 'EXACT',\n                    fields: ['owner'],\n                    value: 'ALL'\n                },\n                {\n                    type: 'EXACT',\n                    fields: ['deleted'],\n                    value: 'false'\n                }\n            ]\n        };\n    }\n});\n","import Ember from 'ember';\nimport Resolver from './resolver';\nimport defineModifier from 'ember-concurrency-test-waiter/define-modifier';\nimport loadInitializers from 'ember-load-initializers';\nimport config from './config/environment';\nimport _ from 'lodash';\n\nimport { registerElements } from 'genesys-spark-components';\nregisterElements();\n\n// Polyfills for iframe-coordinator\nimport 'custom-event-polyfill/polyfill';\n/* eslint-disable no-unused-vars */\n// These imports shouldn't need to be assigned to variables, but without\n// importing this way, babel 6 will load them in after the iframe-coordinator\n// module, defeating the point of the polyfills.\nimport shim from '@webcomponents/custom-elements/src/native-shim';\nimport elements from '@webcomponents/custom-elements';\n/* eslint-enable no-unused-vars */\nimport iframeCoordinator from 'iframe-coordinator';\n\n// Enable the iframe-coordinator custom elements\niframeCoordinator.registerCustomElements();\n\nimport { defineCustomElements } from '@genesys/genesys-cloud-webcomponents/dist/loader';\ndefineCustomElements();\n\n/* eslint-disable */\n\nimport HostedContext from './utils/hosted-context';\n\n/* eslint-enable */\n\nif (config.APP && config.APP.LOG_RUNLOOP_STACKTRACE) {\n    Ember.run.backburner.DEBUG = true;\n}\n\nif (config.APP && config.APP.LOG_BINDINGS) {\n    Ember.LOG_BINDINGS = true;\n}\n\nconst { inject, Application } = Ember;\n\n// allows ember concurrency tasks to use withTestWaiter()\ndefineModifier();\n\nconst App = Application.extend(config.APP, {\n    cookies: inject.service('cookies'),\n    stashLogger: inject.service('stash-logger'),\n    applicationService: inject.service('application'),\n    customEvents: {\n        // Pagination events from inbox-v2\n        pageChanged: 'pageChanged',\n        itemsPerPageChanged: 'itemsPerPageChanged',\n        // GCW Events\n        favoriteEvent: 'favoriteEvent',\n        contactEvent: 'contactEvent',\n        navigateToProfileEvent: 'navigateToProfileEvent'\n    },\n\n    modulePrefix: config.modulePrefix,\n    podModulePrefix: config.podModulePrefix,\n    Resolver,\n\n    engines: {\n        emberEngineCustomFields: {\n            dependencies: {\n                services: [\n                    'application',\n                    'intl',\n                    'session',\n                    'stash-logger',\n                    'ajax',\n                    'store',\n                    'notification',\n                    'permissions',\n                    'schema'\n                ],\n                externalRoutes: {\n                    personDetail: 'person.detail',\n                    admin: 'admin'\n                }\n            }\n        }\n    },\n\n    entityTypes: ['person', 'group'], //TODO - 10/12/14 - Is this used anymore?\n\n    currentRouteName: null, // Set by ApplicationController\n\n    debug: false,\n\n    init() {\n        this.initVersion();\n        this.initContext();\n        return this._super(...arguments);\n    },\n\n    isImpersonating: Ember.computed('session.person.id', function () {\n        var proxyPersonId = this.get('cookies').read('proxyPerson');\n\n        if (proxyPersonId) {\n            return proxyPersonId === this.get('session.person.id');\n        }\n\n        return false;\n    }),\n\n    iframed() {\n        try {\n            return window.self !== window.top;\n        } catch (e) {\n            return true;\n        }\n    },\n\n    initVersion() {\n        Ember.libraries.register('PureCloud Collaborate', this.get('semver'));\n\n        if (!Ember.ENV.LOG_VERSION) {\n            Ember.Logger.debug('PureCloud Collaborate', this.get('semver'));\n        }\n\n        const libs = this.libs || {};\n        _.forOwn(libs, (version, key) => {\n            Ember.libraries.register(key, version);\n            if (!Ember.ENV.LOG_VERSION) {\n                Ember.Logger.debug(key, version);\n            }\n        });\n    },\n\n    initContext() {\n        this.set('context', 'directory');\n    },\n\n    // Debugging utility functions...not for use in app logic\n    controllerFor(name) {\n        return this.instance.lookup(`controller:${name}`);\n    },\n\n    // Debugging utility functions...not for use in app logic\n    serviceFor(name) {\n        return this.instance.lookup(`service:${name}`);\n    },\n\n    // Debugging utility functions...not for use in app logic\n    componentFor(id) {\n        return this.instance.lookup('-view-registry:main')[id];\n    },\n\n    listAsync() {\n        this.resolveRegistration('util:debug-backburner').logTimerQueue();\n        this.resolveRegistration('util:debug-rsvp').logPendingPromises();\n    },\n\n    promiseStackFor(id) {\n        this.resolveRegistration('util:debug-rsvp').lookupPromiseStack(id);\n    }\n});\n\nloadInitializers(App, config.modulePrefix);\n\nError.stackTraceLimit = 100;\n\nexport default App;\n","export default Ember.HTMLBars.template({\"id\":\"d+F87FRd\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"application-loading\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[26,[\\\"auth-loading\\\"]],false],[0,\\\"\\\\n    \\\"],[1,[26,[\\\"icon-bootstrap\\\"]],false],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/application-loading/template.hbs\"}});","define(\"connections-ui/attach-media-stream/util\", [\"exports\", \"ember-webrtc-components/attach-media-stream/util\"], function (_exports, _util) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _util.default;\n    }\n  });\n});\n","define(\"connections-ui/audio-visualizer/component\", [\"exports\", \"ember-audio-visualizer/components/audio-visualizer/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport Base from 'ember-simple-auth/authenticators/base';\nimport _ from 'lodash';\nimport { SESSION_BOOTSTRAP_ERROR_TYPE } from '../services/session';\nimport { Client } from '@genesys/gc-mfe-auth';\nimport { addPageAction } from '../utils/newrelic';\n\nconst { RSVP } = Ember;\n\nconst authLoginPath = '/oauth/authorize';\nconst oauthStoreParams = ['access_token', 'token_type', 'expires_in'];\nconst oauthStoreProps = [...oauthStoreParams, 'token_expiry_time_millis', 'token_expiry_time_iso_string'];\nconst authLogoutPath = '/logout';\n\nconst AUTH_COOKIE_NAME = 'ININ-Auth-Api';\n\nexport default Base.extend({\n    ajax: Ember.inject.service(),\n    cookies: Ember.inject.service(),\n    session: Ember.inject.service(),\n    stashLogger: Ember.inject.service('stash-logger'),\n    purecloudOauth: Ember.inject.service(),\n    applicationService: Ember.inject.service('application'),\n\n    authClient: null,\n\n    // Check existing authentication\n    async restore(data) {\n        if (window === window.parent) {\n            // Not in an iframe. For the standalone mode for development.\n            var accessToken = null;\n            if (data && typeof data === 'object') {\n                accessToken = data.access_token;\n            }\n\n            if (!accessToken) {\n                throw new Error('No token');\n            } else {\n                await this._establishLocalSession(accessToken);\n                await _.pick(data, oauthStoreProps);\n            }\n        } else {\n            // In an iframe, in WebDirectory?\n            if (!this.authClient) {\n                const clientId = this.get('oauthProps.clientId');\n                this.authClient = new Client(clientId);\n            }\n\n            data.token_type = 'bearer';\n            try {\n                data.access_token = await this.authClient.getToken(); // Get the token from the host.\n            } catch (error) {\n                this.get('stashLogger').error(\n                    `Unable to get token from host iframe: ${error && error.message ? error.message : '?'}`\n                );\n                addPageAction('sessionBootstrapFailure', {\n                    failedStep: 'getTokenFailure'\n                });\n                throw error;\n            }\n            await this._establishLocalSession(data.access_token);\n            await _.pick(data, oauthStoreProps);\n        }\n    },\n\n    // Attempt user authentication\n    authenticate(options) {\n        return new RSVP.Promise((resolve, reject) => {\n            if (options && (options.error === 'access_denied' || options.scope)) {\n                // Rejecting if the user didn't grant access\n                // Also rejecting if the user granted limited states (for now)\n\n                // No need to redirect to oauth; action will handle\n                reject({ reason: 'noAccess' });\n            } else if (options && options.access_token) {\n                this._establishLocalSession(options.access_token)\n                    .then(() => {\n                        // Internal OAuth2 Auth Successful\n\n                        if (options.state) {\n                            this.get('purecloudOauth').deserializeRestoreState(options.state);\n                        }\n\n                        /* pick oauth props from the url */\n                        const finalOptions = _.pick(options, oauthStoreParams);\n\n                        /* add expiry time before persisting to storage */\n                        if (finalOptions && finalOptions.expires_in) {\n                            finalOptions.token_expiry_time_millis =\n                                this._getCurrMillis() + finalOptions.expires_in * 1000;\n                            finalOptions.token_expiry_time_iso_string = new Date(\n                                finalOptions.token_expiry_time_millis\n                            ).toISOString();\n                        }\n\n                        resolve(finalOptions);\n                    })\n                    .catch(reason => {\n                        if (reason && reason.type === SESSION_BOOTSTRAP_ERROR_TYPE) {\n                            reject({\n                                reason: reason.type,\n                                failedStep: reason.failedStep,\n                                status: reason.status\n                            });\n                            return;\n                        }\n\n                        reject({ reason: 'localSessionFailure' });\n                    });\n            } else {\n                // Initiate OAuth2 Authentication\n                try {\n                    let authUrl = this._buildAuthUrl(true, options ? options.state : undefined);\n\n                    reject({\n                        authUrl,\n                        reason: 'noToken'\n                    });\n                } catch (err) {\n                    reject({\n                        reason: err && err.message ? err.message : 'invalidAuthEndpoint'\n                    });\n                }\n            }\n        });\n    },\n\n    // Logout\n    invalidate() {\n        // If and when the returned promise is resolved, the token store will be cleaned automatically by ESA\n        return new RSVP.Promise(resolve => {\n            RSVP.allSettled([this._destroyLocalSession(), this._super()]).then(() => {\n                const authorizer = Ember.getOwner(this).lookup('authorizer:directory');\n                if (authorizer) {\n                    authorizer.deauthorizeAllDomainRequests();\n                }\n\n                resolve();\n            });\n        });\n    },\n\n    /**\n     * Extracts the authData from the provided string (or defaults to window.location.hash)\n     *\n     * @returns an object containing the decoded values from the escaped, encoded,\n     * query string style hash params returned by the PC OAuth endpoint.\n     */\n    extractAuthData(hash) {\n        if (typeof hash === 'undefined' && window && window.location) {\n            hash = window.location.hash;\n        }\n\n        if (!hash) {\n            return {};\n        }\n\n        hash = decodeURI(hash.trim());\n        if (hash.indexOf('#') === 0) {\n            hash = hash.slice(1);\n        }\n\n        return hash.split('&').reduce((accumulator, currPair) => {\n            let tokens = currPair.split('=').map(currToken => window.decodeURIComponent(currToken));\n\n            if (tokens[0] && tokens[0].trim().length > 0) {\n                accumulator[tokens[0]] = tokens.length > 1 ? tokens[1] : undefined;\n            }\n\n            return accumulator;\n        }, {});\n    },\n\n    buildAuthorizeUrl(stateParam, org) {\n        return this._buildAuthUrl(true, stateParam, org);\n    },\n\n    buildLogoutUrl() {\n        return this._buildAuthUrl(false);\n    },\n\n    /**\n     * Clean any browser storage (cookies, localStorage, etc) that is not\n     * managed by ESA.\n     */\n    cleanCustomBrowserStorage() {\n        // TECHDEBT: Clear any legacy, pre-oauth, pre-PC cookies\n        this.get('cookies').clear(this.get('application.cookies.session'));\n    },\n\n    _establishLocalSession(accessToken) {\n        if (this.localSessionDeferred) {\n            return this.localSessionDeferred.promise;\n        }\n\n        this.localSessionDeferred = RSVP.defer();\n\n        const authorizer = Ember.getOwner(this).lookup('authorizer:directory');\n        if (authorizer) {\n            authorizer.authorizeAllDomainRequests({ access_token: accessToken });\n        } else {\n            Ember.Logger.error('Failed to locate authorizer in container');\n            this.localSessionDeferred.reject('missingAuthorizer');\n        }\n\n        this.set('session.accessToken', accessToken);\n        this.get('session')\n            .authenticateWithSession()\n            .then(() => {\n                return this.get('session.publicApiUser') ? true : RSVP.reject('unknownSessionId');\n            })\n            .catch(details => {\n                if (this.get('session.user.isSuper') || this.get('session.user.isTrustee')) {\n                    Ember.Logger.warn('Session Bootstrap failed for superuser.  Granting access but please diagnose.');\n                    return true;\n                }\n\n                return RSVP.reject(details);\n            })\n            .then(() => {\n                // Remove them all for good measure\n                this.removeAuthCookie();\n                this.localSessionDeferred.resolve();\n            })\n            .catch(async details => {\n                // Attempt to log the error immediately; unless we know the access token is invalid\n                if (\n                    !details ||\n                    details.type !== SESSION_BOOTSTRAP_ERROR_TYPE ||\n                    (!details.legacyInvalidSessionToken && details.status !== 403)\n                ) {\n                    await this.ensureLogsSent();\n                }\n\n                this.set('session.hasAppAccess', false);\n                this.set('session.accessToken', null);\n                this.cleanCustomBrowserStorage();\n\n                authorizer.deauthorizeAllDomainRequests();\n                this.localSessionDeferred.reject(details);\n            });\n\n        return this.localSessionDeferred.promise;\n    },\n\n    _destroyLocalSession() {\n        return RSVP.resolve()\n            .then(() => {\n                if (!this.get('session.features.disassociate-redux')) {\n                    return this.get('ajax').ajaxGet('/api/v1/logout', { dataType: 'text' });\n                }\n            })\n            .finally(() => {\n                this.set('session.accessToken', null);\n                this.cleanCustomBrowserStorage();\n            });\n    },\n\n    _buildAuthUrl(login, stateParamValue, targetOrg) {\n        const baseAuthUri = this.get('applicationService.authUri');\n        const clientId = this.get('oauthProps.clientId');\n\n        if (!baseAuthUri || baseAuthUri.trim().length === 0) {\n            throw new Error('missingAuthUri');\n        }\n\n        if (!clientId || clientId.trim().length === 0) {\n            throw new Error('unknownClientId');\n        }\n\n        var oauthParams = {\n            response_type: 'token',\n            client_id: clientId,\n            enableRegionSwitching: true\n        };\n\n        // redirect_uri param\n        let redirectUri = window.location.origin;\n        if (!redirectUri) {\n            redirectUri = `${window.location.protocol}//${window.location.host}`;\n        }\n\n        /*\n         * Force pathname to include a trailing slash.  If not, safari will not\n         * recognize the hash params in the redirect.\n         *\n         * Good:                                   Bad:\n         * https://foo.com/#access_token=...       https://foo.com#access_token=...\n         * https://foo.com/bar/#access_token=...   https://foo.com/bar#access_token=...\n         *\n         * http://stackoverflow.com/questions/18663410/safari-ignoring-removing-hashatags-when-clicking-hyperlinks\n         * https://bugs.webkit.org/show_bug.cgi?id=24175\n         */\n        let pathname = window.location.pathname;\n        const lastIndex = pathname.length - 1;\n\n        if (lastIndex >= 0 && pathname.charAt(lastIndex) !== '/') {\n            pathname += '/';\n        }\n        redirectUri += pathname;\n        oauthParams.redirect_uri = redirectUri;\n\n        // state param\n        if (login && stateParamValue) {\n            oauthParams.state = stateParamValue;\n        }\n\n        // target used for proxy login\n        if (targetOrg) {\n            oauthParams.target = targetOrg;\n        }\n\n        // Build Auth URL\n        let authUrl = baseAuthUri;\n        authUrl += login === true ? authLoginPath : authLogoutPath;\n\n        if (authUrl.indexOf('?') === -1) {\n            authUrl += '?';\n        } else {\n            authUrl += '&';\n        }\n\n        authUrl += Ember.$.param(oauthParams, true);\n\n        return authUrl;\n    },\n\n    /**\n     * These cookies are extremely legacy and pre-date even oauth.\n     * Our backend services \"should not\" still be honoring them but we'll continue to force delete them in case a legacy client logs in.\n     * If/When ININ-Auth-Api support is fully removed, we should be safe to finally kill this off\n     */\n    removeAuthCookie() {\n        const cookies = this.get('cookies');\n        // Clean up any previously-set, now invalid cookies\n        cookies.clear(AUTH_COOKIE_NAME);\n        cookies.clear(AUTH_COOKIE_NAME, { path: '/' });\n        cookies.clear(AUTH_COOKIE_NAME, { path: '/realtime' });\n    },\n\n    /*\n     * Attempt to immediately flush all queued logs\n     */\n    async ensureLogsSent() {\n        // Logs need to go out when the session screws up, before anything else\n        // happens, but ignore errors from this itself\n        // As long as its not an invalid sesson...\n        try {\n            await this.get('stashLogger').immediateSaveLogs();\n        } catch (_e) {\n            // We are ignoring this, continue with rejection\n        }\n    },\n\n    // exposed for test mocking\n    _getCurrMillis() {\n        return Date.now();\n    }\n});\n","import Ember from 'ember';\nimport DirectoryAuthenticator from './directory';\n\nconst { RSVP } = Ember;\n\nexport default DirectoryAuthenticator.extend({\n    restore(data) {\n        return RSVP.resolve(data);\n    },\n\n    // Fake out user authentication\n    authenticate(options) {\n        return this._super(options);\n    }\n});\n","import Ember from 'ember';\nimport netUtils from '../utils/net';\nimport config from '../config/environment';\nimport Base from 'ember-simple-auth/authorizers/base';\nimport _ from 'lodash';\nimport { isUnauthorizedError } from 'ember-ajax/errors';\nimport { REQUEST_TELEMETRY_APP_SUBSECTIONS } from 'connections-ui/services/ajax';\n\nconst HASH_LENGTH_LIMIT = 4976;\n\nconst SEMVER_PARSER = /^([^\\+]+)\\+(\\d+)-(.+)-([a-zA-Z0-9]+)$/;\n\nexport default Base.extend({\n    ajax: Ember.inject.service(),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n\n    _authData: null,\n    _ajaxPrefilters: null,\n    _ajaxErrors: null,\n\n    appContextHeaderTokens: Ember.computed(\n        'application.semver',\n        'application.hostedContext.isHostedProp',\n        'application.isPopout',\n        function () {\n            // This is similar to our service name, directory-webui, with the `-`\n            // replaced by `_` since PAPI enums use java identifiers and can't include dashes.\n            const headerTokens = ['connections-ui-webui'];\n\n            // web-dir version\n            const semver = this.get('application.semver');\n            if (typeof semver === 'string') {\n                const semverParseResult = SEMVER_PARSER.exec(semver.trim());\n                if (semverParseResult && semverParseResult.length === 5) {\n                    // Production build semver format\n                    const [, pkgVersion, buildNumber, gitBranch, gitCommit] = semverParseResult;\n                    // Reduce the size of the release details to keep the overall header length down\n                    // packageVersion-gitBranch[0,24)-buildNumber-gitCommit[0,8)\n                    // 25 branch chars accounts for our standard branch prefixes, jira teams/numbers, and a bit of desc\n                    // 8 chars of git sha should be more than sufficient\n                    headerTokens.push(\n                        [pkgVersion, gitBranch.slice(0, 25), buildNumber, gitCommit.slice(0, 8)]\n                            .map(curr => curr.trim().replaceAll('-', '_'))\n                            .filter(curr => curr)\n                            .join('-')\n                    );\n                } else {\n                    // Dev/Unparsable semver - just use it as is and truncated to 25 chars\n                    headerTokens.push(semver.trim().slice(0, 25));\n                }\n            }\n\n            // Desktop vs Browser\n            const isHosted = this.get('application.hostedContext.isHostedProp');\n            headerTokens.push(isHosted ? 'desktop' : 'browser');\n\n            // Popout (PEF, chat, etc)\n            // Popout is not a 1:1 mapping to PEF, but, it is one of the cases that manifests as isPopout\n            if (this.get('application.isPopout')) {\n                headerTokens.push('popout');\n            }\n\n            return headerTokens;\n        }\n    ),\n\n    init() {\n        this._super(...arguments);\n        this._ajaxPrefilters = $.Callbacks();\n        Ember.$.ajaxPrefilter('+*', this._ajaxPrefilters.fire);\n        this._ajaxErrors = $.Callbacks();\n        Ember.$(document).ajaxError(this._ajaxErrors.fire);\n    },\n\n    authorize: function (authData, fnToAuthorize) {\n        if (authData && authData.access_token) {\n            fnToAuthorize(this._buildHeaders(authData));\n        }\n    },\n\n    authorizeAllDomainRequests: function (authData) {\n        this.set('_authData', authData);\n\n        this._ajaxPrefilters.add(this._addHeadersPrefilter.bind(this));\n        this._ajaxErrors.add(Ember.run.bind(this, '_handleUnauthorizedRequests'));\n    },\n\n    deauthorizeAllDomainRequests: function () {\n        this.set('_authData', null);\n\n        this._ajaxPrefilters.empty();\n        this._ajaxErrors.empty();\n    },\n\n    _addHeadersPrefilter(options, original, jqXHR) {\n        if (!options.crossDomain || this._isWhitelistedUrl(options.url) || this._isAbsPathOfProxiedEnv(options.url)) {\n            const excludeAuthHeaderForFax = this.isFaxUpload(options.url);\n            const headers = this._buildHeaders(this.get('_authData'));\n\n            if (excludeAuthHeaderForFax && headers.Authorization) {\n                // fax upload using Darth service has its own authentication headers\n                delete headers.Authorization;\n            }\n\n            _.forEach(headers, (headerValue, headerName) => {\n                jqXHR.setRequestHeader(headerName, headerValue);\n            });\n        }\n\n        if (this._isGcPublicApiUrl(options.url)) {\n            const headerTokens = [...this.get('appContextHeaderTokens')];\n\n            // App Subsection\n            // Read the `original` options param which are the unmodified options from the caller\n            if (\n                original &&\n                typeof original === 'object' &&\n                Object.prototype.hasOwnProperty.call(original, REQUEST_TELEMETRY_APP_SUBSECTIONS)\n            ) {\n                const subsection = original[REQUEST_TELEMETRY_APP_SUBSECTIONS];\n                // Delete this prop so it doesn't get sent with the request\n                delete original[REQUEST_TELEMETRY_APP_SUBSECTIONS];\n\n                let subsectionTokens = Array.isArray(subsection)\n                    ? subsection\n                    : typeof subsection === 'string'\n                    ? [subsection]\n                    : null;\n\n                if (!subsectionTokens || subsectionTokens.some(curr => typeof curr !== 'string')) {\n                    // log and ignore when encountering any invalid subsection types\n                    this.get('logger').error('Received invalid subsection for Genesys-App header', {\n                        remoteData: {\n                            type: typeof subsection,\n                            subsection\n                        }\n                    });\n                } else {\n                    // This check is strictly for dev logging\n                    // We drop slashes when building the final header value\n                    if (subsectionTokens.some(currToken => currToken.includes('/'))) {\n                        this.get('logger').warn('Dropping invalid \"/\" char found in Genesys-App header subsection', {\n                            remoteData: {\n                                type: typeof subsection,\n                                subsection\n                            }\n                        });\n                    }\n                    headerTokens.push(...subsectionTokens);\n                }\n            }\n\n            // Escape `/` with `_` as slashes are our token separators\n            jqXHR.setRequestHeader('Genesys-App', headerTokens.map(curr => curr.trim().replaceAll('/', '_')).join('/'));\n        }\n    },\n\n    _isWhitelistedUrl(url) {\n        return !!url && url.indexOf(this.get('application.purecloudV2BaseUri')) === 0;\n    },\n\n    _isGcPublicApiUrl(url) {\n        if (!url) {\n            return false;\n        }\n\n        const pubApiBase = this.get('application.purecloudV2BaseUri');\n        const pubApiProxyBase = this.get('application.purecloudBaseUri');\n        return [pubApiBase, pubApiProxyBase].some(currBase => {\n            return currBase && typeof currBase === 'string' && url.indexOf(currBase) === 0;\n        });\n    },\n\n    isFaxUpload(url) {\n        return !!url && url.indexOf('fax-uploads') > -1;\n    },\n\n    /**\n     * Returns true if:\n     * The current environment is development\n     * The current environment is proxied to a PC deployed env\n     * The provided url is on or a sub-domain of the PC TLD.\n     *\n     * Currently, this utility doesn't require that the provided url be remote.\n     * This allows you to be serving locally off of `localhost.mypurcloud.com:4300`\n     * and append the auth token to a `localhost:4300/sca` url.\n     */\n    _isAbsPathOfProxiedEnv(url) {\n        if (!url) {\n            return false;\n        }\n\n        let result = false;\n\n        let envDetails = this.get('application.envDetails');\n        if (config.environment === 'development' && envDetails && envDetails.local) {\n            // Currently proxying.  Test if url is our tgt env\n            try {\n                let tgtEnvDetails = netUtils.getEnvDetails(url);\n\n                result = envDetails.env === tgtEnvDetails.env;\n            } catch (unknownEnv) {\n                result = false;\n            }\n        }\n\n        return result;\n    },\n\n    _handleUnauthorizedRequests(event, jqXHR, settings, thrownError) {\n        /*\n         * isAuthenticated/logoutInProgress checks avoid handling expected 401s and logging false positives in sumo.\n         *\n         * Ex:\n         *   Attempting restore with an expired token\n         *   Ajax request failing after logout requested\n         */\n        if (\n            jqXHR.status === 401 &&\n            !jqXHR.skipPurecloudUnauthorizedCheck &&\n            !!this.get('session.isAuthenticated') &&\n            !this.get('session.logoutInProgress') &&\n            (settings.crossDomain === false ||\n                this._isWhitelistedUrl(settings.url) ||\n                this._isAbsPathOfProxiedEnv(settings.url))\n        ) {\n            /*\n             * Attempt to log this 401 immediately.  If it succeeds, we have a service that is throwing a\n             * 401 that is out of sync with public-api wrt authentication.  The log will make it to\n             * sumo and will not be a false positive.  If it fails due to rate limiting, we're reloading\n             * unconditionally at the moment, so no need to buffer it.\n             */\n            this._sendXhrErrorDetails(settings, thrownError, jqXHR).finally(() => {\n                // Request a new token (remember me) or logout\n                this.get('session').invalidate({\n                    unauthorized: true\n                });\n            });\n        }\n    },\n\n    _buildHeaders(authData) {\n        /* eslint-disable dot-notation */\n        let hash = window.location.hash;\n\n        hash = hash.length > HASH_LENGTH_LIMIT ? hash.slice(0, HASH_LENGTH_LIMIT) : hash;\n\n        const headers = {\n            'ININ-Client-Path': hash\n        };\n\n        if (authData && authData.access_token) {\n            headers['Authorization'] = `bearer ${authData.access_token}`;\n        }\n\n        /* eslint-enable dot-notation */\n        return headers;\n    },\n\n    _handleClientUnauthorizedError(clientId) {\n        let msg = `${clientId} reported invalid 401 event. Not logout will be triggered.`;\n        return this._sendErrorMessage({ message: msg }).catch(error => {\n            // Checking if the session is actually invalid.\n            if (isUnauthorizedError(error)) {\n                this.get('session').invalidate({\n                    unauthorized: true\n                });\n            }\n        });\n    },\n\n    _sendXhrErrorDetails(settings, thrownError = '', xhr = {}) {\n        const message =\n            '401 encountered while trying to access URL. Automatically requesting new token for user. Check local machine logs.';\n\n        // eslint-disable-next-line no-console\n        console.error(message, {\n            settings,\n            thrownError\n        });\n\n        // Don't log to sumo in dev mode\n        if (this.get('application.runtime.local')) {\n            return Ember.RSVP.resolve();\n        }\n\n        const correlationId = xhr.getResponseHeader('inin-correlation-id');\n\n        const data = JSON.stringify({\n            message,\n            correlationId\n        });\n\n        return this._sendErrorMessage(data);\n    },\n\n    _sendErrorMessage(messageData) {\n        const url = this.get('application').pcV2Uri('api/v2/diagnostics/trace');\n        return this.get('ajax').post(url, {\n            beforeSend: jqXHR => {\n                // Add a flag to this request to bypass infinite 401 checking\n                jqXHR.skipPurecloudUnauthorizedCheck = true;\n            },\n            dataType: 'text',\n            data: JSON.stringify({\n                app: {\n                    appId: 'connections-ui-webui',\n                    appVersion: this.get('version')\n                },\n                traces: [\n                    {\n                        level: 'ERROR',\n                        time: new Date().toString(),\n                        message: messageData,\n                        topic: 'connections-ui.service:session'\n                    }\n                ]\n            })\n        });\n    }\n});\n","/*jslint eqeq: true*/\nexport default [{\"locale\":\"ar\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),t0=Number(s[0])==n,n100=t0&&s[0].slice(-2);if(ord)return\"other\";return n==0?\"zero\":n==1?\"one\":n==2?\"two\":n100>=3&&n100<=10?\"few\":n100>=11&&n100<=99?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"السنة\",\"relative\":{\"0\":\"السنة الحالية\",\"1\":\"السنة التالية\",\"-1\":\"السنة الماضية\"},\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} سنة\",\"one\":\"خلال سنة واحدة\",\"two\":\"خلال سنتين\",\"few\":\"خلال {0} سنوات\",\"many\":\"خلال {0} سنة\",\"other\":\"خلال {0} سنة\"},\"past\":{\"zero\":\"قبل {0} سنة\",\"one\":\"قبل سنة واحدة\",\"two\":\"قبل سنتين\",\"few\":\"قبل {0} سنوات\",\"many\":\"قبل {0} سنة\",\"other\":\"قبل {0} سنة\"}}},\"month\":{\"displayName\":\"الشهر\",\"relative\":{\"0\":\"هذا الشهر\",\"1\":\"الشهر التالي\",\"-1\":\"الشهر الماضي\"},\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} شهر\",\"one\":\"خلال شهر واحد\",\"two\":\"خلال شهرين\",\"few\":\"خلال {0} أشهر\",\"many\":\"خلال {0} شهرًا\",\"other\":\"خلال {0} شهر\"},\"past\":{\"zero\":\"قبل {0} شهر\",\"one\":\"قبل شهر واحد\",\"two\":\"قبل شهرين\",\"few\":\"قبل {0} أشهر\",\"many\":\"قبل {0} شهرًا\",\"other\":\"قبل {0} شهر\"}}},\"day\":{\"displayName\":\"يوم\",\"relative\":{\"0\":\"اليوم\",\"1\":\"غدًا\",\"2\":\"بعد الغد\",\"-2\":\"أول أمس\",\"-1\":\"أمس\"},\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} يوم\",\"one\":\"خلال يوم واحد\",\"two\":\"خلال يومين\",\"few\":\"خلال {0} أيام\",\"many\":\"خلال {0} يومًا\",\"other\":\"خلال {0} يوم\"},\"past\":{\"zero\":\"قبل {0} يوم\",\"one\":\"قبل يوم واحد\",\"two\":\"قبل يومين\",\"few\":\"قبل {0} أيام\",\"many\":\"قبل {0} يومًا\",\"other\":\"قبل {0} يوم\"}}},\"hour\":{\"displayName\":\"الساعات\",\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} ساعة\",\"one\":\"خلال ساعة واحدة\",\"two\":\"خلال ساعتين\",\"few\":\"خلال {0} ساعات\",\"many\":\"خلال {0} ساعة\",\"other\":\"خلال {0} ساعة\"},\"past\":{\"zero\":\"قبل {0} ساعة\",\"one\":\"قبل ساعة واحدة\",\"two\":\"قبل ساعتين\",\"few\":\"قبل {0} ساعات\",\"many\":\"قبل {0} ساعة\",\"other\":\"قبل {0} ساعة\"}}},\"minute\":{\"displayName\":\"الدقائق\",\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} دقيقة\",\"one\":\"خلال دقيقة واحدة\",\"two\":\"خلال دقيقتين\",\"few\":\"خلال {0} دقائق\",\"many\":\"خلال {0} دقيقة\",\"other\":\"خلال {0} دقيقة\"},\"past\":{\"zero\":\"قبل {0} دقيقة\",\"one\":\"قبل دقيقة واحدة\",\"two\":\"قبل دقيقتين\",\"few\":\"قبل {0} دقائق\",\"many\":\"قبل {0} دقيقة\",\"other\":\"قبل {0} دقيقة\"}}},\"second\":{\"displayName\":\"الثواني\",\"relative\":{\"0\":\"الآن\"},\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} ثانية\",\"one\":\"خلال ثانية واحدة\",\"two\":\"خلال ثانيتين\",\"few\":\"خلال {0} ثوانِ\",\"many\":\"خلال {0} ثانية\",\"other\":\"خلال {0} ثانية\"},\"past\":{\"zero\":\"قبل {0} ثانية\",\"one\":\"قبل ثانية واحدة\",\"two\":\"قبل ثانيتين\",\"few\":\"قبل {0} ثوانِ\",\"many\":\"قبل {0} ثانية\",\"other\":\"قبل {0} ثانية\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"cs\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],v0=!s[1];if(ord)return\"other\";return n==1&&v0?\"one\":i>=2&&i<=4&&v0?\"few\":!v0?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"rok\",\"relative\":{\"0\":\"tento rok\",\"1\":\"příští rok\",\"-1\":\"minulý rok\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} rok\",\"few\":\"za {0} roky\",\"many\":\"za {0} roku\",\"other\":\"za {0} let\"},\"past\":{\"one\":\"před {0} rokem\",\"few\":\"před {0} lety\",\"many\":\"před {0} rokem\",\"other\":\"před {0} lety\"}}},\"month\":{\"displayName\":\"měsíc\",\"relative\":{\"0\":\"tento měsíc\",\"1\":\"příští měsíc\",\"-1\":\"minulý měsíc\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} měsíc\",\"few\":\"za {0} měsíce\",\"many\":\"za {0} měsíce\",\"other\":\"za {0} měsíců\"},\"past\":{\"one\":\"před {0} měsícem\",\"few\":\"před {0} měsíci\",\"many\":\"před {0} měsícem\",\"other\":\"před {0} měsíci\"}}},\"day\":{\"displayName\":\"den\",\"relative\":{\"0\":\"dnes\",\"1\":\"zítra\",\"2\":\"pozítří\",\"-2\":\"předevčírem\",\"-1\":\"včera\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} den\",\"few\":\"za {0} dny\",\"many\":\"za {0} dne\",\"other\":\"za {0} dní\"},\"past\":{\"one\":\"před {0} dnem\",\"few\":\"před {0} dny\",\"many\":\"před {0} dnem\",\"other\":\"před {0} dny\"}}},\"hour\":{\"displayName\":\"hodina\",\"relativeTime\":{\"future\":{\"one\":\"za {0} hodinu\",\"few\":\"za {0} hodiny\",\"many\":\"za {0} hodiny\",\"other\":\"za {0} hodin\"},\"past\":{\"one\":\"před {0} hodinou\",\"few\":\"před {0} hodinami\",\"many\":\"před {0} hodinou\",\"other\":\"před {0} hodinami\"}}},\"minute\":{\"displayName\":\"minuta\",\"relativeTime\":{\"future\":{\"one\":\"za {0} minutu\",\"few\":\"za {0} minuty\",\"many\":\"za {0} minuty\",\"other\":\"za {0} minut\"},\"past\":{\"one\":\"před {0} minutou\",\"few\":\"před {0} minutami\",\"many\":\"před {0} minutou\",\"other\":\"před {0} minutami\"}}},\"second\":{\"displayName\":\"sekunda\",\"relative\":{\"0\":\"nyní\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} sekundu\",\"few\":\"za {0} sekundy\",\"many\":\"za {0} sekundy\",\"other\":\"za {0} sekund\"},\"past\":{\"one\":\"před {0} sekundou\",\"few\":\"před {0} sekundami\",\"many\":\"před {0} sekundou\",\"other\":\"před {0} sekundami\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"da\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],t0=Number(s[0])==n;if(ord)return\"other\";return n==1||!t0&&(i==0||i==1)?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"år\",\"relative\":{\"0\":\"i år\",\"1\":\"næste år\",\"-1\":\"sidste år\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} år\",\"other\":\"om {0} år\"},\"past\":{\"one\":\"for {0} år siden\",\"other\":\"for {0} år siden\"}}},\"month\":{\"displayName\":\"måned\",\"relative\":{\"0\":\"denne måned\",\"1\":\"næste måned\",\"-1\":\"sidste måned\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} måned\",\"other\":\"om {0} måneder\"},\"past\":{\"one\":\"for {0} måned siden\",\"other\":\"for {0} måneder siden\"}}},\"day\":{\"displayName\":\"dag\",\"relative\":{\"0\":\"i dag\",\"1\":\"i morgen\",\"2\":\"i overmorgen\",\"-2\":\"i forgårs\",\"-1\":\"i går\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} dag\",\"other\":\"om {0} dage\"},\"past\":{\"one\":\"for {0} dag siden\",\"other\":\"for {0} dage siden\"}}},\"hour\":{\"displayName\":\"time\",\"relativeTime\":{\"future\":{\"one\":\"om {0} time\",\"other\":\"om {0} timer\"},\"past\":{\"one\":\"for {0} time siden\",\"other\":\"for {0} timer siden\"}}},\"minute\":{\"displayName\":\"minut\",\"relativeTime\":{\"future\":{\"one\":\"om {0} minut\",\"other\":\"om {0} minutter\"},\"past\":{\"one\":\"for {0} minut siden\",\"other\":\"for {0} minutter siden\"}}},\"second\":{\"displayName\":\"sekund\",\"relative\":{\"0\":\"nu\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} sekund\",\"other\":\"om {0} sekunder\"},\"past\":{\"one\":\"for {0} sekund siden\",\"other\":\"for {0} sekunder siden\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"de\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1];if(ord)return\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"Jahr\",\"relative\":{\"0\":\"dieses Jahr\",\"1\":\"nächstes Jahr\",\"-1\":\"letztes Jahr\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} Jahr\",\"other\":\"in {0} Jahren\"},\"past\":{\"one\":\"vor {0} Jahr\",\"other\":\"vor {0} Jahren\"}}},\"month\":{\"displayName\":\"Monat\",\"relative\":{\"0\":\"diesen Monat\",\"1\":\"nächsten Monat\",\"-1\":\"letzten Monat\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} Monat\",\"other\":\"in {0} Monaten\"},\"past\":{\"one\":\"vor {0} Monat\",\"other\":\"vor {0} Monaten\"}}},\"day\":{\"displayName\":\"Tag\",\"relative\":{\"0\":\"heute\",\"1\":\"morgen\",\"2\":\"übermorgen\",\"-2\":\"vorgestern\",\"-1\":\"gestern\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} Tag\",\"other\":\"in {0} Tagen\"},\"past\":{\"one\":\"vor {0} Tag\",\"other\":\"vor {0} Tagen\"}}},\"hour\":{\"displayName\":\"Stunde\",\"relativeTime\":{\"future\":{\"one\":\"in {0} Stunde\",\"other\":\"in {0} Stunden\"},\"past\":{\"one\":\"vor {0} Stunde\",\"other\":\"vor {0} Stunden\"}}},\"minute\":{\"displayName\":\"Minute\",\"relativeTime\":{\"future\":{\"one\":\"in {0} Minute\",\"other\":\"in {0} Minuten\"},\"past\":{\"one\":\"vor {0} Minute\",\"other\":\"vor {0} Minuten\"}}},\"second\":{\"displayName\":\"Sekunde\",\"relative\":{\"0\":\"jetzt\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} Sekunde\",\"other\":\"in {0} Sekunden\"},\"past\":{\"one\":\"vor {0} Sekunde\",\"other\":\"vor {0} Sekunden\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"en-US\",\"parentLocale\":\"en\"},{\"locale\":\"en\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1),n100=t0&&s[0].slice(-2);if(ord)return n10==1&&n100!=11?\"one\":n10==2&&n100!=12?\"two\":n10==3&&n100!=13?\"few\":\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"year\",\"relative\":{\"0\":\"this year\",\"1\":\"next year\",\"-1\":\"last year\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} year\",\"other\":\"in {0} years\"},\"past\":{\"one\":\"{0} year ago\",\"other\":\"{0} years ago\"}}},\"month\":{\"displayName\":\"month\",\"relative\":{\"0\":\"this month\",\"1\":\"next month\",\"-1\":\"last month\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} month\",\"other\":\"in {0} months\"},\"past\":{\"one\":\"{0} month ago\",\"other\":\"{0} months ago\"}}},\"day\":{\"displayName\":\"day\",\"relative\":{\"0\":\"today\",\"1\":\"tomorrow\",\"-1\":\"yesterday\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} day\",\"other\":\"in {0} days\"},\"past\":{\"one\":\"{0} day ago\",\"other\":\"{0} days ago\"}}},\"hour\":{\"displayName\":\"hour\",\"relativeTime\":{\"future\":{\"one\":\"in {0} hour\",\"other\":\"in {0} hours\"},\"past\":{\"one\":\"{0} hour ago\",\"other\":\"{0} hours ago\"}}},\"minute\":{\"displayName\":\"minute\",\"relativeTime\":{\"future\":{\"one\":\"in {0} minute\",\"other\":\"in {0} minutes\"},\"past\":{\"one\":\"{0} minute ago\",\"other\":\"{0} minutes ago\"}}},\"second\":{\"displayName\":\"second\",\"relative\":{\"0\":\"now\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} second\",\"other\":\"in {0} seconds\"},\"past\":{\"one\":\"{0} second ago\",\"other\":\"{0} seconds ago\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"es\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return n==1?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"año\",\"relative\":{\"0\":\"este año\",\"1\":\"el próximo año\",\"-1\":\"el año pasado\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} año\",\"other\":\"dentro de {0} años\"},\"past\":{\"one\":\"hace {0} año\",\"other\":\"hace {0} años\"}}},\"month\":{\"displayName\":\"mes\",\"relative\":{\"0\":\"este mes\",\"1\":\"el próximo mes\",\"-1\":\"el mes pasado\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} mes\",\"other\":\"dentro de {0} meses\"},\"past\":{\"one\":\"hace {0} mes\",\"other\":\"hace {0} meses\"}}},\"day\":{\"displayName\":\"día\",\"relative\":{\"0\":\"hoy\",\"1\":\"mañana\",\"2\":\"pasado mañana\",\"-2\":\"anteayer\",\"-1\":\"ayer\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} día\",\"other\":\"dentro de {0} días\"},\"past\":{\"one\":\"hace {0} día\",\"other\":\"hace {0} días\"}}},\"hour\":{\"displayName\":\"hora\",\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} hora\",\"other\":\"dentro de {0} horas\"},\"past\":{\"one\":\"hace {0} hora\",\"other\":\"hace {0} horas\"}}},\"minute\":{\"displayName\":\"minuto\",\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} minuto\",\"other\":\"dentro de {0} minutos\"},\"past\":{\"one\":\"hace {0} minuto\",\"other\":\"hace {0} minutos\"}}},\"second\":{\"displayName\":\"segundo\",\"relative\":{\"0\":\"ahora\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} segundo\",\"other\":\"dentro de {0} segundos\"},\"past\":{\"one\":\"hace {0} segundo\",\"other\":\"hace {0} segundos\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"fi\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1];if(ord)return\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"vuosi\",\"relative\":{\"0\":\"tänä vuonna\",\"1\":\"ensi vuonna\",\"-1\":\"viime vuonna\"},\"relativeTime\":{\"future\":{\"one\":\"{0} vuoden päästä\",\"other\":\"{0} vuoden päästä\"},\"past\":{\"one\":\"{0} vuosi sitten\",\"other\":\"{0} vuotta sitten\"}}},\"month\":{\"displayName\":\"kuukausi\",\"relative\":{\"0\":\"tässä kuussa\",\"1\":\"ensi kuussa\",\"-1\":\"viime kuussa\"},\"relativeTime\":{\"future\":{\"one\":\"{0} kuukauden päästä\",\"other\":\"{0} kuukauden päästä\"},\"past\":{\"one\":\"{0} kuukausi sitten\",\"other\":\"{0} kuukautta sitten\"}}},\"day\":{\"displayName\":\"päivä\",\"relative\":{\"0\":\"tänään\",\"1\":\"huomenna\",\"2\":\"ylihuomenna\",\"-2\":\"toissa päivänä\",\"-1\":\"eilen\"},\"relativeTime\":{\"future\":{\"one\":\"{0} päivän päästä\",\"other\":\"{0} päivän päästä\"},\"past\":{\"one\":\"{0} päivä sitten\",\"other\":\"{0} päivää sitten\"}}},\"hour\":{\"displayName\":\"tunti\",\"relativeTime\":{\"future\":{\"one\":\"{0} tunnin päästä\",\"other\":\"{0} tunnin päästä\"},\"past\":{\"one\":\"{0} tunti sitten\",\"other\":\"{0} tuntia sitten\"}}},\"minute\":{\"displayName\":\"minuutti\",\"relativeTime\":{\"future\":{\"one\":\"{0} minuutin päästä\",\"other\":\"{0} minuutin päästä\"},\"past\":{\"one\":\"{0} minuutti sitten\",\"other\":\"{0} minuuttia sitten\"}}},\"second\":{\"displayName\":\"sekunti\",\"relative\":{\"0\":\"nyt\"},\"relativeTime\":{\"future\":{\"one\":\"{0} sekunnin päästä\",\"other\":\"{0} sekunnin päästä\"},\"past\":{\"one\":\"{0} sekunti sitten\",\"other\":\"{0} sekuntia sitten\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"fr-CA\",\"parentLocale\":\"fr\",\"fields\":{\"year\":{\"displayName\":\"année\",\"relative\":{\"0\":\"cette année\",\"1\":\"l’année prochaine\",\"-1\":\"l’année dernière\"},\"relativeTime\":{\"future\":{\"one\":\"Dans {0} an\",\"other\":\"Dans {0} ans\"},\"past\":{\"one\":\"Il y a {0} an\",\"other\":\"Il y a {0} ans\"}}},\"month\":{\"displayName\":\"mois\",\"relative\":{\"0\":\"ce mois-ci\",\"1\":\"le mois prochain\",\"-1\":\"le mois dernier\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} mois\",\"other\":\"dans {0} mois\"},\"past\":{\"one\":\"il y a {0} mois\",\"other\":\"il y a {0} mois\"}}},\"day\":{\"displayName\":\"jour\",\"relative\":{\"0\":\"aujourd’hui\",\"1\":\"demain\",\"2\":\"après-demain\",\"-2\":\"avant-hier\",\"-1\":\"hier\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} jour\",\"other\":\"dans {0} jours\"},\"past\":{\"one\":\"il y a {0} jour\",\"other\":\"il y a {0} jours\"}}},\"hour\":{\"displayName\":\"heure\",\"relativeTime\":{\"future\":{\"one\":\"dans {0} heure\",\"other\":\"dans {0} heures\"},\"past\":{\"one\":\"il y a {0} heure\",\"other\":\"il y a {0} heures\"}}},\"minute\":{\"displayName\":\"minute\",\"relativeTime\":{\"future\":{\"one\":\"Dans {0} minute\",\"other\":\"Dans {0} minutes\"},\"past\":{\"one\":\"Il y a {0} minute\",\"other\":\"Il y a {0} minutes\"}}},\"second\":{\"displayName\":\"seconde\",\"relative\":{\"0\":\"maintenant\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} seconde\",\"other\":\"dans {0} secondes\"},\"past\":{\"one\":\"il y a {0} seconde\",\"other\":\"il y a {0} secondes\"}}}}},{\"locale\":\"fr\",\"pluralRuleFunction\":function(n,ord){if(ord)return n==1?\"one\":\"other\";return n>=0&&n<2?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"année\",\"relative\":{\"0\":\"cette année\",\"1\":\"l’année prochaine\",\"-1\":\"l’année dernière\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} an\",\"other\":\"dans {0} ans\"},\"past\":{\"one\":\"il y a {0} an\",\"other\":\"il y a {0} ans\"}}},\"month\":{\"displayName\":\"mois\",\"relative\":{\"0\":\"ce mois-ci\",\"1\":\"le mois prochain\",\"-1\":\"le mois dernier\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} mois\",\"other\":\"dans {0} mois\"},\"past\":{\"one\":\"il y a {0} mois\",\"other\":\"il y a {0} mois\"}}},\"day\":{\"displayName\":\"jour\",\"relative\":{\"0\":\"aujourd’hui\",\"1\":\"demain\",\"2\":\"après-demain\",\"-2\":\"avant-hier\",\"-1\":\"hier\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} jour\",\"other\":\"dans {0} jours\"},\"past\":{\"one\":\"il y a {0} jour\",\"other\":\"il y a {0} jours\"}}},\"hour\":{\"displayName\":\"heure\",\"relativeTime\":{\"future\":{\"one\":\"dans {0} heure\",\"other\":\"dans {0} heures\"},\"past\":{\"one\":\"il y a {0} heure\",\"other\":\"il y a {0} heures\"}}},\"minute\":{\"displayName\":\"minute\",\"relativeTime\":{\"future\":{\"one\":\"dans {0} minute\",\"other\":\"dans {0} minutes\"},\"past\":{\"one\":\"il y a {0} minute\",\"other\":\"il y a {0} minutes\"}}},\"second\":{\"displayName\":\"seconde\",\"relative\":{\"0\":\"maintenant\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} seconde\",\"other\":\"dans {0} secondes\"},\"past\":{\"one\":\"il y a {0} seconde\",\"other\":\"il y a {0} secondes\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"he\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1);if(ord)return\"other\";return n==1&&v0?\"one\":i==2&&v0?\"two\":v0&&(n<0||n>10)&&t0&&n10==0?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"שנה\",\"relative\":{\"0\":\"השנה\",\"1\":\"השנה הבאה\",\"-1\":\"השנה שעברה\"},\"relativeTime\":{\"future\":{\"one\":\"בעוד שנה\",\"two\":\"בעוד שנתיים\",\"many\":\"בעוד {0} שנה\",\"other\":\"בעוד {0} שנים\"},\"past\":{\"one\":\"לפני שנה\",\"two\":\"לפני שנתיים\",\"many\":\"לפני {0} שנה\",\"other\":\"לפני {0} שנים\"}}},\"month\":{\"displayName\":\"חודש\",\"relative\":{\"0\":\"החודש\",\"1\":\"החודש הבא\",\"-1\":\"החודש שעבר\"},\"relativeTime\":{\"future\":{\"one\":\"בעוד חודש\",\"two\":\"בעוד חודשיים\",\"many\":\"בעוד {0} חודשים\",\"other\":\"בעוד {0} חודשים\"},\"past\":{\"one\":\"לפני חודש\",\"two\":\"לפני חודשיים\",\"many\":\"לפני {0} חודשים\",\"other\":\"לפני {0} חודשים\"}}},\"day\":{\"displayName\":\"יום\",\"relative\":{\"0\":\"היום\",\"1\":\"מחר\",\"2\":\"מחרתיים\",\"-2\":\"שלשום\",\"-1\":\"אתמול\"},\"relativeTime\":{\"future\":{\"one\":\"בעוד יום {0}\",\"two\":\"בעוד יומיים\",\"many\":\"בעוד {0} ימים\",\"other\":\"בעוד {0} ימים\"},\"past\":{\"one\":\"לפני יום {0}\",\"two\":\"לפני יומיים\",\"many\":\"לפני {0} ימים\",\"other\":\"לפני {0} ימים\"}}},\"hour\":{\"displayName\":\"שעה\",\"relativeTime\":{\"future\":{\"one\":\"בעוד שעה\",\"two\":\"בעוד שעתיים\",\"many\":\"בעוד {0} שעות\",\"other\":\"בעוד {0} שעות\"},\"past\":{\"one\":\"לפני שעה\",\"two\":\"לפני שעתיים\",\"many\":\"לפני {0} שעות\",\"other\":\"לפני {0} שעות\"}}},\"minute\":{\"displayName\":\"דקה\",\"relativeTime\":{\"future\":{\"one\":\"בעוד דקה\",\"two\":\"בעוד שתי דקות\",\"many\":\"בעוד {0} דקות\",\"other\":\"בעוד {0} דקות\"},\"past\":{\"one\":\"לפני דקה\",\"two\":\"לפני שתי דקות\",\"many\":\"לפני {0} דקות\",\"other\":\"לפני {0} דקות\"}}},\"second\":{\"displayName\":\"שנייה\",\"relative\":{\"0\":\"עכשיו\"},\"relativeTime\":{\"future\":{\"one\":\"בעוד שנייה\",\"two\":\"בעוד שתי שניות\",\"many\":\"בעוד {0} שניות\",\"other\":\"בעוד {0} שניות\"},\"past\":{\"one\":\"לפני שנייה\",\"two\":\"לפני שתי שניות\",\"many\":\"לפני {0} שניות\",\"other\":\"לפני {0} שניות\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"hi\",\"pluralRuleFunction\":function(n,ord){if(ord)return n==1?\"one\":n==2||n==3?\"two\":n==4?\"few\":n==6?\"many\":\"other\";return n>=0&&n<=1?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"वर्ष\",\"relative\":{\"0\":\"इस वर्ष\",\"1\":\"अगला वर्ष\",\"-1\":\"पिछला वर्ष\"},\"relativeTime\":{\"future\":{\"one\":\"{0} वर्ष में\",\"other\":\"{0} वर्ष में\"},\"past\":{\"one\":\"{0} वर्ष पहले\",\"other\":\"{0} वर्ष पहले\"}}},\"month\":{\"displayName\":\"माह\",\"relative\":{\"0\":\"इस माह\",\"1\":\"अगला माह\",\"-1\":\"पिछला माह\"},\"relativeTime\":{\"future\":{\"one\":\"{0} माह में\",\"other\":\"{0} माह में\"},\"past\":{\"one\":\"{0} माह पहले\",\"other\":\"{0} माह पहले\"}}},\"day\":{\"displayName\":\"दिन\",\"relative\":{\"0\":\"आज\",\"1\":\"कल\",\"2\":\"परसों\",\"-2\":\"बीता परसों\",\"-1\":\"कल\"},\"relativeTime\":{\"future\":{\"one\":\"{0} दिन में\",\"other\":\"{0} दिन में\"},\"past\":{\"one\":\"{0} दिन पहले\",\"other\":\"{0} दिन पहले\"}}},\"hour\":{\"displayName\":\"घंटा\",\"relativeTime\":{\"future\":{\"one\":\"{0} घंटे में\",\"other\":\"{0} घंटे में\"},\"past\":{\"one\":\"{0} घंटे पहले\",\"other\":\"{0} घंटे पहले\"}}},\"minute\":{\"displayName\":\"मिनट\",\"relativeTime\":{\"future\":{\"one\":\"{0} मिनट में\",\"other\":\"{0} मिनट में\"},\"past\":{\"one\":\"{0} मिनट पहले\",\"other\":\"{0} मिनट पहले\"}}},\"second\":{\"displayName\":\"सेकंड\",\"relative\":{\"0\":\"अब\"},\"relativeTime\":{\"future\":{\"one\":\"{0} सेकंड में\",\"other\":\"{0} सेकंड में\"},\"past\":{\"one\":\"{0} सेकंड पहले\",\"other\":\"{0} सेकंड पहले\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"it\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1];if(ord)return n==11||n==8||n==80||n==800?\"many\":\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"anno\",\"relative\":{\"0\":\"quest’anno\",\"1\":\"anno prossimo\",\"-1\":\"anno scorso\"},\"relativeTime\":{\"future\":{\"one\":\"tra {0} anno\",\"other\":\"tra {0} anni\"},\"past\":{\"one\":\"{0} anno fa\",\"other\":\"{0} anni fa\"}}},\"month\":{\"displayName\":\"mese\",\"relative\":{\"0\":\"questo mese\",\"1\":\"mese prossimo\",\"-1\":\"mese scorso\"},\"relativeTime\":{\"future\":{\"one\":\"tra {0} mese\",\"other\":\"tra {0} mesi\"},\"past\":{\"one\":\"{0} mese fa\",\"other\":\"{0} mesi fa\"}}},\"day\":{\"displayName\":\"giorno\",\"relative\":{\"0\":\"oggi\",\"1\":\"domani\",\"2\":\"dopodomani\",\"-2\":\"l’altro ieri\",\"-1\":\"ieri\"},\"relativeTime\":{\"future\":{\"one\":\"tra {0} giorno\",\"other\":\"tra {0} giorni\"},\"past\":{\"one\":\"{0} giorno fa\",\"other\":\"{0} giorni fa\"}}},\"hour\":{\"displayName\":\"ora\",\"relativeTime\":{\"future\":{\"one\":\"tra {0} ora\",\"other\":\"tra {0} ore\"},\"past\":{\"one\":\"{0} ora fa\",\"other\":\"{0} ore fa\"}}},\"minute\":{\"displayName\":\"minuto\",\"relativeTime\":{\"future\":{\"one\":\"tra {0} minuto\",\"other\":\"tra {0} minuti\"},\"past\":{\"one\":\"{0} minuto fa\",\"other\":\"{0} minuti fa\"}}},\"second\":{\"displayName\":\"Secondo\",\"relative\":{\"0\":\"ora\"},\"relativeTime\":{\"future\":{\"one\":\"tra {0} secondo\",\"other\":\"tra {0} secondi\"},\"past\":{\"one\":\"{0} secondo fa\",\"other\":\"{0} secondi fa\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"ja\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return\"other\"},\"fields\":{\"year\":{\"displayName\":\"年\",\"relative\":{\"0\":\"今年\",\"1\":\"翌年\",\"-1\":\"昨年\"},\"relativeTime\":{\"future\":{\"other\":\"{0} 年後\"},\"past\":{\"other\":\"{0} 年前\"}}},\"month\":{\"displayName\":\"月\",\"relative\":{\"0\":\"今月\",\"1\":\"翌月\",\"-1\":\"先月\"},\"relativeTime\":{\"future\":{\"other\":\"{0} か月後\"},\"past\":{\"other\":\"{0} か月前\"}}},\"day\":{\"displayName\":\"日\",\"relative\":{\"0\":\"今日\",\"1\":\"明日\",\"2\":\"明後日\",\"-2\":\"一昨日\",\"-1\":\"昨日\"},\"relativeTime\":{\"future\":{\"other\":\"{0} 日後\"},\"past\":{\"other\":\"{0} 日前\"}}},\"hour\":{\"displayName\":\"時\",\"relativeTime\":{\"future\":{\"other\":\"{0} 時間後\"},\"past\":{\"other\":\"{0} 時間前\"}}},\"minute\":{\"displayName\":\"分\",\"relativeTime\":{\"future\":{\"other\":\"{0} 分後\"},\"past\":{\"other\":\"{0} 分前\"}}},\"second\":{\"displayName\":\"秒\",\"relative\":{\"0\":\"今すぐ\"},\"relativeTime\":{\"future\":{\"other\":\"{0} 秒後\"},\"past\":{\"other\":\"{0} 秒前\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"ko\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return\"other\"},\"fields\":{\"year\":{\"displayName\":\"년\",\"relative\":{\"0\":\"올해\",\"1\":\"내년\",\"-1\":\"작년\"},\"relativeTime\":{\"future\":{\"other\":\"{0}년 후\"},\"past\":{\"other\":\"{0}년 전\"}}},\"month\":{\"displayName\":\"월\",\"relative\":{\"0\":\"이번 달\",\"1\":\"다음 달\",\"-1\":\"지난달\"},\"relativeTime\":{\"future\":{\"other\":\"{0}개월 후\"},\"past\":{\"other\":\"{0}개월 전\"}}},\"day\":{\"displayName\":\"일\",\"relative\":{\"0\":\"오늘\",\"1\":\"내일\",\"2\":\"모레\",\"-2\":\"그저께\",\"-1\":\"어제\"},\"relativeTime\":{\"future\":{\"other\":\"{0}일 후\"},\"past\":{\"other\":\"{0}일 전\"}}},\"hour\":{\"displayName\":\"시\",\"relativeTime\":{\"future\":{\"other\":\"{0}시간 후\"},\"past\":{\"other\":\"{0}시간 전\"}}},\"minute\":{\"displayName\":\"분\",\"relativeTime\":{\"future\":{\"other\":\"{0}분 후\"},\"past\":{\"other\":\"{0}분 전\"}}},\"second\":{\"displayName\":\"초\",\"relative\":{\"0\":\"지금\"},\"relativeTime\":{\"future\":{\"other\":\"{0}초 후\"},\"past\":{\"other\":\"{0}초 전\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"nl\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1];if(ord)return\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"jaar\",\"relative\":{\"0\":\"dit jaar\",\"1\":\"volgend jaar\",\"-1\":\"vorig jaar\"},\"relativeTime\":{\"future\":{\"one\":\"over {0} jaar\",\"other\":\"over {0} jaar\"},\"past\":{\"one\":\"{0} jaar geleden\",\"other\":\"{0} jaar geleden\"}}},\"month\":{\"displayName\":\"maand\",\"relative\":{\"0\":\"deze maand\",\"1\":\"volgende maand\",\"-1\":\"vorige maand\"},\"relativeTime\":{\"future\":{\"one\":\"over {0} maand\",\"other\":\"over {0} maanden\"},\"past\":{\"one\":\"{0} maand geleden\",\"other\":\"{0} maanden geleden\"}}},\"day\":{\"displayName\":\"dag\",\"relative\":{\"0\":\"vandaag\",\"1\":\"morgen\",\"2\":\"overmorgen\",\"-2\":\"eergisteren\",\"-1\":\"gisteren\"},\"relativeTime\":{\"future\":{\"one\":\"over {0} dag\",\"other\":\"over {0} dagen\"},\"past\":{\"one\":\"{0} dag geleden\",\"other\":\"{0} dagen geleden\"}}},\"hour\":{\"displayName\":\"Uur\",\"relativeTime\":{\"future\":{\"one\":\"over {0} uur\",\"other\":\"over {0} uur\"},\"past\":{\"one\":\"{0} uur geleden\",\"other\":\"{0} uur geleden\"}}},\"minute\":{\"displayName\":\"minuut\",\"relativeTime\":{\"future\":{\"one\":\"over {0} minuut\",\"other\":\"over {0} minuten\"},\"past\":{\"one\":\"{0} minuut geleden\",\"other\":\"{0} minuten geleden\"}}},\"second\":{\"displayName\":\"seconde\",\"relative\":{\"0\":\"nu\"},\"relativeTime\":{\"future\":{\"one\":\"over {0} seconde\",\"other\":\"over {0} seconden\"},\"past\":{\"one\":\"{0} seconde geleden\",\"other\":\"{0} seconden geleden\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"no\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return n==1?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"Year\",\"relative\":{\"0\":\"this year\",\"1\":\"next year\",\"-1\":\"last year\"},\"relativeTime\":{\"future\":{\"other\":\"+{0} y\"},\"past\":{\"other\":\"-{0} y\"}}},\"month\":{\"displayName\":\"Month\",\"relative\":{\"0\":\"this month\",\"1\":\"next month\",\"-1\":\"last month\"},\"relativeTime\":{\"future\":{\"other\":\"+{0} m\"},\"past\":{\"other\":\"-{0} m\"}}},\"day\":{\"displayName\":\"Day\",\"relative\":{\"0\":\"today\",\"1\":\"tomorrow\",\"-1\":\"yesterday\"},\"relativeTime\":{\"future\":{\"other\":\"+{0} d\"},\"past\":{\"other\":\"-{0} d\"}}},\"hour\":{\"displayName\":\"Hour\",\"relativeTime\":{\"future\":{\"other\":\"+{0} h\"},\"past\":{\"other\":\"-{0} h\"}}},\"minute\":{\"displayName\":\"Minute\",\"relativeTime\":{\"future\":{\"other\":\"+{0} min\"},\"past\":{\"other\":\"-{0} min\"}}},\"second\":{\"displayName\":\"Second\",\"relative\":{\"0\":\"now\"},\"relativeTime\":{\"future\":{\"other\":\"+{0} s\"},\"past\":{\"other\":\"-{0} s\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"pl\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],v0=!s[1],i10=i.slice(-1),i100=i.slice(-2);if(ord)return\"other\";return n==1&&v0?\"one\":v0&&(i10>=2&&i10<=4)&&(i100<12||i100>14)?\"few\":v0&&i!=1&&(i10==0||i10==1)||v0&&(i10>=5&&i10<=9)||v0&&(i100>=12&&i100<=14)?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"rok\",\"relative\":{\"0\":\"w tym roku\",\"1\":\"w przyszłym roku\",\"-1\":\"w zeszłym roku\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} rok\",\"few\":\"za {0} lata\",\"many\":\"za {0} lat\",\"other\":\"za {0} roku\"},\"past\":{\"one\":\"{0} rok temu\",\"few\":\"{0} lata temu\",\"many\":\"{0} lat temu\",\"other\":\"{0} roku temu\"}}},\"month\":{\"displayName\":\"miesiąc\",\"relative\":{\"0\":\"w tym miesiącu\",\"1\":\"w przyszłym miesiącu\",\"-1\":\"w zeszłym miesiącu\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} miesiąc\",\"few\":\"za {0} miesiące\",\"many\":\"za {0} miesięcy\",\"other\":\"za {0} miesiąca\"},\"past\":{\"one\":\"{0} miesiąc temu\",\"few\":\"{0} miesiące temu\",\"many\":\"{0} miesięcy temu\",\"other\":\"{0} miesiąca temu\"}}},\"day\":{\"displayName\":\"dzień\",\"relative\":{\"0\":\"dzisiaj\",\"1\":\"jutro\",\"2\":\"pojutrze\",\"-2\":\"przedwczoraj\",\"-1\":\"wczoraj\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} dzień\",\"few\":\"za {0} dni\",\"many\":\"za {0} dni\",\"other\":\"za {0} dnia\"},\"past\":{\"one\":\"{0} dzień temu\",\"few\":\"{0} dni temu\",\"many\":\"{0} dni temu\",\"other\":\"{0} dnia temu\"}}},\"hour\":{\"displayName\":\"godzina\",\"relativeTime\":{\"future\":{\"one\":\"za {0} godzinę\",\"few\":\"za {0} godziny\",\"many\":\"za {0} godzin\",\"other\":\"za {0} godziny\"},\"past\":{\"one\":\"{0} godzinę temu\",\"few\":\"{0} godziny temu\",\"many\":\"{0} godzin temu\",\"other\":\"{0} godziny temu\"}}},\"minute\":{\"displayName\":\"minuta\",\"relativeTime\":{\"future\":{\"one\":\"za {0} minutę\",\"few\":\"za {0} minuty\",\"many\":\"za {0} minut\",\"other\":\"za {0} minuty\"},\"past\":{\"one\":\"{0} minutę temu\",\"few\":\"{0} minuty temu\",\"many\":\"{0} minut temu\",\"other\":\"{0} minuty temu\"}}},\"second\":{\"displayName\":\"sekunda\",\"relative\":{\"0\":\"teraz\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} sekundę\",\"few\":\"za {0} sekundy\",\"many\":\"za {0} sekund\",\"other\":\"za {0} sekundy\"},\"past\":{\"one\":\"{0} sekundę temu\",\"few\":\"{0} sekundy temu\",\"many\":\"{0} sekund temu\",\"other\":\"{0} sekundy temu\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"pt-br\",\"parentLocale\":\"pt\"},{\"locale\":\"pt\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),t0=Number(s[0])==n;if(ord)return\"other\";return t0&&n>=0&&n<=2&&n!=2?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"ano\",\"relative\":{\"0\":\"este ano\",\"1\":\"próximo ano\",\"-1\":\"ano passado\"},\"relativeTime\":{\"future\":{\"one\":\"em {0} ano\",\"other\":\"em {0} anos\"},\"past\":{\"one\":\"há {0} ano\",\"other\":\"há {0} anos\"}}},\"month\":{\"displayName\":\"mês\",\"relative\":{\"0\":\"este mês\",\"1\":\"próximo mês\",\"-1\":\"mês passado\"},\"relativeTime\":{\"future\":{\"one\":\"em {0} mês\",\"other\":\"em {0} meses\"},\"past\":{\"one\":\"há {0} mês\",\"other\":\"há {0} meses\"}}},\"day\":{\"displayName\":\"dia\",\"relative\":{\"0\":\"hoje\",\"1\":\"amanhã\",\"2\":\"depois de amanhã\",\"-2\":\"anteontem\",\"-1\":\"ontem\"},\"relativeTime\":{\"future\":{\"one\":\"em {0} dia\",\"other\":\"em {0} dias\"},\"past\":{\"one\":\"há {0} dia\",\"other\":\"há {0} dias\"}}},\"hour\":{\"displayName\":\"hora\",\"relativeTime\":{\"future\":{\"one\":\"em {0} hora\",\"other\":\"em {0} horas\"},\"past\":{\"one\":\"há {0} hora\",\"other\":\"há {0} horas\"}}},\"minute\":{\"displayName\":\"minuto\",\"relativeTime\":{\"future\":{\"one\":\"em {0} minuto\",\"other\":\"em {0} minutos\"},\"past\":{\"one\":\"há {0} minuto\",\"other\":\"há {0} minutos\"}}},\"second\":{\"displayName\":\"segundo\",\"relative\":{\"0\":\"agora\"},\"relativeTime\":{\"future\":{\"one\":\"em {0} segundo\",\"other\":\"em {0} segundos\"},\"past\":{\"one\":\"há {0} segundo\",\"other\":\"há {0} segundos\"}}}}},{\"locale\":\"pt-PT\",\"parentLocale\":\"pt\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1];if(ord)return\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"ano\",\"relative\":{\"0\":\"este ano\",\"1\":\"próximo ano\",\"-1\":\"ano passado\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} ano\",\"other\":\"dentro de {0} anos\"},\"past\":{\"one\":\"há {0} ano\",\"other\":\"há {0} anos\"}}},\"month\":{\"displayName\":\"mês\",\"relative\":{\"0\":\"este mês\",\"1\":\"próximo mês\",\"-1\":\"mês passado\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} mês\",\"other\":\"dentro de {0} meses\"},\"past\":{\"one\":\"há {0} mês\",\"other\":\"há {0} meses\"}}},\"day\":{\"displayName\":\"dia\",\"relative\":{\"0\":\"hoje\",\"1\":\"amanhã\",\"2\":\"depois de amanhã\",\"-2\":\"anteontem\",\"-1\":\"ontem\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} dia\",\"other\":\"dentro de {0} dias\"},\"past\":{\"one\":\"há {0} dia\",\"other\":\"há {0} dias\"}}},\"hour\":{\"displayName\":\"hora\",\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} hora\",\"other\":\"dentro de {0} horas\"},\"past\":{\"one\":\"há {0} hora\",\"other\":\"há {0} horas\"}}},\"minute\":{\"displayName\":\"minuto\",\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} minuto\",\"other\":\"dentro de {0} minutos\"},\"past\":{\"one\":\"há {0} minuto\",\"other\":\"há {0} minutos\"}}},\"second\":{\"displayName\":\"segundo\",\"relative\":{\"0\":\"agora\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} segundo\",\"other\":\"dentro de {0} segundos\"},\"past\":{\"one\":\"há {0} segundo\",\"other\":\"há {0} segundos\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"ru\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],v0=!s[1],i10=i.slice(-1),i100=i.slice(-2);if(ord)return\"other\";return v0&&i10==1&&i100!=11?\"one\":v0&&(i10>=2&&i10<=4)&&(i100<12||i100>14)?\"few\":v0&&i10==0||v0&&(i10>=5&&i10<=9)||v0&&(i100>=11&&i100<=14)?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"год\",\"relative\":{\"0\":\"в этом году\",\"1\":\"в следующем году\",\"-1\":\"в прошлом году\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} год\",\"few\":\"через {0} года\",\"many\":\"через {0} лет\",\"other\":\"через {0} года\"},\"past\":{\"one\":\"{0} год назад\",\"few\":\"{0} года назад\",\"many\":\"{0} лет назад\",\"other\":\"{0} года назад\"}}},\"month\":{\"displayName\":\"месяц\",\"relative\":{\"0\":\"в этом месяце\",\"1\":\"в следующем месяце\",\"-1\":\"в прошлом месяце\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} месяц\",\"few\":\"через {0} месяца\",\"many\":\"через {0} месяцев\",\"other\":\"через {0} месяца\"},\"past\":{\"one\":\"{0} месяц назад\",\"few\":\"{0} месяца назад\",\"many\":\"{0} месяцев назад\",\"other\":\"{0} месяца назад\"}}},\"day\":{\"displayName\":\"день\",\"relative\":{\"0\":\"сегодня\",\"1\":\"завтра\",\"2\":\"послезавтра\",\"-2\":\"позавчера\",\"-1\":\"вчера\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} день\",\"few\":\"через {0} дня\",\"many\":\"через {0} дней\",\"other\":\"через {0} дней\"},\"past\":{\"one\":\"{0} день назад\",\"few\":\"{0} дня назад\",\"many\":\"{0} дней назад\",\"other\":\"{0} дня назад\"}}},\"hour\":{\"displayName\":\"час\",\"relativeTime\":{\"future\":{\"one\":\"через {0} час\",\"few\":\"через {0} часа\",\"many\":\"через {0} часов\",\"other\":\"через {0} часа\"},\"past\":{\"one\":\"{0} час назад\",\"few\":\"{0} часа назад\",\"many\":\"{0} часов назад\",\"other\":\"{0} часа назад\"}}},\"minute\":{\"displayName\":\"минута\",\"relativeTime\":{\"future\":{\"one\":\"через {0} минуту\",\"few\":\"через {0} минуты\",\"many\":\"через {0} минут\",\"other\":\"через {0} минуты\"},\"past\":{\"one\":\"{0} минуту назад\",\"few\":\"{0} минуты назад\",\"many\":\"{0} минут назад\",\"other\":\"{0} минуты назад\"}}},\"second\":{\"displayName\":\"секунда\",\"relative\":{\"0\":\"сейчас\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} секунду\",\"few\":\"через {0} секунды\",\"many\":\"через {0} секунд\",\"other\":\"через {0} секунды\"},\"past\":{\"one\":\"{0} секунду назад\",\"few\":\"{0} секунды назад\",\"many\":\"{0} секунд назад\",\"other\":\"{0} секунды назад\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"sv\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1),n100=t0&&s[0].slice(-2);if(ord)return(n10==1||n10==2)&&n100!=11&&n100!=12?\"one\":\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"år\",\"relative\":{\"0\":\"i år\",\"1\":\"nästa år\",\"-1\":\"i fjol\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} år\",\"other\":\"om {0} år\"},\"past\":{\"one\":\"för {0} år sedan\",\"other\":\"för {0} år sedan\"}}},\"month\":{\"displayName\":\"månad\",\"relative\":{\"0\":\"denna månad\",\"1\":\"nästa månad\",\"-1\":\"förra månaden\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} månad\",\"other\":\"om {0} månader\"},\"past\":{\"one\":\"för {0} månad sedan\",\"other\":\"för {0} månader sedan\"}}},\"day\":{\"displayName\":\"dag\",\"relative\":{\"0\":\"i dag\",\"1\":\"i morgon\",\"2\":\"i övermorgon\",\"-2\":\"i förrgår\",\"-1\":\"i går\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} dag\",\"other\":\"om {0} dagar\"},\"past\":{\"one\":\"för {0} dag sedan\",\"other\":\"för {0} dagar sedan\"}}},\"hour\":{\"displayName\":\"timme\",\"relativeTime\":{\"future\":{\"one\":\"om {0} timme\",\"other\":\"om {0} timmar\"},\"past\":{\"one\":\"för {0} timme sedan\",\"other\":\"för {0} timmar sedan\"}}},\"minute\":{\"displayName\":\"minut\",\"relativeTime\":{\"future\":{\"one\":\"om {0} minut\",\"other\":\"om {0} minuter\"},\"past\":{\"one\":\"för {0} minut sedan\",\"other\":\"för {0} minuter sedan\"}}},\"second\":{\"displayName\":\"sekund\",\"relative\":{\"0\":\"nu\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} sekund\",\"other\":\"om {0} sekunder\"},\"past\":{\"one\":\"för {0} sekund sedan\",\"other\":\"för {0} sekunder sedan\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"th\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return\"other\"},\"fields\":{\"year\":{\"displayName\":\"ปี\",\"relative\":{\"0\":\"ปีนี้\",\"1\":\"ปีหน้า\",\"-1\":\"ปีที่แล้ว\"},\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} ปี\"},\"past\":{\"other\":\"{0} ปีที่แล้ว\"}}},\"month\":{\"displayName\":\"เดือน\",\"relative\":{\"0\":\"เดือนนี้\",\"1\":\"เดือนหน้า\",\"-1\":\"เดือนที่แล้ว\"},\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} เดือน\"},\"past\":{\"other\":\"{0} เดือนที่ผ่านมา\"}}},\"day\":{\"displayName\":\"วัน\",\"relative\":{\"0\":\"วันนี้\",\"1\":\"พรุ่งนี้\",\"2\":\"มะรืนนี้\",\"-2\":\"เมื่อวานซืน\",\"-1\":\"เมื่อวาน\"},\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} วัน\"},\"past\":{\"other\":\"{0} วันที่ผ่านมา\"}}},\"hour\":{\"displayName\":\"ชั่วโมง\",\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} ชั่วโมง\"},\"past\":{\"other\":\"{0} ชั่วโมงที่ผ่านมา\"}}},\"minute\":{\"displayName\":\"นาที\",\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} นาที\"},\"past\":{\"other\":\"{0} นาทีที่ผ่านมา\"}}},\"second\":{\"displayName\":\"วินาที\",\"relative\":{\"0\":\"ขณะนี้\"},\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} วินาที\"},\"past\":{\"other\":\"{0} วินาทีที่ผ่านมา\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"tr\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return n==1?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"Yıl\",\"relative\":{\"0\":\"bu yıl\",\"1\":\"gelecek yıl\",\"-1\":\"geçen yıl\"},\"relativeTime\":{\"future\":{\"one\":\"{0} yıl sonra\",\"other\":\"{0} yıl sonra\"},\"past\":{\"one\":\"{0} yıl önce\",\"other\":\"{0} yıl önce\"}}},\"month\":{\"displayName\":\"Ay\",\"relative\":{\"0\":\"bu ay\",\"1\":\"gelecek ay\",\"-1\":\"geçen ay\"},\"relativeTime\":{\"future\":{\"one\":\"{0} ay sonra\",\"other\":\"{0} ay sonra\"},\"past\":{\"one\":\"{0} ay önce\",\"other\":\"{0} ay önce\"}}},\"day\":{\"displayName\":\"Gün\",\"relative\":{\"0\":\"bugün\",\"1\":\"yarın\",\"2\":\"öbür gün\",\"-2\":\"evvelsi gün\",\"-1\":\"dün\"},\"relativeTime\":{\"future\":{\"one\":\"{0} gün sonra\",\"other\":\"{0} gün sonra\"},\"past\":{\"one\":\"{0} gün önce\",\"other\":\"{0} gün önce\"}}},\"hour\":{\"displayName\":\"Saat\",\"relativeTime\":{\"future\":{\"one\":\"{0} saat sonra\",\"other\":\"{0} saat sonra\"},\"past\":{\"one\":\"{0} saat önce\",\"other\":\"{0} saat önce\"}}},\"minute\":{\"displayName\":\"Dakika\",\"relativeTime\":{\"future\":{\"one\":\"{0} dakika sonra\",\"other\":\"{0} dakika sonra\"},\"past\":{\"one\":\"{0} dakika önce\",\"other\":\"{0} dakika önce\"}}},\"second\":{\"displayName\":\"Saniye\",\"relative\":{\"0\":\"şimdi\"},\"relativeTime\":{\"future\":{\"one\":\"{0} saniye sonra\",\"other\":\"{0} saniye sonra\"},\"past\":{\"one\":\"{0} saniye önce\",\"other\":\"{0} saniye önce\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"uk\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1),n100=t0&&s[0].slice(-2),i10=i.slice(-1),i100=i.slice(-2);if(ord)return n10==3&&n100!=13?\"few\":\"other\";return v0&&i10==1&&i100!=11?\"one\":v0&&(i10>=2&&i10<=4)&&(i100<12||i100>14)?\"few\":v0&&i10==0||v0&&(i10>=5&&i10<=9)||v0&&(i100>=11&&i100<=14)?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"рік\",\"relative\":{\"0\":\"цього року\",\"1\":\"наступного року\",\"-1\":\"торік\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} рік\",\"few\":\"через {0} роки\",\"many\":\"через {0} років\",\"other\":\"через {0} року\"},\"past\":{\"one\":\"{0} рік тому\",\"few\":\"{0} роки тому\",\"many\":\"{0} років тому\",\"other\":\"{0} року тому\"}}},\"month\":{\"displayName\":\"місяць\",\"relative\":{\"0\":\"цього місяця\",\"1\":\"наступного місяця\",\"-1\":\"минулого місяця\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} місяць\",\"few\":\"через {0} місяці\",\"many\":\"через {0} місяців\",\"other\":\"через {0} місяця\"},\"past\":{\"one\":\"{0} місяць тому\",\"few\":\"{0} місяці тому\",\"many\":\"{0} місяців тому\",\"other\":\"{0} місяця тому\"}}},\"day\":{\"displayName\":\"день\",\"relative\":{\"0\":\"сьогодні\",\"1\":\"завтра\",\"2\":\"післязавтра\",\"-2\":\"позавчора\",\"-1\":\"учора\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} день\",\"few\":\"через {0} дні\",\"many\":\"через {0} днів\",\"other\":\"через {0} дня\"},\"past\":{\"one\":\"{0} день тому\",\"few\":\"{0} дні тому\",\"many\":\"{0} днів тому\",\"other\":\"{0} дня тому\"}}},\"hour\":{\"displayName\":\"година\",\"relativeTime\":{\"future\":{\"one\":\"через {0} годину\",\"few\":\"через {0} години\",\"many\":\"через {0} годин\",\"other\":\"через {0} години\"},\"past\":{\"one\":\"{0} годину тому\",\"few\":\"{0} години тому\",\"many\":\"{0} годин тому\",\"other\":\"{0} години тому\"}}},\"minute\":{\"displayName\":\"хвилина\",\"relativeTime\":{\"future\":{\"one\":\"через {0} хвилину\",\"few\":\"через {0} хвилини\",\"many\":\"через {0} хвилин\",\"other\":\"через {0} хвилини\"},\"past\":{\"one\":\"{0} хвилину тому\",\"few\":\"{0} хвилини тому\",\"many\":\"{0} хвилин тому\",\"other\":\"{0} хвилини тому\"}}},\"second\":{\"displayName\":\"секунда\",\"relative\":{\"0\":\"зараз\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} секунду\",\"few\":\"через {0} секунди\",\"many\":\"через {0} секунд\",\"other\":\"через {0} секунди\"},\"past\":{\"one\":\"{0} секунду тому\",\"few\":\"{0} секунди тому\",\"many\":\"{0} секунд тому\",\"other\":\"{0} секунди тому\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"zh-cn\",\"parentLocale\":\"zh\"},{\"locale\":\"zh\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return\"other\"},\"fields\":{\"year\":{\"displayName\":\"年\",\"relative\":{\"0\":\"今年\",\"1\":\"明年\",\"-1\":\"去年\"},\"relativeTime\":{\"future\":{\"other\":\"{0}年后\"},\"past\":{\"other\":\"{0}年前\"}}},\"month\":{\"displayName\":\"月\",\"relative\":{\"0\":\"本月\",\"1\":\"下个月\",\"-1\":\"上个月\"},\"relativeTime\":{\"future\":{\"other\":\"{0}个月后\"},\"past\":{\"other\":\"{0}个月前\"}}},\"day\":{\"displayName\":\"日\",\"relative\":{\"0\":\"今天\",\"1\":\"明天\",\"2\":\"后天\",\"-2\":\"前天\",\"-1\":\"昨天\"},\"relativeTime\":{\"future\":{\"other\":\"{0}天后\"},\"past\":{\"other\":\"{0}天前\"}}},\"hour\":{\"displayName\":\"小时\",\"relativeTime\":{\"future\":{\"other\":\"{0}小时后\"},\"past\":{\"other\":\"{0}小时前\"}}},\"minute\":{\"displayName\":\"分钟\",\"relativeTime\":{\"future\":{\"other\":\"{0}分钟后\"},\"past\":{\"other\":\"{0}分钟前\"}}},\"second\":{\"displayName\":\"秒钟\",\"relative\":{\"0\":\"现在\"},\"relativeTime\":{\"future\":{\"other\":\"{0}秒钟后\"},\"past\":{\"other\":\"{0}秒钟前\"}}}}},{\"locale\":\"zh-tw\",\"parentLocale\":\"zh\"}];","define(\"connections-ui/components/accessible-checkbox/component\", [\"exports\", \"ember-purecloud-components/components/accessible-checkbox/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { on, inject, Component } = Ember;\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['admin-ui-modal'],\n\n    application: inject.service(),\n    session: inject.service(),\n    notification: inject.service(),\n\n    src: '',\n    name: 'admin-ui-modal',\n\n    sendClose() {\n        this.sendAction('closeAdminModal');\n    },\n\n    toast(data) {\n        let notificationType = 'info';\n        if (data.type === 'success' || data.type === 'error') {\n            notificationType = data.type;\n        }\n\n        this.get('notification')[notificationType](\n            data.title,\n            data.message,\n            Object.assign(\n                {},\n                {\n                    markdownToHtml: false,\n                    shouldShowPopup: true,\n                    shouldPlaySound: false\n                },\n                data\n            )\n        );\n    },\n\n    handleMessageEvent(event) {\n        Ember.run(() => {\n            if (!event) {\n                return;\n            }\n            try {\n                const sameHost = Ember.get(event, 'originalEvent.source.document.location.host') === location.host;\n                const sameName = Ember.get(event, 'originalEvent.source.name') === this.get('name');\n                if (!(sameHost & sameName)) {\n                    return;\n                }\n                const message = Ember.get(event, 'originalEvent.data');\n                if (message.type === 'modal:close') {\n                    this.sendClose();\n                } else if (message.type === 'content:route:changed') {\n                    if (!message.data.hash.match(/^\\/directory\\/people\\/(add|import|link)/)) {\n                        const hash = `#/admin${message.data.hash}`;\n                        location.hash = hash;\n                    }\n                } else if (message.type === 'toast') {\n                    this.toast(message.data);\n                }\n            } catch (error) {\n                if (error && error.name === 'SecurityError') {\n                    return;\n                }\n                this.logger.error('error handling frame message', {\n                    error\n                });\n            }\n        });\n    },\n\n    startMessageListener: on('didInsertElement', function () {\n        $(window).on(`message.${this.elementId}`, this.handleMessageEvent.bind(this));\n    }),\n\n    stopMessageListener: on('willDestroyElement', function () {\n        $(window).off(`message.${this.elementId}`);\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"lfPaatln\",\"block\":\"{\\\"statements\\\":[[11,\\\"iframe\\\",[]],[16,\\\"title\\\",[34,[[26,[\\\"name\\\"]]]]],[16,\\\"name\\\",[34,[[26,[\\\"name\\\"]]]]],[16,\\\"src\\\",[34,[[26,[\\\"src\\\"]]]]],[15,\\\"role\\\",\\\"presentation\\\"],[15,\\\"seamless\\\",\\\"\\\"],[13],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/admin-ui-modal/template.hbs\"}});","define(\"connections-ui/components/alert-message/component\", [\"exports\", \"ember-purecloud-components/components/alert-message/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","/* globals Modernizr */\n\nimport Ember from 'ember';\nimport moment from '../../utils/dates';\n\nconst { Component, inject, computed } = Ember;\n\nexport default Component.extend({\n    classNames: 'analog-clock',\n    classNameBindings: ['_analogSupported:analog-supported:analog-unsupported', '_invalidTime:invalid-time'],\n    attributeBindings: ['_currTimeLabel:title', '_currTimeLabel:aria-label'],\n\n    intl: inject.service(),\n\n    // Attrs\n    utcOffset: null,\n    staticMoment: null,\n    showSecondHand: true,\n    autoIncrement: true,\n\n    _analogSupported: Modernizr.csstransforms,\n    _displayedMoment: null,\n    _invalidTime: computed.not('_displayedMoment'),\n    _currTimeLabel: null,\n    _pendingTick: null,\n\n    willRender() {\n        this._cancelTimers();\n\n        let time = moment(this.get('staticMoment') || undefined);\n        let formatStr = 'LTS';\n        let invalid = false;\n\n        try {\n            if (this.get('utcOffset')) {\n                time.utcOffset(this.get('utcOffset'));\n                formatStr += ' Z';\n            }\n        } catch (e) {\n            invalid = true;\n        }\n\n        if (invalid || isNaN(time) || !time.isValid()) {\n            this.set('_displayedMoment', null);\n            this.set('_currTimeLabel', this.get('intl').t('components.analogClock.invalidTime'));\n        } else {\n            this.set('_displayedMoment', time);\n            this.set('_currTimeLabel', time.format(formatStr));\n        }\n\n        this._super(...arguments);\n    },\n\n    willDestroyElement() {\n        this._cancelTimers();\n        this._super(...arguments);\n    },\n\n    didRender() {\n        this._super(...arguments);\n\n        let time = this.get('_displayedMoment');\n\n        if (time && this.get('_analogSupported')) {\n            const hourElement = this.$('.hour-hand')[0];\n            const minuteElement = this.$('.minute-hand')[0];\n\n            let hour = time.hour(),\n                minute = time.minute(),\n                second = time.second(),\n                secondAngle = second * 6,\n                minuteAngle = minute * 6 + secondAngle / 60,\n                hourAngle = ((hour % 12) / 12) * 360 + 90 + minute / 12,\n                hourRule = `rotate(${hourAngle}deg)`,\n                minuteRule = `rotate(${minuteAngle}deg)`,\n                secondRule = `rotate(${secondAngle}deg)`;\n\n            hourElement.style.transform = hourRule;\n            minuteElement.style.transform = minuteRule;\n            if (this.get('showSecondHand')) {\n                const secondElement = this.$('.second-hand')[0];\n                secondElement.style.transform = secondRule;\n            }\n        }\n\n        if (!this.get('staticMoment') && this.get('autoIncrement') && !this.get('_invalidTime')) {\n            this.set(\n                '_pendingTick',\n                Ember.run.later(\n                    this,\n                    () => {\n                        this.rerender();\n                    },\n                    1000\n                )\n            );\n        }\n    },\n\n    _cancelTimers() {\n        ['_pendingTick'].forEach(timerName => {\n            let currTimer = this.get(timerName);\n            if (currTimer) {\n                Ember.run.cancel(currTimer);\n                this.set(timerName, null);\n            }\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"jPusaeLb\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"_analogSupported\\\"]],[33,[\\\"not\\\"],[[28,[\\\"_invalidTime\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"clock-face\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"hour-hand\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"minute-hand\\\"],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showSecondHand\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"second-hand\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[1,[26,[\\\"_currTimeLabel\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/analog-clock/template.hbs\"}});","import Ember from 'ember';\nimport { isValidEmailAddress } from 'ember-purecloud-components/utils/email';\n\nvar AnchorTagComponent = Ember.Component.extend({\n    tagName: 'span',\n\n    intl: Ember.inject.service(),\n\n    httpRegex: /(http|https):\\/\\/(?:www\\.)?(.*)/i,\n\n    // Anchor tag text body: <a>{{label}}</a>\n    label: null,\n\n    //href components: <a href=\"{{protocol & value}}\">{{label}}</a>\n    value: null, //email address, phone number, URL\n    protocol: null, //protocol of the href in the case of mailto, tel, sms, etc.\n\n    title: null,\n    target: '_blank',\n\n    init: function () {\n        this._super();\n\n        this.decorateLabel();\n    },\n\n    text: Ember.computed('value', 'label', function () {\n        var label = this.get('label');\n        if (label) {\n            return label;\n        }\n\n        var value = this.get('value'),\n            protocol = this.get('protocol');\n\n        // If the value already has a protocol for http, gods be good lets not waste space showing it.\n        if (value && value.match(this.get('httpRegex'))) {\n            value = value.replace(this.get('httpRegex'), '$2');\n        }\n\n        if (protocol === 'map') {\n            value = Ember.String.htmlSafe(Ember.Handlebars.Utils.escapeExpression(value).replace(/\\n/g, '<br />'));\n        }\n\n        return value;\n    }),\n\n    anchor: Ember.computed('value', 'protocol', function () {\n        var value = this.get('value'),\n            protocol = this.get('protocol');\n\n        if (protocol === 'map' && value) {\n            this.set('target', '_new');\n            return 'https://maps.google.com/?q=' + window.encodeURIComponent(value);\n        }\n\n        //mailto:, tel:, sms:\n        if (protocol && value) {\n            return `${protocol}:${value}`;\n        }\n\n        if (value && value.match(this.get('httpRegex'))) {\n            return value;\n        }\n        // No protocol assumes plain http:// unless the value already has it set.\n        return `http://${value}`;\n    }),\n\n    decorateLabel: Ember.observer('value', function () {\n        var value = this.get('value'),\n            protocol = this.get('protocol');\n\n        if (protocol === 'mailto' && value) {\n            this.set('target', null);\n\n            // TODO: [Glimmer] fix this value issue\n            value = value.toString();\n\n            if (!isValidEmailAddress(value)) {\n                return this.set('label', this.get('intl').t('purecloud.acdInteraction.relate.validation.invalidEmail'));\n            }\n\n            this.set('label', value);\n        }\n    })\n});\n\nexport default AnchorTagComponent;\n","export default Ember.HTMLBars.template({\"id\":\"IdZ3BKuD\",\"block\":\"{\\\"statements\\\":[[11,\\\"a\\\",[]],[16,\\\"href\\\",[26,[\\\"anchor\\\"]],null],[16,\\\"title\\\",[26,[\\\"title\\\"]],null],[16,\\\"target\\\",[26,[\\\"target\\\"]],null],[13],[1,[26,[\\\"text\\\"]],false],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/anchor-tag/template.hbs\"}});","/* globals Modernizr */\n\nimport Ember from 'ember';\nimport _ from 'lodash';\n\nconst { Component, computed, get } = Ember;\n\nconst DEFAULT_IMG_TYPE = 'icon';\n\n// Possible Future Types: smallIcon (16x16), notificationIcon, launcherIcon, splashIcon (512x512)\nconst IMG_TYPE_CFG_MAP = {\n    icon: {\n        width: 24,\n        height: 24,\n        assetBasePath: 'assets.icon',\n        // The max allowable multiplier delta that is acceptable for a flexible image size\n        // Formally: delta <= closestSizeMaxMultiplierDelta where delta = Math.abs(1 - imgMultiplier)\n        // e.g. x12 - x36 when img size is 24\n        closestSizeMaxMultiplierDelta: 1,\n        minSupplimentalRes: 1.5,\n        maxSupplimentalRes: 3\n    },\n    tile: {\n        width: 128,\n        height: 128,\n        assetBasePath: 'assets.icon',\n        // The max allowable multiplier delta that is acceptable for a flexible image size\n        // Formally: delta <= closestSizeMaxMultiplierDelta where delta = Math.abs(1 - imgMultiplier)\n        // e.g. x12 - x36 when img size is 24\n        closestSizeMaxMultiplierDelta: 1,\n        minSupplimentalRes: 1.5,\n        maxSupplimentalRes: 3\n    }\n};\n\nconst VECTOR_IMG_PROP_NAME = 'vector';\nconst RASTER_IMGS_PROP_NAME = 'raster';\nconst RASTER_IMG_KEY_REG_EXP = /^x(\\d+)$/i;\nconst CLASS_NAMES_PROP_NAME = 'classNames';\nconst SVG_PATH_PROP_NAME = 'svgSpriteHref';\nconst GUX_ICON_PROPS_PATH = 'guxIcon';\n\nconst NO_TITLE_MODE = 'none';\nconst NATIVE_TITLE_MODE = 'native';\nconst TOOLTIP_TITLE_MODE = 'tooltip';\nconst DEFAULT_TITLE_MODE = TOOLTIP_TITLE_MODE;\nconst TITLE_MODES = [NO_TITLE_MODE, NATIVE_TITLE_MODE, TOOLTIP_TITLE_MODE];\n\n/**\n * Generates the image markup for the specified app that is best suited\n * for the specified imgType.  imgType dictates the target environment for\n * the image display while the app's assets contain the dictionary of\n * image categories (icon, launcher, splash, etc.) and sizes (x16, x24, x512, etc.)\n *\n * In general, this algorithm is:\n * <ul>\n *   <li>Utilize the app assets appropriate for the imgType<li>\n *   <li>Use vector (svg) if in config and supported by browser</li>\n *   <li>Use exact or closest (within threshold) sized raster img for src</li>\n *   <li>\n *      Add any supplimental urls (with multiplier > 1 and within threshold)\n *      to srcset attribute if supported by browser\n *   <li>\n *   <li>If no applicable image can be found, use classNames</li>\n *   <li>If no classNames are configured, use the no-img placeholder</li>\n * </ul>\n */\nexport default Component.extend({\n    tagName: 'div',\n    classNames: ['app-img'],\n    classNameBindings: ['imgType'],\n    attributeBindings: ['title'],\n\n    app: null,\n\n    titleMode: computed({\n        get: () => DEFAULT_TITLE_MODE,\n        set(key, value) {\n            if (TITLE_MODES.indexOf(value) < 0) {\n                Ember.assert(`app-img Invalid titleMode: ${value}`);\n            }\n\n            return value;\n        }\n    }),\n\n    showTooltip: computed.equal('titleMode', TOOLTIP_TITLE_MODE),\n\n    title: computed('titleMode', 'app.name', function () {\n        let result = '';\n\n        const appName = this.get('app.name');\n        const titleMode = this.get('titleMode');\n\n        if (appName && appName.trim().length > 0 && titleMode === NATIVE_TITLE_MODE) {\n            result = appName;\n        }\n\n        return result;\n    }),\n\n    imgType: computed({\n        get: () => DEFAULT_IMG_TYPE,\n        set(key, value) {\n            if (Object.prototype.hasOwnProperty.call(IMG_TYPE_CFG_MAP, value)) {\n                return value;\n            } else {\n                Ember.assert(`Invalid app-img type ${value}`);\n            }\n        }\n    }),\n\n    imgWidth: computed('app', 'imgType', function () {\n        return IMG_TYPE_CFG_MAP[this.get('imgType')].width;\n    }),\n\n    imgHeight: computed('app', 'imgType', function () {\n        return IMG_TYPE_CFG_MAP[this.get('imgType')].height;\n    }),\n\n    _sortedRasterMultipliers: computed('app', 'imgType', function () {\n        let result = [];\n\n        let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n        let allRasterImgs = get(this, `app.${cfg.assetBasePath}.${RASTER_IMGS_PROP_NAME}`);\n\n        if (allRasterImgs && typeof allRasterImgs === 'object') {\n            _.forEach(allRasterImgs, (rasterUrl, rasterKey) => {\n                let rasterMatch = RASTER_IMG_KEY_REG_EXP.exec(rasterKey);\n                if (rasterMatch) {\n                    let currRasterWidth = parseInt(rasterMatch[1], 10);\n                    if (currRasterWidth && currRasterWidth > 0) {\n                        let currRasterMultiplier = currRasterWidth / cfg.width;\n\n                        result.push({\n                            url: rasterUrl,\n                            multiplier: currRasterMultiplier\n                        });\n                    }\n                }\n            });\n        }\n\n        return result.sort((a, b) => a.multiplier - b.multiplier);\n    }),\n\n    /**\n     * Returns the vectorImgUrl if one exists in the app config\n     * and if vector images are supported as img src in the current\n     * environment\n     */\n    _vectorImgUrl: computed('app', 'imgType', function () {\n        let result = null;\n\n        let app = this.get('app');\n        let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n        if (app && Modernizr.svgasimg) {\n            result = Ember.get(app, `${cfg.assetBasePath}.${VECTOR_IMG_PROP_NAME}`) || null;\n        }\n\n        return result;\n    }),\n\n    defaultImgUrl: computed('imgType', '_vectorImgUrl', '_sortedRasterMultipliers', function () {\n        let vectorImgUrl = this.get('_vectorImgUrl');\n        if (vectorImgUrl) {\n            return vectorImgUrl;\n        }\n\n        let result = null;\n        let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n\n        let allRasters = this.get('_sortedRasterMultipliers');\n        if (allRasters.length > 0) {\n            let lowestDelta = null;\n\n            for (let index = 0; index < allRasters.length; index++) {\n                let curr = allRasters[index];\n                let currDelta = Math.abs(1 - curr.multiplier);\n\n                if (lowestDelta === null || currDelta < lowestDelta) {\n                    lowestDelta = currDelta;\n                    result = curr.url;\n                }\n            }\n\n            // Ensure the best size default img is within the threshold\n            if (cfg.closestSizeMaxMultiplierDelta && lowestDelta > cfg.closestSizeMaxMultiplierDelta) {\n                result = null;\n            }\n        }\n\n        return result;\n    }),\n\n    imgSrcSet: computed('imgType', '_vectorImgUrl', 'defaultImgUrl', '_sortedRasterMultipliers', function () {\n        let result = '';\n\n        let vectorImgUrl = this.get('_vectorImgUrl');\n        let defaultImgUrl = this.get('defaultImgUrl');\n        let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n        let allRasters = this.get('_sortedRasterMultipliers');\n\n        if (Modernizr.srcset && !vectorImgUrl && defaultImgUrl && allRasters.length > 0) {\n            let supImgs = [];\n\n            allRasters.forEach(({ url, multiplier }) => {\n                if (\n                    url !== defaultImgUrl &&\n                    multiplier > 1 &&\n                    (!cfg.minSupplimentalRes || multiplier >= cfg.minSupplimentalRes) &&\n                    (!cfg.maxSupplimentalRes || multiplier <= cfg.maxSupplimentalRes)\n                ) {\n                    supImgs.push({\n                        url,\n                        multiplier\n                    });\n                }\n            });\n\n            if (supImgs.length > 0) {\n                // Sort the images by descending multiplier so the best one is choosen\n                supImgs.reverse();\n                result = supImgs.map(curr => `${curr.url} ${curr.multiplier}x`).join(',');\n            }\n        }\n\n        return result;\n    }),\n\n    svgSpriteHref: computed('app', 'imgType', function () {\n        let result = null;\n\n        let app = this.get('app');\n        if (app) {\n            let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n            let svgPropPath = `${cfg.assetBasePath}.${SVG_PATH_PROP_NAME}`;\n\n            let svgSpriteHref = app.get(svgPropPath);\n            if (svgSpriteHref) {\n                result = svgSpriteHref;\n            }\n        }\n\n        return result;\n    }),\n\n    imgClasses: computed('app', 'imgType', function () {\n        let result = null;\n\n        let app = this.get('app');\n        if (app) {\n            let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n            let classesPath = `${cfg.assetBasePath}.${CLASS_NAMES_PROP_NAME}`;\n\n            let classNames = app.get(classesPath);\n            if (classNames && Ember.isArray(classNames)) {\n                result = classNames.join(' ');\n            }\n        }\n\n        return result;\n    }),\n\n    guxIcon: computed('app', 'imgType', function () {\n        let result = null;\n\n        let app = this.get('app');\n        if (app) {\n            let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n            let guxIconPropsPath = `${cfg.assetBasePath}.${GUX_ICON_PROPS_PATH}`;\n\n            let guxIconProps = app.get(guxIconPropsPath);\n            if (\n                guxIconProps &&\n                Object.prototype.hasOwnProperty.call(guxIconProps, 'name') &&\n                guxIconProps.hasOwnProperty('decorative')\n            ) {\n                result = guxIconProps;\n            }\n        }\n\n        return result;\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"jh1kqPQo\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"defaultImgUrl\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"img\\\",[]],[16,\\\"src\\\",[34,[[26,[\\\"defaultImgUrl\\\"]]]]],[16,\\\"srcset\\\",[34,[[26,[\\\"imgSrcSet\\\"]]]]],[16,\\\"alt\\\",[34,[[28,[\\\"app\\\",\\\"name\\\"]]]]],[16,\\\"aria-label\\\",[34,[[28,[\\\"app\\\",\\\"name\\\"]]]]],[16,\\\"width\\\",[34,[[26,[\\\"imgWidth\\\"]]]]],[16,\\\"height\\\",[34,[[26,[\\\"imgHeight\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"imgClasses\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[[26,[\\\"imgClasses\\\"]]]]],[16,\\\"aria-label\\\",[34,[[28,[\\\"app\\\",\\\"name\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"svgSpriteHref\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"svg\\\",[]],[15,\\\"class\\\",\\\"svg-icon\\\"],[16,\\\"aria-label\\\",[34,[[28,[\\\"app\\\",\\\"name\\\"]]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"use\\\",[]],[16,\\\"href\\\",[26,[\\\"svgSpriteHref\\\"]],null],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"guxIcon\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[16,\\\"icon-name\\\",[28,[\\\"guxIcon\\\",\\\"name\\\"]],null],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-external-apps-unknown\\\"],[16,\\\"aria-label\\\",[34,[[28,[\\\"app\\\",\\\"name\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showTooltip\\\"]],[28,[\\\"app\\\",\\\"name\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"tooltip-on-element\\\"],null,[[\\\"targetOffset\\\"],[\\\"-10px 0\\\"]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[28,[\\\"app\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/app-img/template.hbs\"}});","define(\"connections-ui/components/audio-player-v2/component\", [\"exports\", \"ember-purecloud-components/components/audio-player-v2/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/audio-player-v2/participant/component\", [\"exports\", \"ember-purecloud-components/components/audio-player-v2/participant/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/audio-player-v2/timeline/component\", [\"exports\", \"ember-purecloud-components/components/audio-player-v2/timeline/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/audio-player-v2/waveform-graph/component\", [\"exports\", \"ember-purecloud-components/components/audio-player-v2/waveform-graph/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport Howler from 'howler-but-with-updates';\n\nconst Howl = Howler.Howl;\n\nconst { get, inject, computed, observer, RSVP, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['audio-player-v2'],\n\n    clock: inject.service(),\n    logger: inject.service('stash-logger'),\n    webrtc: inject.service(),\n    phone: inject.service(),\n\n    attrs: {\n        source: null,\n        options: {},\n        markAsRead: () => {},\n        onError: () => {}\n    },\n\n    playing: false,\n    didEnd: false,\n    loading: false,\n    loadingError: false,\n    registerStopVoicemailHandler: null,\n    sound: null,\n\n    playFromSelectedOutput: computed.reads('webrtc.session.features.playRecordingFromSelectedOutput'),\n\n    playbackVolume: computed('phone.callVolume', function () {\n        const callVolume = this.get('phone.callVolume');\n        const decimalValue = callVolume / 100;\n        return decimalValue;\n    }),\n\n    selectedOutputDevice: computed('webrtc.defaultOutputDevice', function () {\n        let deviceId;\n        let defaultOutputDevice = this.get('webrtc.defaultOutputDevice');\n        if (defaultOutputDevice) {\n            deviceId = defaultOutputDevice.get('deviceId');\n        }\n\n        return deviceId;\n    }),\n\n    outputDeviceUpdate: observer('webrtc.defaultOutputDevice', function () {\n        if (!this.get('sound') || !this.get('playFromSelectedOutput')) {\n            return;\n        }\n\n        let restartSound = false;\n        if (this.get('playing')) {\n            this.stopPlaying();\n            restartSound = true;\n        }\n\n        const newOutputDeviceId = this.get('selectedOutputDevice');\n        this.sound.setOutputDevice(newOutputDeviceId);\n\n        if (restartSound) {\n            this.sound.play();\n        }\n    }),\n\n    actions: {\n        togglePlay() {\n            if (this.get('playFromSelectedOutput')) {\n                const outputDeviceId = this.get('webrtc.defaultOutputDevice.deviceId');\n                if (outputDeviceId) {\n                    this.sound.setOutputDevice(outputDeviceId);\n                }\n\n                this.sound.volume(this.get('playbackVolume'));\n            }\n\n            if (this.get('playing')) {\n                this.sound.pause();\n            } else {\n                if (this.get('didEnd')) {\n                    this.sound.seek(0);\n                }\n                this.sound.play();\n            }\n        },\n\n        seekSound(value) {\n            this.sound.seek(value);\n        }\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n\n        const registerHandler = this.get('registerStopVoicemailHandler');\n        if (registerHandler && typeof registerHandler === 'function') {\n            registerHandler(this.stopPlaying.bind(this));\n        }\n\n        this.setupSound();\n    },\n\n    willDestroyElement() {\n        if (this.sound) {\n            this.sound.off();\n            this.sound.pause();\n        }\n\n        this._super(...arguments);\n    },\n\n    setupSound() {\n        this.set('loading', true);\n\n        const paths = this.getAttr('source');\n        const promise = RSVP.resolve(paths);\n        promise\n            .then(sources => {\n                if (sources && !Array.isArray(sources)) {\n                    return [sources];\n                }\n                return null;\n            })\n            .then(sources => {\n                const useHtml5 = this.get('playFromSelectedOutput');\n\n                if (sources) {\n                    const options = this.get('howlOptions');\n                    options.src = sources;\n                    options.html5 = useHtml5;\n                    this.sound = new Howl(options);\n                } else {\n                    this.set('loading', false);\n                    this.set('loadingError', true);\n\n                    this.get('logger').warn('There were no audio sources passed into the audio-player');\n\n                    this.attrs.onError();\n                }\n            })\n            .catch(err => {\n                this.set('loading', false);\n                this.set('loadingError', true);\n\n                this.get('logger').error('There was an error loading recorded audio', err);\n\n                this.attrs.onError(err);\n            });\n    },\n\n    duration: computed('loading', function () {\n        if (!this.sound) {\n            return 0;\n        }\n        return Math.floor(this.sound.duration() * 1000);\n    }),\n\n    currentTime: computed('clock.second', function () {\n        if (!this.sound) {\n            return 0;\n        }\n        return Math.floor(this.sound.seek() * 1000);\n    }),\n\n    loadingAudio: computed(function () {\n        return false;\n    }),\n\n    howlOptions: computed('options', function () {\n        const defaultOptions = {\n            onload: this.onLoad.bind(this),\n            onplay: this.onPlay.bind(this),\n            onpause: this.onPause.bind(this),\n            onend: this.onEnd.bind(this)\n        };\n        return _.merge({}, defaultOptions, this.get('options'));\n    }),\n\n    onLoad() {\n        this.set('loading', false);\n\n        this._checkSoundDuration();\n    },\n\n    onPlay() {\n        this.set('playing', true);\n    },\n\n    onPause() {\n        this.set('playing', false);\n    },\n\n    onEnd() {\n        this.set('playing', false);\n        this.set('didEnd', true);\n        if (this.attrs.markAsRead) {\n            this.attrs.markAsRead();\n        }\n    },\n\n    stopPlaying() {\n        this.sound && this.sound.pause();\n    },\n\n    _checkSoundDuration() {\n        const sound = this.sound;\n        if (!sound) {\n            return;\n        }\n\n        const audio = get(sound, '_sounds.0._node');\n        if (audio && audio.duration === Infinity) {\n            // We are dealing with a recording here\n            // See: http://stackoverflow.com/a/39971175\n            audio.currentTime = 1e101;\n            audio.ontimeupdate = () => {\n                audio.ontimeupdate = () => {};\n                audio.currentTime = 0;\n                sound._duration = audio.duration;\n\n                this.notifyPropertyChange('duration');\n            };\n        } else {\n            this.notifyPropertyChange('duration');\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['seek-bar', 'clickable'],\n\n    clock: inject.service(),\n\n    attrs: {\n        sound: null,\n        duration: null,\n        currentTime: null\n    },\n\n    didReceiveAttrs({ newAttrs, oldAttrs }) {\n        this._super(...arguments);\n\n        if (!newAttrs || !oldAttrs) {\n            return;\n        }\n\n        if (newAttrs.currentTime.value !== oldAttrs.currentTime.value) {\n            const position = this.get('position');\n            let left = position * 100;\n            if (left > 100) {\n                left = 100;\n            }\n            Ember.run(() => {\n                this.$('.progress-bar').css('margin-left', `${left}%`);\n            });\n        }\n    },\n\n    click(event) {\n        const seek = event.offsetX / this.$().width();\n        const totalSeconds = this.getAttr('duration') / 1000;\n        this.sendAction('didSeek', seek * totalSeconds);\n    },\n\n    position: computed('sound', 'currentTime', 'duration', function () {\n        const sound = this.getAttr('sound');\n        if (!sound) {\n            return 0;\n        }\n\n        return this.getAttr('currentTime') / this.getAttr('duration');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"wuEWTVpp\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"progress-bar\\\"],[13],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/audio-player/seek-bar/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"bP+lis+B\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"loading\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"common.loading\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loadingError\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioPlayer.loadingError\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link play-toggle\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"togglePlay\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"playing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-hold\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-play\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[1,[33,[\\\"audio-player/seek-bar\\\"],null,[[\\\"sound\\\",\\\"duration\\\",\\\"currentTime\\\",\\\"didSeek\\\"],[[28,[\\\"sound\\\"]],[28,[\\\"duration\\\"]],[28,[\\\"currentTime\\\"]],\\\"seekSound\\\"]]],false],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"duration-container\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"duration-format\\\"],null,[[\\\"classNames\\\",\\\"durationInMs\\\"],[\\\"current-time\\\",[28,[\\\"currentTime\\\"]]]]],false],[0,\\\"\\\\n            |\\\\n            \\\"],[1,[33,[\\\"duration-format\\\"],null,[[\\\"classNames\\\",\\\"durationInMs\\\"],[\\\"total-time\\\",[28,[\\\"duration\\\"]]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/audio-player/template.hbs\"}});","import Ember from 'ember';\n\nimport Recorder from '../../utils/sound-recorder';\nimport moment from '../../utils/dates';\n\nconst { run, inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['audio-recorder'],\n\n    webrtc: inject.service(),\n\n    recorder: null,\n    startTime: null,\n    showOptions: false,\n\n    attrs: {\n        file: null, // comes from parent, used for notifications\n\n        uploadImmediately: false,\n        playerOptions: {},\n        reset: () => {},\n        audioFileReady: () => {}\n    },\n\n    actions: {\n        startRecording() {\n            this.get('recorder').reset();\n            this.get('recorder').startRecording();\n            this.set('startTime', moment());\n        },\n\n        stopRecording() {\n            this.get('recorder').stopRecording();\n            this.set('startTime', null);\n        },\n\n        reset() {\n            this.get('recorder').reset();\n            this.attrs.reset();\n        }\n    },\n\n    hasSupport: computed.and('webrtc.audioCallCapable', 'hasMediaRecorder'),\n\n    audioBlob: computed.reads('recorder.blob'),\n    audioSource: computed.reads('recorder.blobURL'),\n    recording: computed.reads('recorder.recording'),\n\n    hasMediaRecorder: computed(function () {\n        return window.MediaRecorder !== undefined;\n    }),\n\n    showUploadButton: computed('audioSource', 'uploadImmediately', function () {\n        return !!this.get('audioSource') && !this.get('uploadImmediately');\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        if (this.get('hasSupport')) {\n            run.scheduleOnce('afterRender', this, this.setupRecording);\n        } else {\n            run.scheduleOnce('afterRender', this, this.set, 'loaded', true);\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        const recorder = this.get('recorder');\n        if (recorder) {\n            recorder.destroy();\n        }\n    },\n\n    didUpdateAttrs({ newAttrs }) {\n        if (newAttrs && newAttrs.file) {\n            if (!newAttrs.file.value) {\n                this.get('recorder').reset();\n            }\n        }\n    },\n\n    setupRecording() {\n        const recorder = Recorder.create(Ember.getOwner(this).ownerInjection());\n        this.set('recorder', recorder);\n\n        recorder.on('blobready', () => {\n            Ember.run(() => this.attrs.audioFileReady(this.get('audioBlob')));\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"jIA7gtev\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasSupport\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"recording-icon \\\",[33,[\\\"if\\\"],[[28,[\\\"recording\\\"]],\\\"recording\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"recording\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"stop-recording\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"stopRecording\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-stop\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"start-recording\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"startRecording\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-record\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"audioSource\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"audio-player\\\"],null,[[\\\"source\\\",\\\"options\\\"],[[28,[\\\"audioSource\\\"]],[28,[\\\"playerOptions\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"audio-source-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"recording\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.recordingTime\\\"],[[\\\"time\\\"],[[33,[\\\"time-duration\\\"],null,[[\\\"startTime\\\"],[[28,[\\\"startTime\\\"]]]]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.noAudio\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"no-support\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.noSupport\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/audio-recorder/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['auth-loading']\n});\n","export default Ember.HTMLBars.template({\"id\":\"hjOUEo9q\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"logo-container\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"logo\\\"],[13],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"loading-body\\\"],[13],[0,\\\"\\\\n    \\\"],[9,\\\"gux-page-loading-spinner\\\",{\\\"attrs\\\":[],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/auth-loading/template.hbs\"}});","define(\"connections-ui/components/basic-dropdown\", [\"exports\", \"ember-basic-dropdown/components/basic-dropdown\"], function (_exports, _basicDropdown) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _basicDropdown.default;\n    }\n  });\n});\n","define(\"connections-ui/components/basic-dropdown/content-element\", [\"exports\", \"ember-basic-dropdown/components/basic-dropdown/content-element\"], function (_exports, _contentElement) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _contentElement.default;\n    }\n  });\n});\n","define(\"connections-ui/components/basic-dropdown/content\", [\"exports\", \"ember-basic-dropdown/components/basic-dropdown/content\"], function (_exports, _content) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _content.default;\n    }\n  });\n});\n","define(\"connections-ui/components/basic-dropdown/trigger\", [\"exports\", \"ember-basic-dropdown/components/basic-dropdown/trigger\"], function (_exports, _trigger) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _trigger.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['card-tree-entry'],\n    classNameBindings: ['hasChildren'],\n\n    intl: inject.service(),\n    permissions: inject.service(),\n\n    canViewChat: computed.reads('permissions.canViewBusinessChat'),\n    person: null,\n\n    isChild: false,\n    isSuperior: false,\n\n    expand: false,\n\n    actions: {\n        toggleExpand() {\n            if (!this.get('isSuperior')) {\n                this.toggleProperty('expand');\n            }\n        }\n    },\n\n    loading: computed('children.isPending', 'superiors.isPending', function () {\n        return this.get('children.isPending') && this.get('superiors.isPending');\n    }),\n\n    children: computed('person', function () {\n        const children = this.get('person.directReports') || [];\n        const promise = Ember.RSVP.resolve(children);\n        return DS.PromiseArray.create({ promise });\n    }),\n\n    superiors: computed('person', 'isChild', function () {\n        if (this.get('isChild')) {\n            return DS.PromiseArray.create({\n                promise: Ember.RSVP.resolve([])\n            });\n        }\n        const superiors = this.get('person.superiors');\n        const promise = superiors.then(people => {\n            const orderedPeople = [];\n\n            return new Ember.RSVP.Promise(resolve => {\n                function getNextPerson(person) {\n                    if (person && person.get('id')) {\n                        orderedPeople.push(person);\n                        const manager = person.getFieldValue('relationships.manager');\n                        if (!manager) {\n                            resolve(orderedPeople);\n                            return;\n                        }\n                        const nextPerson = people.find(p => {\n                            return p.get('id') === manager.guid;\n                        });\n\n                        if (!nextPerson) {\n                            resolve(orderedPeople);\n                            return;\n                        }\n                        return getNextPerson(nextPerson);\n                    }\n\n                    resolve(orderedPeople);\n                }\n                this.get('person.manager')\n                    .then(getNextPerson)\n                    .catch(() => resolve(people));\n            });\n        });\n        return DS.PromiseArray.create({ promise });\n    }),\n\n    hasChildren: computed.gt('children.content.length', 0),\n    hasSuperiors: computed.gt('superiors.content.length', 0),\n\n    directReportsLabel: computed('children.content.length', function () {\n        const intl = this.get('intl');\n        const directReports = this.get('children.content.length');\n        if (directReports > 1) {\n            return intl.lookup('components.cardTree.directReports', { directReports });\n        }\n        return intl.lookup('components.cardTree.directReport');\n    }),\n\n    showTotalReports: computed('person.totalReports.content', 'children.content.length', function () {\n        return this.get('person.totalReports.content') > this.get('children.content.length');\n    }),\n\n    totalReportsLabel: computed('person.totalReports.content', function () {\n        const intl = this.get('intl');\n        const totalReports = this.get('person.totalReports.content');\n        if (totalReports > 1) {\n            return intl.lookup('components.cardTree.totalReports', { totalReports });\n        }\n        return intl.lookup('components.cardTree.totalReport');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"7YOgXSV/\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"await\\\"],[[28,[\\\"hasSuperiors\\\"]]],null],[33,[\\\"not\\\"],[[28,[\\\"isChild\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"superiors\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"card-tree/card-tree-entry\\\"],null,[[\\\"person\\\",\\\"isSuperior\\\",\\\"expand\\\"],[[28,[\\\"superiors\\\",\\\"firstObject\\\"]],true,true]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"expander\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleExpand\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"hasChildren\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"expand\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-caret-down\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-caret-right\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"isLinkable\\\",\\\"entity\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\",\\\"enableMiniCard\\\",\\\"canViewChat\\\",\\\"size\\\"],[true,[28,[\\\"person\\\"]],true,true,true,[28,[\\\"canViewChat\\\"]],96]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"card.tree\\\",[28,[\\\"person\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[28,[\\\"person\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"person\\\",\\\"title\\\"]]],null,{\\\"statements\\\":[[0,\\\"                -\\\\n                \\\"],[1,[28,[\\\"person\\\",\\\"title\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasChildren\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"reports\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"directReportsLabel\\\"]],false],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"direct-reports\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showTotalReports\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        -\\\\n                        \\\"],[1,[26,[\\\"totalReportsLabel\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"children\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isSuperior\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"link\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"expand\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[33,[\\\"await\\\"],[[28,[\\\"children\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"card-tree/card-tree-entry\\\"],null,[[\\\"person\\\",\\\"isChild\\\"],[[28,[\\\"child\\\"]],true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"child\\\"]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/card-tree/card-tree-entry/template.hbs\"}});","import Ember from 'ember';\n\nconst { Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['card-tree-container', 'container-fluid'],\n\n    didInsertElement() {\n        this.attachTextInputListeners();\n    },\n\n    willDestroyElement() {\n        this.removeTextInputListeners();\n    },\n\n    attachTextInputListeners() {\n        const fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        fields.on('keydown', event => event.stopPropagation());\n    },\n\n    removeTextInputListeners() {\n        const fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        fields.off('keydown');\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"ZC/Un4EH\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row heading\\\"],[15,\\\"role\\\",\\\"banner\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"h3\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"components.navMenu.treeView\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"card.detail\\\",[28,[\\\"model\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"tooltip.person.cardView\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-card-view\\\"],[15,\\\"id\\\",\\\"card-view-icon\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[15,\\\"for\\\",\\\"card-view-icon\\\"],[15,\\\"placement\\\",\\\"bottom\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"tooltip.person.cardView\\\"],null],false]]}],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"role\\\",\\\"presentation\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-tree-view\\\"],[15,\\\"id\\\",\\\"tree-view-icon\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[15,\\\"for\\\",\\\"tree-view-icon\\\"],[15,\\\"placement\\\",\\\"bottom\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"tooltip.person.treeView\\\"],null],false]]}],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[15,\\\"role\\\",\\\"main\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"card-tree/card-tree-entry\\\"],null,[[\\\"person\\\",\\\"classNames\\\",\\\"expand\\\"],[[28,[\\\"model\\\"]],\\\"parent-entry\\\",true]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/card-tree/template.hbs\"}});","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport { eventToString, isNavigation } from 'connections-ui/utils/keystroke';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['card-detail-view'],\n\n    intl: inject.service(),\n    presenceSubscription: inject.service(),\n\n    entity: null,\n\n    canMove: true,\n\n    flipster: null,\n    currentPerson: null,\n    currentPersonId: computed.reads('currentPerson.id'),\n\n    selfAndSiblings: null,\n    currentPosition: 0,\n    reportTracker: {},\n\n    attrs: {\n        setCurrentPerson() {}\n    },\n\n    actions: {\n        moveToManager() {\n            const currentPersonManager = this.get('currentPerson.manager');\n            if (!currentPersonManager || !currentPersonManager.content) {\n                return;\n            }\n            currentPersonManager\n                .then(manager => {\n                    if (manager && manager.get) {\n                        var name = manager.get('name');\n                        var position = this.getPosition(this.get('currentPerson'));\n                        var tracker = this.get('reportTracker');\n\n                        if (tracker === null) {\n                            tracker = {};\n                        }\n                        tracker[name] = position;\n                        this.set('reportTracker', tracker);\n\n                        return this.setHierarchy(manager);\n                    }\n                })\n                .then(() => {\n                    this.set('didPeersLoad', true);\n\n                    Ember.run.scheduleOnce('afterRender', this, function () {\n                        this.makeCoverFlow();\n                    });\n                });\n        },\n\n        moveToReports(report) {\n            const currentPersonDirectReports = this.get('currentPerson.directReports');\n            if (!currentPersonDirectReports || !currentPersonDirectReports.content) {\n                return;\n            }\n            currentPersonDirectReports\n                .then(reports => {\n                    if (reports && !_.isEmpty(reports)) {\n                        var trackedReport = this.get('reportTracker')[this.get('currentPerson.name')];\n                        if (report) {\n                            return this.setHierarchy(report);\n                        } else if (trackedReport) {\n                            return this.setHierarchy(reports[trackedReport]);\n                        } else {\n                            return this.setHierarchy(reports[0]);\n                        }\n                    }\n                })\n                .then(() => {\n                    Ember.run.scheduleOnce('afterRender', this, function () {\n                        this.makeCoverFlow();\n                    });\n                });\n        },\n\n        setPerson(person) {\n            this.set('currentPerson', person);\n            this.attrs.setCurrentPerson(person);\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.attachTextInputListeners();\n        this.attachNavigationListener();\n    },\n\n    willClearRender() {\n        this._super(...arguments);\n        this.removeTextInputListeners();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.removeListeners();\n    },\n\n    allPeople: computed('entity', function () {\n        const entity = this.get('entity');\n        if (entity.id === this.get('currentPerson.id')) {\n            return { isFulfilled: true };\n        }\n        const promises = Ember.RSVP.all([\n            entity.get('directReports'),\n            entity.get('manager'),\n            entity.get('managerSiblings')\n        ]);\n        const promises2 = [this.setHierarchy(this.get('entity')), promises];\n        Ember.RSVP.all(promises2).then(() => {\n            Ember.run.scheduleOnce('afterRender', this, function () {\n                Ember.run.next(this, this.makeCoverFlow);\n            });\n        });\n        return DS.PromiseArray.create({\n            promise: promises\n        });\n    }),\n\n    haveScrolled: computed('currentPersonId', 'entity.id', function () {\n        return this.get('currentPersonId') === this.get('entity.id');\n    }),\n\n    peerCount: computed('currentPerson.selfAndSiblings.length', function () {\n        var count = this.get('currentPerson.selfAndSiblings.length') - 1;\n        if (count === -1) {\n            count = 0;\n        }\n        if (count === 1) {\n            return this.get('intl').lookup('person.relationships.peerCount.singular', {\n                count: count\n            });\n        } else {\n            return this.get('intl').lookup('person.relationships.peerCount.plural', {\n                count: count\n            });\n        }\n    }),\n\n    setHierarchy(person) {\n        this.set('didPeersLoad', false);\n\n        const promises = [person.get('selfAndSiblings'), person.get('directReports'), person.get('manager')];\n\n        return Ember.RSVP.all(promises).then(([siblings, directReports, manager]) => {\n            let selfAndSiblings = siblings;\n\n            if (_.isEmpty(siblings)) {\n                selfAndSiblings = [person];\n            }\n\n            if (_.isEmpty(directReports)) {\n                directReports = [];\n            }\n\n            this.set('currentPerson', person);\n            this.get('setCurrentPerson')(person);\n\n            this.set('currentPosition', this._getPosition(selfAndSiblings, person));\n            this.set('selfAndSiblings', selfAndSiblings);\n            this.set('didPeersLoad', true);\n\n            if (selfAndSiblings.length === 1 && directReports.length === 0 && _.isEmpty(manager)) {\n                this.set('canMove', false);\n            } else {\n                this.set('canMove', true);\n            }\n        });\n    },\n\n    makeCoverFlow() {\n        if (_.isEmpty(this.$('li')) || !this.$('.flipster')) {\n            return;\n        }\n\n        if (!_.isEmpty(this.$('.flipster__container'))) {\n            // if we already have flipster elements\n            this.$('.flip-content').contents().unwrap();\n        }\n\n        this.$('.flipster').removeClass('flipster--active');\n\n        const startPosition = this.get('currentPosition');\n\n        let flipster = this.$('.flipster').flipster({\n            itemContainer: 'ul',\n            itemSelector: 'li',\n            style: 'flat',\n            start: startPosition,\n            fadeIn: 0,\n            spacing: -0.3,\n            scrollwheel: false,\n            keyboard: false,\n            touch: false,\n            nav: false, // If true, flipster will insert an unordered list of the slides\n            buttons: false, // If true, flipster will insert Previous / Next buttons\n            onItemSwitch: function (to /*, from*/) {\n                Ember.run.debounce(this, this.changeCurrentPerson, to, 300);\n            }.bind(this)\n        });\n\n        this.set('flipster', flipster);\n    },\n\n    changeCurrentPerson(toElem) {\n        Ember.run.scheduleOnce('afterRender', () => {\n            const card = Ember.$(toElem).find('.card');\n            const entityId = card.data('entity-id');\n\n            if (entityId) {\n                const entity = this.get('selfAndSiblings').findBy('id', entityId);\n                this.set('currentPerson', entity);\n                this.attrs.setCurrentPerson(entity);\n            }\n        });\n    },\n\n    _getPosition(selfAndSiblings, person) {\n        if (_.isEmpty(selfAndSiblings)) {\n            return 0;\n        }\n        for (var position = 0; position < selfAndSiblings.length; position++) {\n            if (selfAndSiblings[position].get('id') === person.get('id')) {\n                return position;\n            }\n        }\n    },\n\n    getPosition(person) {\n        return this._getPosition(this.get('selfAndSiblings'), person);\n    },\n\n    attachNavigationListener() {\n        const event = `keydown.${this.elementId}`;\n        Ember.$(document).on(event, event => Ember.run(() => this.onKeyDownHandler(event)));\n    },\n\n    attachTextInputListeners() {\n        var ns = '.' + this.get('elementId');\n        var fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        fields.on('keydown' + ns, event => {\n            Ember.run(() => {\n                var key = eventToString(event);\n                if (key === 'DOWN_ARROW' || key === 'UP_ARROW' || key === 'RIGHT_ARROW' || key === 'LEFT_ARROW') {\n                    if (key === 'LEFT_ARROW' || key === 'RIGHT_ARROW') {\n                        event.stopPropagation();\n                    }\n                }\n            });\n        });\n        fields\n            .on('focus' + ns, () => {\n                Ember.run(() => this.set('canMove', false));\n            })\n            .on('focusout' + ns, () => {\n                Ember.run(() => this.set('canMove', true));\n            });\n    },\n\n    removeTextInputListeners() {\n        var ns = '.' + this.get('elementId');\n        var fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        fields.off(ns);\n        Ember.$(document).off(ns);\n        Ember.$(window).off('.flipster');\n    },\n\n    removeListeners() {\n        const ns = `.${this.elementId}`;\n        Ember.$(document).off(ns);\n        Ember.$(window).off(ns);\n        Ember.$(window).off('.flipster');\n    },\n\n    onKeyDownHandler(event) {\n        const key = eventToString(event);\n\n        if (Ember.$(event.target).is('textarea')) {\n            return;\n        }\n\n        if (isNavigation(event) && this.get('canMove')) {\n            if (key === 'LEFT_ARROW') {\n                this.get('flipster').flipster('prev');\n            } else if (key === 'RIGHT_ARROW') {\n                if (this.$('.flipster > ul > li:not(.empty)').length > 1) {\n                    this.get('flipster').flipster('next');\n                }\n            } else if (key === 'UP_ARROW') {\n                this.send('moveToManager');\n            } else if (key === 'DOWN_ARROW') {\n                this.send('moveToReports');\n            }\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"zKRAcuTd\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"allPeople\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"manager-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"manager \\\",[33,[\\\"unless\\\"],[[28,[\\\"currentPerson\\\",\\\"manager\\\",\\\"id\\\"]],\\\"hidden\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"mini-card\\\"],null,[[\\\"entity\\\",\\\"currentPerson\\\",\\\"managerCount\\\",\\\"action\\\"],[[28,[\\\"currentPerson\\\",\\\"manager\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"currentPerson\\\",\\\"manager\\\",\\\"siblings\\\",\\\"length\\\"]],\\\"moveToManager\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"cards \\\",[33,[\\\"unless\\\"],[[28,[\\\"currentPerson\\\",\\\"manager\\\",\\\"content\\\",\\\"id\\\"]],\\\"no-manager\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"arrow arrow-up \\\",[33,[\\\"unless\\\"],[[28,[\\\"currentPerson\\\",\\\"manager\\\",\\\"content\\\",\\\"id\\\"]],\\\"hidden\\\"],null]]]],[13],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"peer-count\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"peerCount\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"flipster-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"didPeersLoad\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"flipster\\\"],[15,\\\"id\\\",\\\"flipster\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"flip-items\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"selfAndSiblings\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"li\\\",[]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"person-card\\\"],null,[[\\\"entity\\\",\\\"setPerson\\\",\\\"actionOpenChatRoom\\\",\\\"actionOpenVideoCall\\\"],[[28,[\\\"person\\\"]],\\\"setPerson\\\",[33,[\\\"route-action\\\"],[\\\"openChatRoom\\\"],null],[33,[\\\"route-action\\\"],[\\\"openChatRoomWithVideo\\\"],null]]]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"person\\\"]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"selfAndSiblings\\\",\\\"length\\\"]],1],null]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"empty\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"arrow arrow-down \\\",[33,[\\\"unless\\\"],[[28,[\\\"currentPerson\\\",\\\"directReports\\\",\\\"content\\\"]],\\\"hidden\\\"],null]]]],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"reports-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"currentPerson\\\",\\\"directReports\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"reports\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"currentPerson\\\",\\\"directReports\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"mini-card\\\"],null,[[\\\"entity\\\",\\\"currentPerson\\\",\\\"action\\\"],[[28,[\\\"report\\\"]],[28,[\\\"entity\\\"]],\\\"moveToReports\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"report\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"loading\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/card-view/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    tagName: 'p',\n    classNames: ['character-counter', 'small', 'help-block'],\n\n    intl: Ember.inject.service(),\n\n    model: null,\n    maxCount: 0,\n\n    charactersUsed: Ember.computed('model.length', function () {\n        const length = this.get('model.length') || 0;\n        if (length > 1) {\n            return this.get('intl').lookup('components.navMenu.feedback.charactersUsed', {\n                characterCount: length,\n                maxCount: this.get('maxCount')\n            });\n        }\n        return '';\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"C6bOpZUm\",\"block\":\"{\\\"statements\\\":[[1,[26,[\\\"charactersUsed\\\"]],true]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/characters-used/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['chat-settings'],\n\n    activeRoom: null,\n\n    chat: Ember.inject.service(),\n\n    check: Ember.computed('activeRoom.jid', 'chat.mutedRooms.[]', function () {\n        const activeJid = this.get('activeRoom.jid');\n        const muted = this.get('chat.mutedRooms');\n\n        return activeJid && muted && muted.any(jid => jid === activeJid);\n    }),\n\n    actions: {\n        toggleRoomMute() {\n            const roomJid = this.get('activeRoom.jid');\n            if (roomJid) {\n                const areNotificationsDisabled = this.toggleProperty('check');\n                this.get('chat').setRoomMuted(roomJid, areNotificationsDisabled);\n            }\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"yvV8FFZW\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"settings-drop-down\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"notifications-description\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"chat.notificationSettings\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"check\\\"]],\\\"toggleRoomMute\\\"]]],false],[0,\\\"\\\\n    \\\"],[11,\\\"small\\\",[]],[15,\\\"class\\\",\\\"text-muted\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"chat.notificationSettingsHelpText\\\"],null],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"small\\\",[]],[15,\\\"class\\\",\\\"text-muted mention-notifications\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"chat.notificationSettingsHelpTextMentions\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/chat-settings/template.hbs\"}});","import ClickOutsideComponent from 'ember-click-outside/components/click-outside';\nexport default ClickOutsideComponent;\n","import Ember from 'ember';\nconst { Component, computed, inject } = Ember;\n\nexport default Component.extend({\n    classNameBindings: [':create-entity-menu', 'showMenu::hidden'],\n\n    application: inject.service(),\n    permissions: inject.service(),\n    showCreateGroup: false,\n\n    canInvitePeople: computed.reads('permissions.canInvitePeople'),\n    canCreateGroups: computed.reads('permissions.canCreateGroups'),\n\n    canCreateLocations: computed(() => false),\n\n    showMenu: computed.or('canInvitePeople', 'canCreateGroups', 'canCreateLocations'),\n\n    adminModalSrc: '/admin/#/directory/people/add',\n\n    actions: {\n        launchCreateGroup() {\n            this.set('showCreateGroup', true);\n        },\n\n        cancelCreateGroup() {\n            this.set('showCreateGroup', false);\n        },\n        showAdminModal() {\n            this.set('showAdminModal', true);\n        },\n\n        closeAdminModal() {\n            this.set('showAdminModal', false);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"RKMKfJrK\",\"block\":\"{\\\"statements\\\":[[6,[\\\"drop-down\\\"],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[28,[\\\"showDropdown\\\"]],\\\"create-entity-menu\\\"]],{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link menu-selector\\\"],[15,\\\"data-toggle\\\",\\\"tooltip\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.newEntity.title\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-add-call\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"show\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canInvitePeople\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"menu-item create-person\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-link\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showAdminModal\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"search.filter.newEntity.person\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canCreateGroups\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"menu-item create-group\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"launchCreateGroup\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"search.filter.newEntity.group\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canCreateLocations\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"menu-item create-location\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"search.filter.newEntity.location\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showCreateGroup\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"headerText\\\",\\\"confirmText\\\",\\\"cancel\\\"],[[33,[\\\"t\\\"],[\\\"groups.admin.newGroup\\\"],null],[33,[\\\"t\\\"],[\\\"common.create\\\"],null],\\\"cancelCreateGroup\\\"]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"new-group\\\"],null,[[\\\"confirm\\\",\\\"cancel\\\",\\\"disable\\\",\\\"setAttribute\\\"],[[28,[\\\"confirmAction\\\"]],\\\"cancelCreateGroup\\\",[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"disableAction\\\"]]],null],[28,[\\\"setAttribute\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"confirmAction\\\",\\\"_\\\",\\\"disableAction\\\",\\\"setAttribute\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showAdminModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"cancel\\\",\\\"showFooter\\\",\\\"showHeader\\\"],[\\\"closeAdminModal\\\",false,false]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"admin-ui-modal\\\"],null,[[\\\"closeAdminModal\\\",\\\"src\\\"],[\\\"closeAdminModal\\\",[28,[\\\"adminModalSrc\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/create-entity-menu/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from '../../utils/dates';\n\nvar minViewMode = {\n    days: 0,\n    months: 1,\n    years: 2\n};\n\nexport default Ember.Component.extend({\n    classNames: ['date-picker'],\n    label: null,\n    srOnly: false,\n\n    intl: Ember.inject.service(),\n\n    entity: null,\n    // now takes moment.js format\n    value: null,\n\n    placeholder: null,\n\n    minDate: null,\n    maxDate: null,\n\n    inputMode: false,\n\n    format: null,\n    minView: 'days', //months\n\n    isoLocale: Ember.computed.reads('intl.isoLocale'),\n\n    /**\n     * Some dates need to be displayed as just Month and Year.\n     * The ordering and separator depends on user's locale (e.g., Japanese (ja) should display YYYY/M and German (de) would prefer M.YYYY)\n     * Moment does not provide an api to do this.\n     */\n    monthYearLocaleFormat: Ember.computed('value', function () {\n        moment.locale(this.get('isoLocale'));\n        let now = moment();\n        let localeFormat = now.creationData().locale.longDateFormat('L');\n        const regex = /DD\\W|\\WDD/g;\n        localeFormat = localeFormat.replace(regex, '');\n        return localeFormat.replace(/MM/, 'M');\n    }),\n\n    // Used to populate the bootstrap datepicker in setupDatepicker below.\n    datepickerValue: Ember.computed('value', function () {\n        let monthYearLocaleFormat = 'L';\n        if (this.get('format') === 'monthYear') {\n            monthYearLocaleFormat = this.get('monthYearLocaleFormat');\n        }\n\n        let value = this.get('value');\n        let dateObject = moment();\n        if (!_.isEmpty(value)) {\n            const year = Ember.get(value, 'year');\n            const month = Ember.get(value, 'month') - 1;\n            const day = Ember.get(value, 'day');\n\n            // We don't chain calls in case year or month is empty/null\n            dateObject.year(year);\n            dateObject.month(month);\n            dateObject.date(day);\n        }\n\n        if (_.isEmpty(this.get('value'))) {\n            return '';\n        }\n\n        var view = this.get('minView');\n        if (view === 'months') {\n            return dateObject.format(monthYearLocaleFormat);\n        }\n        return dateObject.format(monthYearLocaleFormat);\n    }),\n\n    initDatepicker: Ember.on('didInsertElement', function () {\n        Ember.run.scheduleOnce('afterRender', this, 'setupDatepicker');\n    }),\n\n    removeBehavior: Ember.on('willDestroyElement', function () {\n        this.$('.datepicker').datepicker('remove');\n    }),\n\n    didUpdateAttrs(changes) {\n        this._super(...arguments);\n\n        if (changes.newAttrs.entity.value !== changes.oldAttrs.entity.value) {\n            this.$('.datepicker').datepicker('update', this.get('datepickerValue'));\n        }\n    },\n\n    // This is called when editing the field. It initializes the bootstrap datepicker and passes in the values from the datepickerValue computed.\n    setupDatepicker() {\n        if (!this.get('inputMode')) {\n            return;\n        }\n\n        // lowercase because bootstrap datepicker expects mm instead of MM\n        let format = this.get('format') || moment.localeData()._longDateFormat.L.toLowerCase();\n        // if the format is monthYear then get the localized format and pass that to the datepicker\n        let monthYearLocaleFormat = format === 'monthYear' ? this.get('monthYearLocaleFormat').toLowerCase() : format;\n\n        let minView = Ember.get(minViewMode, this.get('minView'));\n\n        const language = this.get('intl.isoRegionalLocale');\n\n        let options = {\n            orientation: 'left bottom',\n            format: monthYearLocaleFormat,\n            minViewMode: minView,\n            todayHighlight: true,\n            clearBtn: true,\n            language: language,\n            container: `#${this.get('elementId')}`\n        };\n\n        let minDate = this.get('minDate');\n        if (minDate) {\n            options = Object.assign({}, options, {\n                startDate: moment(minDate).toDate()\n            });\n        }\n\n        let maxDate = this.get('maxDate');\n        if (maxDate) {\n            options = Object.assign({}, options, {\n                endDate: moment(maxDate).toDate()\n            });\n        }\n\n        // Some bootstrapper-datepicker languages do not include a\n        // translation for the \"Clear\" button\n        let dates = $.fn.datepicker.dates;\n        if (dates[language] && !dates[language].clear) {\n            const selectedLanguage = this.get('intl.isoLocale');\n            if (selectedLanguage == language) {\n                dates[language].clear = this.get('intl').t('common.clear');\n            }\n        }\n\n        // bootstrap datepicker is setup with datePickerValue from above.\n        this.$('.datepicker')\n            .datepicker(options)\n            .on('changeDate', event => {\n                Ember.run(() => this.setData(event));\n            })\n            .on('clearDate', event => {\n                Ember.run(() => this.setData(event));\n            })\n            .on('hide', event => {\n                Ember.run(() => this.setData(event));\n            })\n            .on('show', () => {\n                Ember.run(() => {\n                    let classNames = this.get('classNames');\n                    let datepicker = this.$('.datepicker').data('datepicker');\n                    if (datepicker && datepicker.picker) {\n                        datepicker.picker.addClass(classNames.join(' '));\n                    }\n                });\n            })\n            .datepicker('update', this.get('datepickerValue'));\n\n        if (_.isEmpty(this.get('value')) || (!this.get('value.month') && !this.get('value.year'))) {\n            this.$('input').val('');\n        }\n    },\n\n    setData(event) {\n        let date;\n        let str = this.$('input').val();\n        moment.locale(this.get('intl.isoLocale'));\n        if (event.date && !_.isEmpty(str)) {\n            date = moment(event.date);\n        } else {\n            date = moment(str);\n\n            if (_.isEmpty(str) || isNaN(date.valueOf())) {\n                return this.clearValue();\n            }\n        }\n\n        let value = {};\n\n        let view = this.get('minView');\n\n        let day = date.date();\n        let month = date.month() + 1;\n        let year = date.year();\n\n        if (view === 'days') {\n            Ember.set(value, 'day', day);\n            Ember.set(value, 'month', month);\n        } else if (view === 'months') {\n            Ember.set(value, 'month', month);\n        }\n\n        Ember.set(value, 'year', year);\n\n        this.set('value', value);\n    },\n\n    clearValue() {\n        if (_.isEmpty(this.get('value'))) {\n            return;\n        }\n\n        if (this.get('outOfOffice')) {\n            // TODO: remove check for outOfOffice feature toggle when on in all environments\n            this.set('value', null);\n        } else {\n            this.set('value.day', null);\n            this.set('value.month', null);\n            this.set('value.year', null);\n        }\n    },\n\n    _placeholder: Ember.computed('placeholder', function () {\n        var placeholder = this.get('placeholder');\n        if (placeholder) {\n            return this.get('intl').lookup(placeholder, null, true).toString();\n        }\n        return '';\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"jFHiomMY\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"label\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"label\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"srOnly\\\"]],\\\"sr-only\\\"],null]]]],[16,\\\"for\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-date-picker\\\"],null]]]],[13],[1,[33,[\\\"t\\\"],[[28,[\\\"label\\\"]]],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"inputMode\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-date-picker\\\"],null]]]],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"class\\\",[34,[\\\"form-control datepicker \\\",[33,[\\\"if\\\"],[[28,[\\\"error\\\"]],\\\"validation-error\\\"],null]]]],[16,\\\"placeholder\\\",[26,[\\\"_placeholder\\\"]],null],[16,\\\"disabled\\\",[26,[\\\"disabled\\\"]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-date-picker\\\"],null]]]],[15,\\\"class\\\",\\\"datepicker\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/date-picker/template.hbs\"}});","define(\"connections-ui/components/desktop-notification/component\", [\"exports\", \"ember-purecloud-components/components/desktop-notification/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import DocumentTitle from \"ember-document-title/components/document-title\";\n\nexport default DocumentTitle;\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['draggable-dropzone', 'clear'],\n    classNameBindings: ['dragClass'],\n    dragClass: 'deactivated',\n    data: null,\n\n    dragLeave(event) {\n        event.preventDefault();\n        this.set('dragClass', 'deactivated');\n    },\n\n    dragOver(event) {\n        event.preventDefault();\n        this.set('dragClass', 'activated');\n    },\n\n    drop(event) {\n        this.set('dragClass', 'deactivated');\n        this.sendAction('dropped', event);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"22Vbwxkd\",\"block\":\"{\\\"statements\\\":[[18,\\\"default\\\"]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/drag-drop-container/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['draggable-item'],\n    attributeBindings: ['draggable', 'ariaLabel'],\n    ariaLabel: Ember.computed(function () {\n        return this.get('intl').lookup('components.inbox.actions.selectCall');\n    }),\n    draggable: 'true',\n    dataType: 'text',\n\n    data: null,\n\n    intl: Ember.inject.service(),\n\n    dragStart(event) {\n        event.dataTransfer.setData(this.get('dataType'), this.get('data'));\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"KQqsaW/F\",\"block\":\"{\\\"statements\\\":[[18,\\\"default\\\"]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/drag-drop-item/template.hbs\"}});","define(\"connections-ui/components/drop-down/component\", [\"exports\", \"ember-purecloud-components/components/drop-down/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['dropdown-menu-view'],\n\n    showMenu: false,\n\n    actions: {\n        toggleMenu() {\n            this.toggleProperty('showMenu');\n        },\n        handleKeyDown(e) {\n            if (e.code === 'Escape' || e.code === 'Enter') {\n                this.set('showMenu', false);\n            }\n        }\n    },\n\n    didInsertElement() {\n        const id = this.get('elementId');\n        Ember.$(window).on(`click.${id}`, event => {\n            Ember.run(() => {\n                const target = $(event.target);\n                const parents = target.parents('.dropdown-menu-view');\n                const targetOutside = !parents.length || id !== parents.attr('id');\n                const targetInput = target.parent('.input').length;\n                const listItem = target.prop('tagName') === 'LI';\n                if (targetOutside || targetInput || listItem) {\n                    this.set('showMenu', false);\n                }\n            });\n        });\n    },\n\n    willDestroyElement() {\n        Ember.$(window).off(`.${this.get('elementId')}`);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"qyhLFnOs\",\"block\":\"{\\\"statements\\\":[[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-purecloud\\\"],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"handleKeyDown\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleMenu\\\"],null]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[13],[1,[26,[\\\"title\\\"]],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-arrow-down-b\\\"],[13],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu list-unstyled \\\",[33,[\\\"if\\\"],[[28,[\\\"showMenu\\\"]],\\\"show\\\"],null]]]],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"handleKeyDown\\\"],null],null],[13],[0,\\\"\\\\n    \\\"],[18,\\\"default\\\"],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/dropdown-menu/template.hbs\"}});","define(\"connections-ui/components/duration-format/component\", [\"exports\", \"ember-purecloud-components/components/duration-format/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default Ember.Component.extend({\n    classNames: ['edit-profile-picture'],\n\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    store: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n\n    entity: null,\n    editing: false,\n    canUploadPicture: true,\n    canEditProfilePicture: true,\n    canEditInformalPicture: true,\n    canEditAgentImage: false,\n\n    showingProfile: true,\n    showingInformal: false,\n\n    openCaption: null,\n    currentInformal: null,\n\n    attrs: {\n        upload() {},\n        select() {},\n        delete() {},\n        changeType() {}\n    },\n\n    actions: {\n        showInformalPhotos: function () {\n            this.set('showingProfile', false);\n            this.set('showingInformal', true);\n            this.set('showingAgent', false);\n\n            this.get('changeType')('informal');\n        },\n\n        showProfilePictures: function () {\n            this.set('showingProfile', true);\n            this.set('showingInformal', false);\n            this.set('showingAgent', false);\n\n            this.get('changeType')('profile');\n        },\n\n        showAgentPhotos() {\n            this.set('showingProfile', false);\n            this.set('showingInformal', false);\n            this.set('showingAgent', true);\n\n            this.get('changeType')('agent');\n        },\n\n        uploadImage(type) {\n            this.get('upload')(type);\n        },\n\n        selectUploadedImage(type, image, active) {\n            this.get('select')(type, image, active);\n        },\n\n        deleteUploadedImage(type, image, active) {\n            this.get('delete')(type, image, active);\n        },\n\n        removeAgentImage() {\n            const entity = this.get('entity');\n\n            if (this.get('entity.type') === 'person') {\n                const userId = entity.id;\n                const imageId = this.get('entity.agent.profileImage.firstObject._id');\n                if (!imageId) return;\n\n                this.get('ajax')\n                    .delete(Ember.get(this, 'application').pcV2Uri(`api/v2/users/${userId}/images/${imageId}`))\n                    .then(() => {\n                        this.get('store')\n                            .findRecord('person', userId)\n                            .then(() => {\n                                entity.set('agent.profileImage', [], { overwrite: true });\n                            });\n                    })\n                    .catch(err => {\n                        const intl = this.get('intl');\n                        this.logger.error('failed to upload image', { error: err });\n                        this.get('notification').error(\n                            intl.lookup('notification.titles.profileSaveError').toString(),\n                            intl.lookup('notification.fieldSection.error').toString(),\n                            {\n                                forceBrowserNotification: true,\n                                tag: 'image-upload'\n                            }\n                        );\n                        return;\n                    });\n            } else {\n                entity.set('agent.profileImage', [], { overwrite: true });\n                let section = entity.get('fieldConfig.agent');\n                entity.saveSection(section);\n            }\n        }\n    },\n\n    scrollActiveImageIntoView: Ember.on('didInsertElement', function () {\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            var activeImg = this.$('img.active'),\n                picturesContainer = this.$('.pictures');\n            if (activeImg.length > 0 && picturesContainer.length > 0) {\n                var target = activeImg[0],\n                    parent = picturesContainer[0];\n\n                parent.scrollTop = target.parentNode.offsetTop;\n            }\n        });\n    }),\n\n    setupTabListeners: Ember.on('didInsertElement', function () {\n        const component = this;\n\n        // Listen for guxactivetabchange event on gux-tabs element\n        this.$('gux-tabs').on('guxactivetabchange', function (event) {\n            Ember.run(function () {\n                const tabId = event.originalEvent.detail;\n\n                if (tabId === 'informal') {\n                    component.send('showInformalPhotos');\n                } else if (tabId === 'profile') {\n                    component.send('showProfilePictures');\n                } else if (tabId === 'agent') {\n                    component.send('showAgentPhotos');\n                }\n                // Set focus on the active tab\n                Ember.run.later(\n                    component,\n                    function () {\n                        const activeTab = component.$('.gux-tab.gux-active')[0];\n                        if (activeTab && activeTab.offsetParent !== null) {\n                            // Blur any currently focused element (likely the close button)\n                            if (document.activeElement) {\n                                document.activeElement.blur();\n                            }\n                            // Focus the active tab\n                            activeTab.focus();\n                        }\n                    },\n                    50\n                );\n            });\n        });\n    }),\n\n    teardownTabListeners: Ember.on('willDestroyElement', function () {\n        this.$('gux-tabs').off('guxactivetabchange');\n    }),\n\n    emptyProfilesText: Ember.computed('entity.type', 'application.session.person.id', 'entity.id', function () {\n        var lookup = 'images.upload.yourEmptyProfile';\n        if (this.get('entity.type') === 'group') {\n            lookup = 'images.upload.groupsEmptyProfile';\n        } else if (this.get('application.session.person.id') !== this.get('entity.id')) {\n            lookup = 'images.upload.othersEmptyProfile';\n        }\n        return this.get('intl').lookup(lookup);\n    }),\n\n    emptyInformalsText: Ember.computed('entity.type', 'application.session.person.id', 'entity.id', function () {\n        var lookup = 'images.upload.yourEmptyInformal';\n        if (this.get('entity.type') === 'group') {\n            lookup = 'images.upload.groupsEmptyInformal';\n        } else if (this.get('application.session.person.id') !== this.get('entity.id')) {\n            lookup = 'images.upload.othersEmptyInformal';\n        }\n        return this.get('intl').lookup(lookup);\n    }),\n\n    profileInstructionText: Ember.computed(function () {\n        if (this.get('intl').query('person_images_profile_instructionText')) {\n            return this.get('intl').lookup('person_images_profile_instructionText').toString();\n        }\n        return '';\n    }),\n\n    informalInstructionText: Ember.computed(function () {\n        if (this.get('intl').query('person_images_informal_instructionText')) {\n            return this.get('intl').lookup('person_images_informal_instructionText').toString();\n        }\n        return '';\n    }),\n\n    agentImage: Ember.computed('entity.agent.profileImage.@each.value', function () {\n        let image = this.get('entity').getFieldValue('agent.profileImage');\n        if (_.isEmpty(image) || _.isEmpty(image.value)) {\n            return null;\n        }\n\n        return image.value.x200 || image.value.x800 || image.value.x1024;\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"O7zPMaH7\",\"block\":\"{\\\"statements\\\":[[9,\\\"gux-tabs\\\",{\\\"attrs\\\":[[16,\\\"active-tab\\\",[26,[\\\"changeType\\\"]],null],[15,\\\"guxactivetabchange\\\",\\\"imageSelectTypeSwitchChange($event)\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-tab-list\\\",{\\\"attrs\\\":[[15,\\\"slot\\\",\\\"tab-list\\\"],[15,\\\"class\\\",\\\"nav\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[9,\\\"gux-tab\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"profile\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"profile-picture-tab\\\"],[16,\\\"class\\\",[34,[\\\"profile-picture-tab \\\",[33,[\\\"if\\\"],[[28,[\\\"showingProfile\\\"]],\\\"active\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"person.extendedProfile.imageCollections.uploads_images\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"]]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditInformalPicture\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"gux-tab\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"informal\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"informal-picture-tab\\\"],[16,\\\"class\\\",[34,[\\\"informal-picture-tab \\\",[33,[\\\"if\\\"],[[28,[\\\"showingInformal\\\"]],\\\"active\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"person.extendedProfile.imageCollections.images_informal\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"canEditAgentImage\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"gux-tab\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"agent\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"agent-picture-tab\\\"],[16,\\\"class\\\",[34,[\\\"agent-picture-tab \\\",[33,[\\\"if\\\"],[[28,[\\\"showingAgent\\\"]],\\\"active\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"person.extendedProfile.imageCollections.agent_profileImage\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[9,\\\"gux-tab-panel\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"profile\\\"],[15,\\\"class\\\",\\\"picture-panel\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"pictures-content\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current current-profile-picture\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\"],[[28,[\\\"entity\\\"]],400]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"canUploadPicture\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-default upload-picture-button upload-picture-profile\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"uploadImage\\\",\\\"profile\\\"]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"images.newImageBtn\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"pictures\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditProfilePicture\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"h4\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"images.selectImage\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"canUploadPicture\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"instructionText\\\"],[13],[1,[26,[\\\"profileInstructionText\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"each\\\"],[[28,[\\\"entity\\\",\\\"uploadedProfilePictures\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"uploaded-image\\\"],null,[[\\\"entity\\\",\\\"image\\\",\\\"size\\\",\\\"editing\\\",\\\"canEdit\\\",\\\"select\\\",\\\"delete\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"image\\\"]],96,[28,[\\\"editing\\\"]],[28,[\\\"canEditProfilePicture\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"selectUploadedImage\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"deleteUploadedImage\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"image\\\"]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"canUploadPicture\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[26,[\\\"emptyProfilesText\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]]}],[0,\\\"\\\\n    \\\"],[9,\\\"gux-tab-panel\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"informal\\\"],[15,\\\"class\\\",\\\"picture-panel\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"pictures-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"instruction-text\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"informalInstructionText\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditInformalPicture\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"informal-button\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-default upload-picture-button upload-picture-informal\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"uploadImage\\\",\\\"informal\\\"]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"images.uploadBtn\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"pictures informal \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null],\\\" \\\",[33,[\\\"unless\\\"],[[28,[\\\"editing\\\"]],\\\"center\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"entity\\\",\\\"uploadedInformalPhotos\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"uploaded-image\\\"],null,[[\\\"entity\\\",\\\"image\\\",\\\"size\\\",\\\"type\\\",\\\"editing\\\",\\\"canEdit\\\",\\\"showingInformal\\\",\\\"delete\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"image\\\"]],150,\\\"informal\\\",[28,[\\\"editing\\\"]],[28,[\\\"canEditInformalPicture\\\"]],true,[33,[\\\"action\\\"],[[28,[null]],\\\"deleteUploadedImage\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"image\\\"]},{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[26,[\\\"emptyInformalsText\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]]}],[0,\\\"\\\\n    \\\"],[9,\\\"gux-tab-panel\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"agent\\\"],[15,\\\"class\\\",\\\"picture-panel\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditAgentImage\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"pictures-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditAgentImage\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current agent-image current-agent-picture\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"agentImage\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-image\\\"],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[33,[\\\"t\\\"],[\\\"images.userSubmitted\\\"],null],null],[15,\\\"class\\\",\\\"full-width-image\\\"],[16,\\\"src\\\",[34,[[26,[\\\"agentImage\\\"]]]]],[13],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"agent-buttons\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-default upload-picture upload-picture-agent\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"uploadImage\\\",\\\"agent\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"images.uploadBtn\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"agentImage\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-danger remove-picture-agent\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"removeAgentImage\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"images.deleteImage\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"]]}],[0,\\\"\\\\n\\\"]]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/edit-profile-picture/template.hbs\"}});","define(\"connections-ui/components/ember-modal-dialog-positioned-container\", [\"exports\", \"ember-modal-dialog/components/positioned-container\"], function (_exports, _positionedContainer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _positionedContainer.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-modal-dialog/-basic-dialog\", [\"exports\", \"ember-modal-dialog/components/basic-dialog\"], function (_exports, _basicDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _basicDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-modal-dialog/-in-place-dialog\", [\"exports\", \"ember-modal-dialog/components/in-place-dialog\"], function (_exports, _inPlaceDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _inPlaceDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-modal-dialog/-liquid-dialog\", [\"exports\", \"ember-modal-dialog/components/liquid-dialog\"], function (_exports, _liquidDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _liquidDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-modal-dialog/-liquid-tether-dialog\", [\"exports\", \"ember-modal-dialog/components/liquid-tether-dialog\"], function (_exports, _liquidTetherDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _liquidTetherDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-modal-dialog/-tether-dialog\", [\"exports\", \"ember-modal-dialog/components/tether-dialog\"], function (_exports, _tetherDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tetherDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-tether\", [\"exports\", \"ember-tether/components/ember-tether\"], function (_exports, _emberTether) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberTether.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-wormhole\", [\"exports\", \"ember-wormhole/components/ember-wormhole\"], function (_exports, _emberWormhole) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberWormhole.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { task, waitForQueue } from 'ember-concurrency';\nimport cloneDeep from 'lodash/cloneDeep';\n\nconst { computed } = Ember;\n\nconst COUNTRY_OPTIONS = [\n    {\n        displayName: 'emergencyLocation.country.usa',\n        value: 'US'\n    },\n    {\n        displayName: 'emergencyLocation.country.canada',\n        value: 'CA'\n    }\n];\n\nexport default Ember.Component.extend({\n    classNames: ['emergency-location'],\n    classNameBindings: ['saving:saving-emergency-location'],\n    intl: Ember.inject.service(),\n\n    editingElocation: false,\n    eLocation: computed.reads('emergencyLocationData.eLocation'),\n    showTitle: false,\n    showResetButton: false,\n    showTitleIcons: true,\n    showTitleInEditMode: true,\n    personId: null,\n    primaryVoice: computed.reads('emergencyLocationData.primaryVoice'),\n    saving: false,\n    countryOptions: Ember.A([]),\n\n    street1: computed.reads('updatedAddress.street1'),\n    street2: computed.reads('updatedAddress.street2'),\n    city: computed.reads('updatedAddress.city'),\n    state: computed.reads('updatedAddress.state'),\n    zipcode: computed.reads('updatedAddress.zipcode'),\n    country: computed('updatedAddress.country', 'countryOptions.[]', function () {\n        return this.get('updatedAddress.country') || '';\n    }),\n\n    street1ReadOnly: computed.reads('eLocation.address.street1'),\n    street2ReadOnly: computed.reads('eLocation.address.street2'),\n    cityReadOnly: computed.reads('eLocation.address.city'),\n    stateReadOnly: computed.reads('eLocation.address.state'),\n    zipcodeReadOnly: computed.reads('eLocation.address.zipcode'),\n    countryReadOnly: computed.reads('eLocation.address.country'),\n\n    isAddressEmpty(address) {\n        if (!address) {\n            return true;\n        }\n        return (\n            !Ember.get(address, 'street1') ||\n            !Ember.get(address, 'city') ||\n            !Ember.get(address, 'zipcode') ||\n            !Ember.get(address, 'country')\n        );\n    },\n\n    isEmpty: computed('eLocation.address.{street1,street2,city,zipcode,country}', function () {\n        return this.isAddressEmpty(this.get('eLocation.address'));\n    }),\n\n    showNumberInTitle: computed.notEmpty('primaryVoice.number'),\n\n    // updatedAddess is used to bind to input values while in edit mode\n    // it is initialized with either eLocationAddress or previewAddress\n    // and is updated by user typed in values while in edit mode.\n    // This is the object that is used when saving the address to the endpoint\n    // This should not be passed down by parent component\n    updatedAddress: {\n        street1: '',\n        street2: '',\n        city: '',\n        state: '',\n        zipcode: '',\n        country: ''\n    },\n\n    // previewAddress contains the address that is passed down by the parent component\n    // This address is copied over to the updatedAddress to be seen in the address form.\n    previewAddress: {\n        street1: '',\n        street2: '',\n        city: '',\n        state: '',\n        zipcode: '',\n        country: ''\n    },\n\n    previewAddressIsEligible: true,\n    previewAddressError: '',\n\n    toolTipArrowId: computed('elementId', function () {\n        return `arrow-id-${this.get('elementId')}`;\n    }),\n\n    toolTipHelpId: computed('elementId', function () {\n        return `help-id-${this.get('elementId')}`;\n    }),\n\n    toolTipAlertInfoId: computed('elementId', function () {\n        return `alert-info-id-${this.get('elementId')}`;\n    }),\n\n    isEligibleForE911: computed.reads('emergencyLocationData.isEligibleForE911'),\n    eLocationInlineWarning: computed.reads('emergencyLocationData.eLocationInlineWarning'),\n\n    hasELocationInlineWarning: computed.notEmpty('eLocationInlineWarning'),\n\n    actions: {\n        setField(field, event) {\n            if (!event || !event.target || (!event.target.value && !this.get(`${field}`))) return;\n            this.set(`updatedAddress.${field}`, event.target.value);\n\n            if (this.updateElocationOnChange) {\n                this.updateElocationOnChange(this.get('updatedAddress'));\n            }\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n        const countryTranslated = COUNTRY_OPTIONS.map(entry => {\n            return {\n                value: entry.value,\n                displayName: this.get('intl').lookup(entry.displayName).toString()\n            };\n        });\n        this.set('countryOptions', countryTranslated);\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        this.get('setUpdatedAddress').perform();\n    },\n\n    setUpdatedAddress: task(function* () {\n        yield waitForQueue('actions');\n        if (this.get('eLocation') && this.get('editingElocation') && !this.get('saving')) {\n            const eLocationCopy = cloneDeep(this.get('previewAddress'));\n            this.set('updatedAddress', eLocationCopy);\n            if (this.updateElocationOnChange) {\n                this.updateElocationOnChange(cloneDeep(this.get('updatedAddress')));\n            }\n        }\n    }).restartable()\n});\n","export default Ember.HTMLBars.template({\"id\":\"XAdVz44Q\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"edit-mode \\\",[33,[\\\"unless\\\"],[[28,[\\\"editingElocation\\\"]],\\\"hidden\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showTitleInEditMode\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title-section-edit\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"emergency-address-title\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.title\\\"],null],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"toolTipAlertInfoId\\\"]]]]],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"alert-info-edit\\\"],[15,\\\"icon-name\\\",\\\"alert-info\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[16,\\\"for\\\",[26,[\\\"toolTipAlertInfoId\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.alertInfo\\\"],null],false]]}],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"previewAddressIsEligible\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-form-field-text-like\\\",{\\\"attrs\\\":[[15,\\\"label-position\\\",\\\"above\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"slot\\\",\\\"input\\\"],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-street1\\\"]]],[15,\\\"name\\\",\\\"street1\\\"],[15,\\\"class\\\",\\\"address-street1\\\"],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[26,[\\\"street1\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.address1Placeholder\\\"],null],null],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"street1\\\"],null],null],[13],[14],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-street1\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.address1Label\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-form-field-text-like\\\",{\\\"attrs\\\":[[15,\\\"label-position\\\",\\\"above\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"slot\\\",\\\"input\\\"],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-street2\\\"]]],[15,\\\"name\\\",\\\"street2\\\"],[15,\\\"class\\\",\\\"address-street2\\\"],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[26,[\\\"street2\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.address2Placeholder\\\"],null],null],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"street2\\\"],null],null],[13],[14],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-street2\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.address2Label\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-form-field-text-like\\\",{\\\"attrs\\\":[[15,\\\"label-position\\\",\\\"above\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"slot\\\",\\\"input\\\"],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-city\\\"]]],[15,\\\"name\\\",\\\"city\\\"],[15,\\\"class\\\",\\\"address-city\\\"],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[26,[\\\"city\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.cityPlaceholder\\\"],null],null],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"city\\\"],null],null],[13],[14],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-city\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.cityLabel\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-form-field-text-like\\\",{\\\"attrs\\\":[[15,\\\"label-position\\\",\\\"above\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"slot\\\",\\\"input\\\"],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-state\\\"]]],[15,\\\"name\\\",\\\"state\\\"],[15,\\\"class\\\",\\\"address-state\\\"],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[26,[\\\"state\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.statePlaceholder\\\"],null],null],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"state\\\"],null],null],[13],[14],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-state\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.stateLabel\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-form-field-text-like\\\",{\\\"attrs\\\":[[15,\\\"label-position\\\",\\\"above\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"slot\\\",\\\"input\\\"],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-zipcode\\\"]]],[15,\\\"name\\\",\\\"zipcode\\\"],[15,\\\"class\\\",\\\"address-zipcode\\\"],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[26,[\\\"zipcode\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.zipPlaceholder\\\"],null],null],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"zipcode\\\"],null],null],[13],[14],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-zipcode\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.zipLabel\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-form-field-dropdown\\\",{\\\"attrs\\\":[],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[9,\\\"gux-dropdown\\\",{\\\"attrs\\\":[[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"country\\\"],null],null],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-country\\\"]]],[15,\\\"name\\\",\\\"country\\\"],[15,\\\"class\\\",\\\"address-country\\\"],[16,\\\"value\\\",[26,[\\\"country\\\"]],null],[16,\\\"placeholder\\\",[34,[[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.countryPlaceholder\\\"],null]]]],[15,\\\"filterable\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                \\\"],[9,\\\"gux-listbox\\\",{\\\"attrs\\\":[],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"countryOptions\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[9,\\\"gux-option\\\",{\\\"attrs\\\":[[16,\\\"value\\\",[28,[\\\"country\\\",\\\"value\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[28,[\\\"country\\\",\\\"displayName\\\"]],false]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"country\\\"]},null],[0,\\\"                \\\"]]}],[0,\\\"\\\\n            \\\"]]}],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-country\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.countryLabel\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasELocationInlineWarning\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-general-elocation-error\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"eLocationInlineWarning\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"isEligibleForE911\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-not-eligible-number\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.errors.e911NotEligible\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-empty-address\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.emptyAddress\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-not-eligible-number\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"previewAddressError\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"non-edit-mode \\\",[33,[\\\"if\\\"],[[28,[\\\"editingElocation\\\"]],\\\"hidden\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showTitle\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title-section\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"emergency-address-title\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.title\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showTitleIcons\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"toolTipArrowId\\\"]]]]],[15,\\\"class\\\",\\\"edit-emergency-location-icon\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"person.detail\\\",[28,[\\\"personId\\\"]],[33,[\\\"query-params\\\"],null,[[\\\"editEmergencyLocation\\\"],[\\\"true\\\"]]]],[[\\\"tabindex\\\",\\\"class\\\"],[\\\"0\\\",\\\"to-profile\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"edit\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n                \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[16,\\\"for\\\",[26,[\\\"toolTipArrowId\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.update\\\"],null],false]]}],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"toolTipHelpId\\\"]]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.help\\\"],null],null],[13],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"toolbar-help\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[16,\\\"for\\\",[26,[\\\"toolTipHelpId\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.help\\\"],null],false]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showNumberInTitle\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title-for-number\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.titleForNumber\\\"],[[\\\"number\\\"],[[28,[\\\"primaryVoice\\\",\\\"display\\\"]]]]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasELocationInlineWarning\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-general-elocation-error\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"eLocationInlineWarning\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"isEligibleForE911\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-not-eligible-number\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.errors.e911NotEligible\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-empty-address\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.emptyAddress\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"emergency-address-field street1\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"street1ReadOnly\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"emergency-address-field street2\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"street2ReadOnly\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"emergency-address-field city-state-zip\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"cityReadOnly\\\"]],false],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"stateReadOnly\\\"]],false],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"zipcodeReadOnly\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"emergency-address-field country\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"countryReadOnly\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showResetButton\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[16,\\\"gux-title\\\",[34,[[33,[\\\"t\\\"],[\\\"emergencyLocation.buttonTitles.reset\\\"],null]]]],[15,\\\"accent\\\",\\\"tertiary\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"resetElocation\\\"],null],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.buttonTitles.reset\\\"],null],false],[0,\\\"\\\\n    \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/emergency-location/template.hbs\"}});","define(\"connections-ui/components/emoji-dom/component\", [\"exports\", \"ember-purecloud-components/components/emoji-dom/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import { equal, notEmpty } from '@ember/object/computed';\nimport { computed } from '@ember/object';\nimport Component from '@ember/component';\nimport layout from './template';\nimport DS from 'ember-data';\nimport isEmpty from 'lodash.isempty';\nimport debounce from 'lodash.debounce';\n\nexport default Component.extend({\n    layout,\n    classNames: ['entity-contact-group-v2'],\n    classNameBindings: ['compact'],\n    canViewChat: true,\n    canViewVideo: true,\n    entity: null,\n    videoTooltipTitle: '',\n    linkProfile: false,\n    showFavorite: false,\n    showImages: true,\n    compact: false,\n    phoneServiceEnabled: false,\n    phoneAvailable: false,\n    isOneToOneOfflineOrBusy: true,\n    isChatEnabled: false,\n    isWebrtcEnabled: false,\n    isVideoButtonEnabled: false,\n    onContact() {},\n    callEntity() {},\n    toggleFavorite() {},\n\n    useMediaProviders: false,\n\n    actions: {\n        makeCall: debounce(function () {\n            if (this.get('isGroup')) {\n                const groupNumber = this.get('entity.contactInfo.groupNumber.firstObject.value.number');\n                const groupExtension = this.get('entity.contactInfo.groupNumber.firstObject.value.extension');\n                const phoneNumber = groupNumber || groupExtension;\n                this.bubbleAction({\n                    action: 'startCallByNumber',\n                    actionContext: [phoneNumber]\n                });\n            } else {\n                this.bubbleAction({\n                    action: 'startCallPersonById',\n                    actionContext: [this.get('entity.id')]\n                });\n            }\n\n            this.get('onContact')();\n        }, 250),\n\n        startChat() {\n            const entity = this.get('entity');\n            this.bubbleAction({\n                action: 'openChatRoom',\n                actionContext: [entity.get('jid')]\n            });\n\n            this.get('onContact')();\n        },\n\n        sendLove() {\n            const entity = this.get('entity');\n            this.bubbleAction({\n                action: 'sendLove',\n                actionContext: [entity]\n            });\n\n            this.get('onContact')();\n        },\n\n        launchWebrtc() {\n            if (this.get('isOneToOneOfflineOrBusy') || !this.get('isVideoButtonEnabled')) {\n                return;\n            }\n\n            const entity = this.get('entity');\n            this.bubbleAction({\n                action: 'openChatRoomWithVideo',\n                actionContext: [entity.get('id'), this.get('useMediaProviders')]\n            });\n\n            this.get('onContact')();\n        },\n\n        showGallery() {\n            this.sendAction('viewLightGallery');\n\n            this.get('onContact')();\n        }\n    },\n\n    isPerson: equal('entity.type', 'person'),\n    isGroup: equal('entity.type', 'group'),\n\n    linkToProfileRoute: computed('entity.type', function () {\n        const type = this.get('entity.type');\n        if (type === 'group') {\n            return 'group.detail';\n        }\n        return 'person.detail';\n    }),\n\n    isSelf: computed('entity.id', 'self.id', function () {\n        return this.get('entity.id') === this.get('self.id');\n    }),\n\n    hasImages: computed(\n        'entity.uploadedInformalPhotos.[]',\n        'entity.images.informal.[]',\n        'entity.images.gallery.[]',\n        function () {\n            if (!this.get('showImages')) {\n                return false;\n            }\n\n            const personHasImage = this.get('entity.type') === 'person' && !!this.get('entity.images.informal.length');\n            const groupHasImage = this.get('entity.type') === 'group' && !!this.get('entity.images.gallery.length');\n            return personHasImage || groupHasImage;\n        }\n    ),\n\n    hasPhone: computed('entity.phone', 'entity.contactInfo.groupNumber', function () {\n        if (this.get('isGroup')) {\n            return !isEmpty(this.get('entity.contactInfo.groupNumber'));\n        }\n        return !isEmpty(this.get('entity.phone'));\n    }),\n\n    email: computed('entity.primaryContactInfo.email.firstObject.value.fieldId', 'isPerson', function () {\n        if (!this.get('isPerson')) {\n            return;\n        }\n        let entity = this.get('entity');\n        if (entity instanceof DS.PromiseObject) {\n            entity = entity.get('content');\n        }\n        if (!entity) {\n            return;\n        }\n        let email = entity.getFieldValue('primaryContactInfo.email');\n        return email.value;\n    }),\n    phone: computed(\n        'entity.primaryContactInfo.voice.firstObject.value.fieldId',\n        'isPerson',\n        'entity.contactInfo.groupNumber.firstObject.value.fieldId',\n        'isGroup',\n        function () {\n            if (!this.get('isPerson') && !this.get('isGroup')) {\n                return;\n            }\n            let entity = this.get('entity');\n            if (entity instanceof DS.PromiseObject) {\n                entity = entity.get('content');\n            }\n            if (!entity) {\n                return;\n            }\n            let phone = entity.getFieldValue('primaryContactInfo.voice', true);\n            if (this.get('isGroup')) {\n                phone = entity.getFieldValue('contactInfo.groupNumber', true);\n            }\n            if (phone && phone.value && phone.value.fieldPath) {\n                return entity.getFieldValue(phone.value.fieldPath);\n            }\n            return phone;\n        }\n    ),\n\n    mailto: computed('email', 'emailEnabled', function () {\n        if (this.get('emailEnabled')) {\n            return `mailto:${this.get('email')}`;\n        }\n        return '';\n    }),\n\n    tel: computed('phone', function () {\n        const phone = this.get('phone');\n        if (phone.rel) {\n            return `tel:${phone.rel.e164}`;\n        }\n    }),\n\n    emailEnabled: notEmpty('email'),\n\n    // Phone button enabled if a phone is available or the entity has a phone number to use for a tel: link\n    phoneEnabled: computed('phoneServiceEnabled', 'phoneAvailable', 'phone', function () {\n        return (this.get('phoneServiceEnabled') && this.get('phoneAvailable')) || !isEmpty(this.get('phone'));\n    }),\n\n    showPhone: computed('phoneServiceEnabled', 'phone', 'isGroup', function () {\n        if (!this.get('phoneServiceEnabled')) {\n            return false;\n        }\n        if (this.get('isGroup')) {\n            return !isEmpty(this.get('phone'));\n        } else {\n            return true;\n        }\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"NYu2KNFq\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[33,[\\\"and\\\"],[[28,[\\\"session\\\",\\\"features\\\",\\\"AGORA-268_connections-ui-in-admin-ui\\\"]],[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null]],null],[28,[\\\"showPhone\\\"]],[33,[\\\"not\\\"],[[28,[\\\"isSelf\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"contact phone \\\",[33,[\\\"unless\\\"],[[28,[\\\"phoneEnabled\\\"]],\\\"disabled\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneServiceEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.makeCallSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-phone\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.makeCall\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"icon\\\"],[16,\\\"href\\\",[34,[[26,[\\\"tel\\\"]]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"font-icon\\\"],null,[[\\\"class\\\"],[\\\"pc-moon pc-phone\\\"]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[33,[\\\"and\\\"],[[28,[\\\"session\\\",\\\"features\\\",\\\"AGORA-268_connections-ui-in-admin-ui\\\"]],[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null]],null],[28,[\\\"isPerson\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"contact email \\\",[33,[\\\"unless\\\"],[[28,[\\\"emailEnabled\\\"]],\\\"disabled\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.entities.emailSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]],null],[15,\\\"class\\\",\\\"icon\\\"],[16,\\\"href\\\",[34,[[26,[\\\"mailto\\\"]]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-email\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.email\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"canViewChat\\\"]],[28,[\\\"isChatEnabled\\\"]],[33,[\\\"not\\\"],[[28,[\\\"isSelf\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact chat\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.chatContact\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"startChat\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-chat\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.chat\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isPerson\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"canViewVideo\\\"]],[28,[\\\"isWebrtcEnabled\\\"]],[33,[\\\"not\\\"],[[28,[\\\"isSelf\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"contact webrtc \\\",[33,[\\\"if\\\"],[[28,[\\\"isVideoButtonEnabled\\\"]],\\\"enabled\\\",\\\"disabled\\\"],null]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.openVideoCallSr\\\"],[[\\\"tooltip\\\",\\\"name\\\"],[[28,[\\\"videoTooltipTitle\\\"]],[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"launchWebrtc\\\"]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-video\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[26,[\\\"videoTooltipTitle\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"isLoveEnabled\\\"]],[33,[\\\"not\\\"],[[28,[\\\"isSelf\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact purelove\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.propsSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"sendLove\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc pc-love\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.props\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasImages\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact gallery\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.goToGallerySr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showGallery\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc pc-picture\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToGallery\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"linkProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact profile\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[[28,[\\\"linkToProfileRoute\\\"]],[28,[\\\"entity\\\",\\\"id\\\"]]],[[\\\"classNames\\\"],[\\\"icon\\\"]],{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToProfileSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-personicon\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToProfile\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[33,[\\\"and\\\"],[[28,[\\\"session\\\",\\\"features\\\",\\\"AGORA-268_connections-ui-in-admin-ui\\\"]],[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null]],null],[28,[\\\"showFavorite\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isSelf\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"import-data\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.importLinkedinSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showLinkedInImport\\\"]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc pc-linkedin\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.importLinkedin\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"entity-favorite\\\"],null,[[\\\"entity\\\",\\\"toggleFavorite\\\"],[[28,[\\\"entity\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"toggleFavorite\\\"]]],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[29,\\\"default\\\"]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[18,\\\"default\\\",[[28,[\\\"elementId\\\"]]]],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-contact-group-v2/template.hbs\"}});","define(\"connections-ui/components/entity-contact-group/component\", [\"exports\", \"ember-purecloud-components/components/entity-contact-group/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport FlagMixin from '../../mixins/flag';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport PersonModel from '../../models/person';\nimport EntityContact from '../entity-contact/component';\n\nexport default EntityContact.extend(FlagMixin, LoggerMixin, {\n    classNames: ['entity-contact'],\n    session: Ember.inject.service(),\n    phoneService: Ember.inject.service('phone'),\n\n    layoutName: 'components/entity-contact',\n\n    makingCall: false,\n    queue: null,\n    phoneNumber: null,\n    call: null,\n\n    actions: {\n        makeCall: function () {\n            if (!this.get('makingCall')) {\n                const person = this.get('otherParty.content') || this.get('person');\n\n                const queue = this.get('queue.content');\n                const phoneNumber = this.get('phoneNumber');\n\n                let callPromise;\n                this.set('makingCall', true);\n\n                if (this.get('call.isAcdCall')) {\n                    if (person instanceof PersonModel) {\n                        callPromise = this.phoneService.makeCall(person, null, queue);\n                    } else if (this.get('person') && _.isEmpty(phoneNumber)) {\n                        this.set('makingCall', false);\n                        this._super();\n                        return;\n                    } else {\n                        callPromise = this.phoneService.makeCall(phoneNumber, null, queue);\n                    }\n                } else {\n                    callPromise = this.phoneService.makeCall(queue, null, false);\n                }\n\n                callPromise.finally(() => {\n                    this.set('makingCall', false);\n                });\n            }\n        },\n\n        flagInteraction(action) {\n            this.flagInteractionAction(action);\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport DS from 'ember-data';\nimport debounce from 'lodash.debounce';\n\nimport PromiseLoadingMixin from '../../mixins/promise-loading';\nimport FlagMixin from '../../mixins/flag';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nvar EntityContactComponent = Ember.Component.extend(PromiseLoadingMixin, FlagMixin, LoggerMixin, {\n    classNames: ['entity-contact'],\n\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    favorites: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    addressformat: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    phone: Ember.inject.service(),\n\n    showPhone: false,\n    showChat: false,\n    showEmail: false,\n    showFavorite: false,\n    shouldTether: false,\n    contact: null,\n    phoneNumber: null,\n    email: null,\n    callId: null,\n\n    shouldDisplayDropdown: true,\n    showDropdown: false,\n    callConnecting: false,\n    flaggingSupportEnabled: false,\n    isRedial: false,\n\n    tether: null,\n\n    actions: {\n        toggleFavorite: function () {\n            this.get('person').then(person => {\n                this.get('favorites').toggleFavorite(person);\n            });\n        },\n\n        toggleDropdown: function () {\n            this.toggleProperty('showDropdown');\n\n            if (this.get('showDropdown')) {\n                let tether = this.get('tether');\n                if (this.get('shouldTether') && !_.isEmpty(tether)) {\n                    Ember.run.scheduleOnce('afterRender', tether, tether.position);\n                }\n            }\n        },\n\n        makeCall: debounce(function (address) {\n            if (this.get('session.features.digitalFirstPURE2942') && !this.get('permissions.phoneEnabled')) {\n                return;\n            }\n            this.set('showDropdown', false);\n\n            this.get('person').then(person => {\n                if (address) {\n                    // Prefer action supplied phone number entry to makeCall.\n                    // User has clicked dropdown and selected a specific number.\n                    this.bubbleAction({\n                        action: 'startCallByNumber',\n                        actionContext: [address]\n                    });\n                } else if (!_.isEmpty(person) && !(this.get('isExternalContact') || this.get('isGroup'))) {\n                    // Or call person by their guid\n                    // Calling a person back at their preferred number.\n                    this.bubbleAction({\n                        action: 'startCallPersonById',\n                        actionContext: [this.get('person.id')]\n                    });\n                } else {\n                    // Otherwise call person by specified phone number to the component.\n                    // (call-history-entry, active-call-entry components)\n                    this.bubbleAction({\n                        action: 'startCallByNumber',\n                        actionContext: [this.get('phoneNumber')]\n                    });\n                }\n            });\n        }, 250),\n\n        recordRecentContact: function (type, value) {\n            if (type === 'email') {\n                window.top.location = 'mailto:' + value.data.value;\n            } else if (type === 'voice' && !this.get('phone.enabled')) {\n                if (this.get('session.features.digitalFirstPURE2942')) {\n                    return;\n                }\n                window.top.location = 'tel:' + value.data.rel.e164;\n            }\n        },\n\n        sendToProfile: function () {\n            this.get('person').then(person => {\n                this.bubbleAction({\n                    action: 'transitionToEntityDetail',\n                    actionContext: [person]\n                });\n\n                this.set('showDropdown', false);\n            });\n        },\n\n        flagInteraction(action) {\n            this.flagInteractionAction(action);\n        }\n    },\n\n    entityData: Ember.computed('contact.{id,name,isFavorite,type}', function () {\n        return {\n            id: this.get('contact.id'),\n            name: this.get('contact.name'),\n            isFavorite: this.get('contact.isFavorite'),\n            type: this.get('contact.type')\n        };\n    }),\n\n    isEntityFavoriteDecompEnabled: Ember.computed.readOnly('session.features.epcDecompEntityFavorite'),\n\n    callConnected: Ember.observer('phone.activeCall', function () {\n        const activeCall = this.get('phone.activeCall');\n\n        if (activeCall) {\n            const activeCallId = Ember.get(activeCall, 'id');\n            const componentCallIsActiveCall = activeCallId === this.get('callId');\n            if (componentCallIsActiveCall) {\n                this.set('callConnecting', false);\n            }\n        }\n    }),\n\n    phoneNumberDetails: Ember.computed('phoneNumber', 'person', function () {\n        if (this.get('person.name')) {\n            return this.get('person.name');\n        }\n        return this.get('addressformat').formatAddressForDisplay(this.get('phoneNumber'));\n    }),\n\n    phoneServiceEnabled: Ember.computed('phone.{enabled,phoneDisabled,noStationSelected}', function () {\n        return this.get('phone.enabled') && !this.get('phone.noStationSelected') && !this.get('phone.phoneDisabled');\n    }),\n\n    phoneEnabled: Ember.computed('showPhone', 'isExternalContact', 'phoneNumber', 'phone.phoneDisabled', function () {\n        if (this.get('phone.phoneDisabled') || this.get('personIsDeleted')) {\n            return false;\n        }\n        return (\n            this.get('showPhone') ||\n            ((this.get('isExternalContact') || this.get('isGroup')) && !!this.get('phoneNumber'))\n        );\n    }),\n\n    chatEnabled: Ember.computed('showChat', 'isExternalContact', 'permissions.canViewBusinessChat', function () {\n        return this.get('permissions.canViewBusinessChat') && this.get('showChat') && !this.get('isExternalContact');\n    }),\n\n    emailEnabled: Ember.computed('showEmail', 'isExternalContact', 'email', function () {\n        return this.get('showEmail') || (this.get('isExternalContact') && !!this.get('email'));\n    }),\n\n    favoriteEnabled: Ember.computed('showFavorite', 'isExternalContact', 'favorites.enabled', function () {\n        return this.get('showFavorite') && !this.get('isExternalContact') && this.get('favorites.enabled');\n    }),\n\n    isExternal: Ember.computed('contact.participantType', function () {\n        if (this.get('contact.type') === 'person' || this.get('isExternalContact')) {\n            return false;\n        }\n        return (\n            !this.get('contact.purpose') ||\n            this.get('contact.purpose').toLowerCase() === 'external' ||\n            _.isEmpty(this.get('contact.userId'))\n        );\n    }),\n\n    isExternalContact: Ember.computed('contact.type', function () {\n        return this.get('contact.type') === 'externalContact';\n    }),\n\n    isGroup: Ember.computed('contact.type', function () {\n        return this.get('contact.type') === 'group';\n    }),\n\n    setExternalContactInfo: Ember.on('didInsertElement', function () {\n        if (this.get('isExternalContact')) {\n            var phone = this.get('contact.contactInfo.phone');\n            if (phone) {\n                this.set('phoneNumber', `tel:${phone[0].rel.e164}`);\n            }\n\n            var email = this.get('contact.contactInfo.email');\n            if (email) {\n                this.set('email', `mailto:${email[0].value}`);\n            }\n        }\n    }),\n\n    setupGroupPhoneNumber: Ember.on('didInsertElement', function () {\n        if (this.get('isGroup')) {\n            Ember.run.scheduleOnce('afterRender', this, this.setGroupNumber);\n        }\n    }),\n\n    enableFavoriteEvent: Ember.on('didInsertElement', function () {\n        this.$().on('favoriteEvent', () => {\n            this.get('person').then(person => {\n                this.get('favorites').toggleFavorite(person);\n            });\n        });\n    }),\n\n    person: Ember.computed('contact.{userId,type,id}', function () {\n        var type = this.get('contact.type');\n        var id = this.get('contact.id');\n        var userId = this.get('contact.userId');\n        if (type && id) {\n            return DS.PromiseObject.create({\n                promise: Ember.RSVP.resolve(this.get('contact'))\n            });\n        } else if (userId) {\n            // This fall through will not be needed after public api v3 -- this looks up a user by GUID\n            return this.store.find('person', userId);\n        }\n        return Ember.RSVP.resolve({});\n    }),\n\n    personIsDeleted: Ember.computed.equal('person.state', 'deleted'),\n\n    hideChat: Ember.computed('contact.{id,userId}', 'session.person.id', function () {\n        let id = this.get('contact.id') || this.get('contact.userId');\n        return id === this.get('session.person.id');\n    }),\n\n    jid: Ember.computed('person.jid', 'contact.jid', function () {\n        if (this.get('contact.type') === 'group') {\n            return this.get('contact.jid');\n        }\n\n        return this.get('person.jid');\n    }),\n\n    phones: Ember.computed('person', 'isExternalContact', function () {\n        if (this.get('isExternalContact')) {\n            return this.get('contact.contactInfo.phone');\n        } else {\n            var promise = this.get('person').then(person => {\n                return this.getContactFieldValuesByType(person, 'voice');\n            });\n            return DS.PromiseArray.create({\n                promise: promise\n            });\n        }\n    }),\n\n    emails: Ember.computed('person', 'isExternalContact', function () {\n        if (this.get('isExternalContact')) {\n            return this.get('contact.contactInfo.email');\n        } else {\n            var promise = this.get('person').then(person => {\n                this.getContactFieldValuesByType(person, 'email');\n            });\n            return DS.PromiseArray.create({\n                promise: promise\n            });\n        }\n    }),\n\n    displayDropdown: Ember.computed('shouldDisplayDropdown', 'phones', 'emails', 'isExternalContact', function () {\n        var hasEmail = !_.isEmpty(this.get('emails'));\n        var hasPhone = !_.isEmpty(this.get('phones'));\n        var canDisplay = this.get('shouldDisplayDropdown');\n        var isContact = this.get('isExternalContact');\n\n        return canDisplay && (!isContact || hasEmail || hasPhone);\n    }),\n\n    callTitle: Ember.computed(function () {\n        return this.get('intl').t('tooltip.contactIcon.phone').toString();\n    }),\n\n    attachListeners: Ember.on('didInsertElement', function () {\n        var id = this.get('elementId');\n\n        Ember.$(window).on('click.' + id, Ember.run.bind(this, this.detectOutsideClick));\n    }),\n\n    setupTether: Ember.on('didInsertElement', function () {\n        if (!this.get('shouldTether')) {\n            return;\n        }\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            let tether = new window.Tether({\n                element: this.$('.dropdown-menu')[0],\n                target: this.$('.show-more')[0],\n                attachment: 'top right',\n                targetAttachment: 'bottom right',\n                constraints: [\n                    {\n                        to: 'scrollParent',\n                        attachment: 'together',\n                        pin: true\n                    }\n                ]\n            });\n\n            this.set('tether', tether);\n        });\n    }),\n\n    removeTether() {\n        let tether = this.get('tether');\n        if (tether) {\n            tether.destroy();\n            if (tether.element) {\n                tether.element.remove();\n            }\n        }\n    },\n\n    removeListeners() {\n        Ember.$(window).off(`.${this.get('elementId')}`);\n    },\n\n    willDestroyElement() {\n        this.removeListeners();\n        this.removeTether();\n\n        this._super(...arguments);\n    },\n\n    detectOutsideClick: function (event) {\n        var id = this.get('elementId');\n        var target = Ember.$(event.target);\n\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n\n        if (id && !target.parents('#' + id).length) {\n            Ember.run.once(this, this.set, 'showDropdown', false);\n        }\n    },\n\n    getContactFieldValuesByType: function (person, type) {\n        if (!person.getContactFieldValuesByType) {\n            return [];\n        }\n        var items = person.getContactFieldValuesByType(type).map(function (item) {\n            return { data: item };\n        });\n        var primary = person.getFieldValue(`primaryContactInfo.${type}`, true);\n        if (!_.isEmpty(primary)) {\n            var primaryItem = _.find(items, function (item) {\n                return Ember.get(item.data, '_id') === Ember.get(primary, 'value.fieldId');\n            });\n            if (primaryItem) {\n                primaryItem.primary = true;\n            }\n        }\n        return _.sortBy(items, function (item) {\n            return item.primary;\n        });\n    },\n\n    notifyError: function (key) {\n        this.get('notification').show({\n            target: this.get('phone.applicationController'),\n            tag: 'callHistory',\n            message: this.get('intl').t(key),\n            type: 'error',\n            hideAfter: false,\n            actionHandlers: {\n                reportError: this.get('intl').t('components.navMenu.feedback.contactSupport').toString()\n            }\n        });\n    },\n\n    setGroupNumber() {\n        const data = this.get('contact').getFieldValue('contactInfo.groupNumber');\n        if (!_.isEmpty(data)) {\n            const number = this.get('addressformat').format(data);\n            this.set('phoneNumber', `tel:${number}`);\n        }\n    }\n});\n\nexport default EntityContactComponent;\n","export default Ember.HTMLBars.template({\"id\":\"/PFBHCT2\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"btn-group\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneEnabled\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phoneServiceEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"if\\\"],[[28,[\\\"isRedial\\\"]],[33,[\\\"t\\\"],[\\\"components.callHistory.redial\\\"],null],[33,[\\\"t\\\"],[\\\"components.entities.makeCallSr\\\"],[[\\\"name\\\"],[[28,[\\\"contact\\\",\\\"name\\\"]]]]]],null],null],[16,\\\"class\\\",[34,[\\\"btn btn-link btn-phone make-call \\\",[33,[\\\"unless\\\"],[[28,[\\\"phoneEnabled\\\"]],\\\"hide\\\"],null]]]],[16,\\\"disabled\\\",[26,[\\\"disablePhoneButton\\\"]],null],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"components.entities.makeCall\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showPhoneSpinner\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"phone\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"session\\\",\\\"features\\\",\\\"digitalFirstPURE2942\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[16,\\\"class\\\",[34,[\\\"btn btn-link btn-phone \\\",[33,[\\\"unless\\\"],[[28,[\\\"phoneEnabled\\\"]],\\\"hide\\\"],null]]]],[16,\\\"href\\\",[34,[[26,[\\\"phoneNumber\\\"]]]]],[16,\\\"target\\\",[34,[[26,[\\\"phoneNumber\\\"]]]]],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"phone\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"chatEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.entities.chatContact\\\"],[[\\\"name\\\"],[[28,[\\\"contact\\\",\\\"name\\\"]]]]],null],[16,\\\"class\\\",[34,[\\\"btn btn-link btn-chat \\\",[33,[\\\"unless\\\"],[[28,[\\\"chatEnabled\\\"]],\\\"hide\\\"],null]]]],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"components.entities.chat\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],[33,[\\\"route-action\\\"],[\\\"openChatRoom\\\",[28,[\\\"jid\\\"]]],null]]],[13],[0,\\\"\\\\n            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"toolbar-chat\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"emailEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"a\\\",[]],[16,\\\"class\\\",[34,[\\\"icon btn btn-link btn-email \\\",[33,[\\\"unless\\\"],[[28,[\\\"emailEnabled\\\"]],\\\"hide\\\"],null]]]],[16,\\\"href\\\",[26,[\\\"email\\\"]],null],[13],[0,\\\"\\\\n            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"message-email\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"favoriteEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"entity-favorite\\\",{\\\"attrs\\\":[[16,\\\"entityFavoriteData\\\",[26,[\\\"entityData\\\"]],null],[16,\\\"title\\\",[33,[\\\"if\\\"],[[28,[\\\"contact\\\",\\\"isFavorite\\\"]],[33,[\\\"t\\\"],[\\\"common.unMarkFavorite\\\"],[[\\\"name\\\"],[[28,[\\\"contact\\\",\\\"name\\\"]]]]],[33,[\\\"t\\\"],[\\\"common.markFavorite\\\"],[[\\\"name\\\"],[[28,[\\\"contact\\\",\\\"name\\\"]]]]]],null],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"unless\\\"],[[33,[\\\"and\\\"],[[28,[\\\"isExternal\\\"]],[33,[\\\"not\\\"],[[28,[\\\"flaggingSupportEnabled\\\"]]],null]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"displayDropdown\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-expanded\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"true\\\",\\\"false\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.moreActionSr\\\"],[[\\\"name\\\"],[[28,[\\\"contact\\\",\\\"name\\\"]]]]],null],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"common.more\\\"],null],null],[16,\\\"class\\\",[34,[\\\"btn btn-link btn-dropdown show-more \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"isExternal\\\"]],[33,[\\\"not\\\"],[[28,[\\\"flaggingSupportEnabled\\\"]]],null]],null],\\\"hide\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleDropdown\\\"]],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"menu-kebab-horizontal\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[33,[\\\"and\\\"],[[28,[\\\"isExternal\\\"]],[33,[\\\"not\\\"],[[28,[\\\"flaggingSupportEnabled\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"show\\\"],null],\\\" \\\",[33,[\\\"if\\\"],[[28,[\\\"shouldTether\\\"]],\\\"entity-contact-dropdown-menu\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phones\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"list-header\\\"],[13],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"phone\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.phone\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isExternalContact\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"phones\\\"]]],[[\\\"key\\\"],[\\\"@index\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[16,\\\"class\\\",[34,[\\\"entry\\\\n                            \\\",[33,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"primary\\\"]],\\\"primary\\\"],null],\\\"\\\\n                            \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"session\\\",\\\"features\\\",\\\"digitalFirstPURE2942\\\"]],[33,[\\\"not\\\"],[[28,[\\\"permissions\\\",\\\"phoneEnabled\\\"]]],null]],null],\\\"disable-call\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"number\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"recordRecentContact\\\",\\\"voice\\\",[28,[\\\"phone\\\"]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneServiceEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[26,[\\\"callTitle\\\"]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\",[28,[\\\"phone\\\",\\\"data\\\"]]]],[13],[0,\\\"\\\\n                                    \\\"],[1,[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[1,[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"extension\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"number\\\"]],\\\"tel\\\",[28,[\\\"phone\\\",\\\"data\\\",\\\"rel\\\",\\\"e164\\\"]]]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[1,[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"extension\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"phone\\\"]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"phones\\\"]]],[[\\\"key\\\"],[\\\"@index\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[16,\\\"class\\\",[34,[\\\"entry \\\",[33,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"primary\\\"]],\\\"primary\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneServiceEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"number\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"recordRecentContact\\\",\\\"voice\\\",[28,[\\\"phone\\\"]]]],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[26,[\\\"callTitle\\\"]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\",[28,[\\\"phone\\\"]]]],[13],[0,\\\"\\\\n                                    \\\"],[1,[28,[\\\"phone\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[1,[28,[\\\"phone\\\",\\\"value\\\",\\\"extension\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                \\\"],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"number\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"phone\\\",\\\"value\\\",\\\"number\\\"]],\\\"tel\\\",[28,[\\\"phone\\\",\\\"rel\\\",\\\"e164\\\"]]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[1,[28,[\\\"phone\\\",\\\"value\\\",\\\"extension\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"phone\\\"]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emails\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"list-header\\\"],[13],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"message-email\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.email\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isExternalContact\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"emails\\\"]]],[[\\\"key\\\"],[\\\"@index\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[16,\\\"class\\\",[34,[\\\"entry email \\\",[33,[\\\"if\\\"],[[28,[\\\"email\\\",\\\"primary\\\"]],\\\"primary\\\"],null]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"recordRecentContact\\\",\\\"email\\\",[28,[\\\"email\\\"]]]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"email\\\",\\\"data\\\",\\\"value\\\"]],\\\"mailto\\\",[28,[\\\"email\\\",\\\"data\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"email\\\"]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"emails\\\"]]],[[\\\"key\\\"],[\\\"@index\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"entry email primary\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"email\\\",\\\"value\\\"]],\\\"mailto\\\",[28,[\\\"email\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"email\\\"]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"isExternalContact\\\"]]],null],[33,[\\\"or\\\"],[[28,[\\\"chatEnabled\\\"]],[28,[\\\"person\\\",\\\"id\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"action-buttons\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"chatEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.entities.chatContact\\\"],[[\\\"name\\\"],[[28,[\\\"person\\\",\\\"name\\\"]]]]],null],[16,\\\"class\\\",[34,[\\\"btn btn-default action-button \\\",[33,[\\\"if\\\"],[[28,[\\\"hideChat\\\"]],\\\"hidden\\\"],null]]]],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.chat\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],[33,[\\\"route-action\\\"],[\\\"openChatRoom\\\",[28,[\\\"jid\\\"]]],null]]],[13],[0,\\\"\\\\n\\\"],[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"flex\\\"],[13],[0,\\\"\\\\n                                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"toolbar-chat\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.chat\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"person\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"personIsDeleted\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"profile-deleted\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"person.deleted\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.entities.goToProfileSr\\\"],[[\\\"name\\\"],[[28,[\\\"person\\\",\\\"name\\\"]]]]],null],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"components.entities.goToProfile\\\"],null],null],[15,\\\"class\\\",\\\"btn btn-default action-button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"sendToProfile\\\"]],[13],[0,\\\"\\\\n\\\"],[0,\\\"                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"flex\\\"],[13],[0,\\\"\\\\n                                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"user\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"person.profile\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"flaggingSupportEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"flag-actions\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"flag-action\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"flagInteraction\\\",[33,[\\\"if\\\"],[[28,[\\\"didFlag\\\"]],\\\"unflag\\\",\\\"flag\\\"],null]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"flagOperationInProcess\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"didFlag\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"unflag-icon\\\"],[15,\\\"icon-name\\\",\\\"flag\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"purecloud.flagInteraction\\\"],null],null],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"flag-icon\\\"],[15,\\\"icon-name\\\",\\\"flag\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"purecloud.flagInteraction\\\"],null],null],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.voiceQualityIssue\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-contact/template.hbs\"}});","define(\"connections-ui/components/entity-favorite/component\", [\"exports\", \"ember-purecloud-components/components/entity-favorite/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","export default Ember.HTMLBars.template({\"id\":\"nPK9t1GW\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-footer\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"saving\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"save-section\\\"],[15,\\\"accent\\\",\\\"primary\\\"],[16,\\\"disabled\\\",[26,[\\\"disableSave\\\"]],null],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"saveSection\\\"],null],null],[16,\\\"data-t\\\",[34,[\\\"btn-save-\\\",[26,[\\\"sectionKey\\\"]]]]],[15,\\\"role\\\",\\\"button\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"save-section\\\"],[15,\\\"accent\\\",\\\"primary\\\"],[16,\\\"disabled\\\",[26,[\\\"disableSave\\\"]],null],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"saveSection\\\"],null],null],[16,\\\"data-t\\\",[34,[\\\"btn-save-\\\",[26,[\\\"sectionKey\\\"]]]]],[15,\\\"role\\\",\\\"button\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"cancelling\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"cancel-section\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"],null],null],[15,\\\"role\\\",\\\"button\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"cancel-section\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"],null],null],[15,\\\"role\\\",\\\"button\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"spacer\\\"],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"hideFooterRemoveButton\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"remove-section\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"confirmRemoveSection\\\"],null],null],[15,\\\"role\\\",\\\"button\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],false],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/-section-footer/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"vmy+dDL7\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-section-header \\\",[33,[\\\"if\\\"],[[28,[\\\"showInstructionText\\\"]],\\\"show-instruction-text\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"header\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"3\\\"],[13],[1,[26,[\\\"sectionName\\\"]],false],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showEditAction\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"edit-action\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"fieldSection.sectionEdit\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"fieldSection.editSectionName\\\"],[[\\\"sectionName\\\"],[[28,[\\\"sectionName\\\"]]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"editSection\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.sectionEdit\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showHeaderLock\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"lock\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-lock\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showAddNew\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-field-section/add-new\\\"],null,[[\\\"section\\\",\\\"fieldValues\\\",\\\"disableDropdown\\\",\\\"modal\\\",\\\"addNewEntry\\\",\\\"toggleAddValue\\\"],[[28,[\\\"section\\\"]],[28,[\\\"fieldValuesToAdd\\\"]],[28,[\\\"disableAddValueDropdown\\\"]],[28,[\\\"modal\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"addNewEntry\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleAddValue\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/-section-header/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { on, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['add-new'],\n    classNameBindings: ['hide'],\n\n    attrs: {\n        section: null,\n\n        fieldValues: [],\n        disableDropdown: false,\n\n        toggleAddValue: null,\n        addNewEntry: () => {}\n    },\n\n    fieldValues: [],\n\n    showDropdown: false,\n\n    actions: {\n        addNewEntry(value) {\n            this.attrs.addNewEntry(value);\n            this.set('showDropdown', false);\n        },\n\n        toggleAddValue() {\n            if (this.get('disableDropdown')) {\n                this.attrs.toggleAddValue();\n            } else {\n                this.toggleProperty('showDropdown');\n            }\n        }\n    },\n\n    hide: computed('fieldValues.[]', function () {\n        return _.isEmpty(this.get('fieldValues'));\n    }),\n\n    attachClickListener: on('didInsertElement', function () {\n        Ember.$(document).on(`click.${this.get('elementId')}`, event => {\n            Ember.run(() => {\n                let target = Ember.$(event.target);\n                if (!target.parents('.add-new').length) {\n                    this.set('showDropdown', false);\n                }\n            });\n        });\n    }),\n\n    removeClickListener: on('willDestroyElement', function () {\n        Ember.$(document).off(`.${this.get('elementId')}`);\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"BOF5ljg2\",\"block\":\"{\\\"statements\\\":[[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"add-new-button\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"toggleAddValue\\\"],null],null],[16,\\\"aria-expanded\\\",[34,[[26,[\\\"showDropdown\\\"]]]]],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"fieldSection.addNew\\\"],null]]]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"fieldSection.addNewName\\\"],[[\\\"name\\\"],[[28,[\\\"section\\\",\\\"sectionName\\\"]]]]]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"ic-add-bold\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.addNew\\\"],null],false],[0,\\\"\\\\n\\\"]]}],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu add-new-dropdown \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"show\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"fieldValues\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"entity-list-item\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"class\\\",[34,[\\\"add-new-entity-\\\",[28,[\\\"fieldValue\\\",\\\"fieldPathClass\\\"]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"addNewEntry\\\",[28,[\\\"fieldValue\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"fieldValue\\\",\\\"i18nLabel\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"fieldValue\\\"]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/add-new/template.hbs\"}});","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport curry from 'lodash/curry';\nimport groupBy from 'lodash/groupBy';\nimport isEmpty from 'lodash/isEmpty';\nimport map from 'lodash/map';\nimport reject from 'lodash/reject';\nimport { doFocus } from 'connections-ui/utils/focus-management';\nimport { rerunLayouts } from '../../utils/masonry';\nimport FieldData from '../entity-profile/profiles/field-data';\nimport Profile from '../entity-profile/profiles/profile';\n\nconst { on, run, inject, getOwner, computed, observer, Component } = Ember;\n\nconst EXCLUDE_TYPES = ['image', 'reference'];\n\nfunction filterExcludedField(excludedFields, field) {\n    if (!excludedFields) {\n        return true;\n    }\n    return EXCLUDE_TYPES.indexOf(field.type) === -1 && excludedFields.indexOf(field.key) === -1;\n}\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['entity-field-section', 'content'],\n    classNameBindings: ['section.key', 'editing'],\n    attributeBindings: ['tabindex:tabindex'],\n    tabindex: '-1',\n\n    intl: inject.service(),\n    session: inject.service(),\n    permissions: inject.service(),\n    notification: inject.service('notification-proxy'),\n\n    // required\n    entity: null,\n    sectionInfo: null,\n\n    // public\n    hideHeader: false,\n    editingProfile: false,\n    scrollOnAddNew: true,\n    excludedFields: [],\n    excludedEditingFields: [],\n\n    attrs: {\n        entity: null,\n        sectionInfo: null,\n\n        hideHeader: false,\n        editingProfile: false,\n        excludedFields: [],\n        excludedEditingFields: [],\n\n        removeSection: () => {}\n    },\n\n    section: computed.reads('sectionInfo.section'),\n    sectionName: computed.reads('section.sectionName'),\n    sectionKey: computed.reads('sectionInfo.section.key'),\n    editingSection: computed.alias('sectionInfo.editingSection'),\n\n    editing: computed.and('editingSection', 'editingProfile'),\n\n    // others\n    canViewChat: computed.reads('permissions.canViewBusinessChat'),\n    canViewVideo: computed.reads('permissions.canViewCollaborateVideo'),\n    saving: false,\n    showModal: false,\n    cancelling: false,\n    hideEmptyValues: true,\n    showInstructionText: false,\n    disableAddValueDropdown: false,\n\n    showRemoveSectionModal: false,\n\n    fallbackToEmptyLabel: false,\n\n    hideFooterRemoveButton: false,\n\n    timer: null,\n\n    // legacy support\n    isEditing: computed.alias('editing'),\n\n    actions: {\n        toggleInstructionText() {\n            this.toggleProperty('showInstructionText');\n        },\n\n        editSection() {\n            this.set('editingSection', true);\n            this.updateMasonry();\n\n            if (this.get('hideFooterRemoveButton')) {\n                return;\n            }\n\n            const key = this.get('section.key');\n            if (this.get('profile.writeableSections').includes(key)) {\n                const readableFields = this.get('profile').getReadableFieldPathsForSection(this.get('section'));\n                const writeableFields = this.get('profile').getEditableFieldPathsForSection(this.get('section'));\n\n                this.set('hideFooterRemoveButton', readableFields.length !== writeableFields.length);\n            }\n        },\n\n        saveSection() {\n            this.saveSection()\n                .then(() => {\n                    this.set('editingSection', false);\n                    this.updateMasonry();\n                })\n                .catch(err => {\n                    this.logger.error('Error saving field section:', { err });\n                })\n                .finally(() => {\n                    this.set('saving', false);\n                    Ember.run.once(this, 'reconcileNewFields');\n                    const focusTarget = '.add-section button:first';\n                    doFocus(Ember, focusTarget);\n                });\n        },\n\n        cancel() {\n            this.set('cancelling', true);\n\n            this.reset().finally(\n                Ember.run.bind(this, () => {\n                    if (this.isDestroyed || this.isDestroying) {\n                        return;\n                    }\n\n                    this.set('editingSection', false);\n                    this.set('cancelling', false);\n\n                    if (this.cancelEditElocation) {\n                        this.cancelEditElocation();\n                    }\n\n                    Ember.run.scheduleOnce('afterRender', this, function () {\n                        if (this.isDestroyed || this.isDestroying) {\n                            return;\n                        }\n\n                        let top = this.$().position().top;\n                        Ember.$('#orgspan').animate(\n                            {\n                                scrollTop: top\n                            },\n                            600\n                        );\n\n                        this.updateMasonry();\n                        const focusTarget = '.add-section button:first';\n                        doFocus(Ember, focusTarget);\n                    });\n                })\n            );\n        },\n\n        addNewEntry(field) {\n            const entity = this.get('entity');\n            const path = field.get('fieldPath');\n\n            entity.set(path, '');\n\n            const valueReference = [].concat(entity.get(path)).pop();\n\n            const fieldData = FieldData.create({\n                entity,\n                field,\n                valueReference,\n                session: this.get('session')\n            });\n\n            this.get('fieldData').pushObject(fieldData);\n            this.get('_newFields').pushObject(fieldData);\n\n            this.notifyPropertyChange('groupedFieldData');\n\n            if (this.get('scrollOnAddNew')) {\n                Ember.run.scheduleOnce('afterRender', this, this.scrollToNewField, fieldData);\n            }\n\n            this.updateMasonry();\n        },\n\n        removeEntry(fieldData) {\n            this.removeEntryFromFieldData(fieldData);\n        },\n\n        removeContactSection(fieldData) {\n            this.removeEntryFromFieldData(fieldData);\n        },\n\n        confirmRemoveSection() {\n            this.set('showRemoveSectionModal', true);\n            const focusTarget = '.remove-section-confirmation button:first';\n            doFocus(Ember, focusTarget);\n        },\n\n        cancelRemoveSection() {\n            this.set('showRemoveSectionModal', false);\n            const focusTarget = '.add-section button:first';\n            doFocus(Ember, focusTarget);\n        },\n\n        removeSection() {\n            let entity = this.get('entity');\n            let fieldList = this.get('section.fieldList');\n            fieldList.forEach(field => {\n                let path = field.get('fieldPath');\n                if (entity.get(path) && !field.get('required')) {\n                    entity.set(path, [], { overwrite: true });\n                }\n            });\n\n            return this.saveSection().then(() => {\n                this.set('sectionInfo.adding', false);\n                this.set('sectionInfo.editingSection', false);\n\n                if (isEmpty(fieldList.filterBy('required'))) {\n                    this.attrs.removeSection(this.get('sectionInfo'));\n                }\n\n                this.send('cancelRemoveSection');\n            });\n        },\n\n        toggleAddValue: () => {}\n    },\n\n    removeEntryFromFieldData(fieldData) {\n        let entity = this.get('entity');\n        let field = fieldData.get('field');\n        let entry = fieldData.get('entry');\n        let path = field.getFieldPath();\n\n        this.get('fieldData').removeObject(fieldData);\n        this.get('_newFields').removeObject(fieldData);\n\n        entity.getFieldValue(path).removeObject(entry);\n        this.updateMasonry();\n    },\n\n    _groupedFieldData: null,\n    _newFields: null,\n\n    init() {\n        const entity = this.get('entity');\n        const section = this.get('section');\n\n        // Ensure section exists\n        if (section && section.key) {\n            if (entity.get(section.key) === undefined) {\n                entity.set(section.key, {});\n            }\n\n            const sectionData = entity.get(section.key);\n            const fieldPath = this.get('field') && this.get('field.key');\n\n            if (fieldPath && !Ember.get(sectionData, fieldPath)) {\n                const fullPath = `${section.key}.${fieldPath}`;\n                Ember.run.once(entity, entity.set, fullPath, [], { overwrite: true });\n            }\n        }\n\n        this._super(...arguments);\n    },\n\n    willDestroyElement() {\n        Ember.run.cancel(this.timer);\n    },\n\n    setupCacheValues: on('init', function () {\n        this.setProperties({\n            _groupedFieldData: [],\n            _newFields: []\n        });\n    }),\n\n    instructionTextTooltipOnInsert: on('didInsertElement', function () {\n        this.timer = run.scheduleOnce('afterRender', this, 'setupInstructionText');\n    }),\n\n    isViewMode: computed.not('editingProfile'),\n\n    ownProfile: computed('entity.id', 'session.person.id', function () {\n        return this.get('entity.id') === this.get('session.person.id');\n    }),\n\n    profile: computed('entity.id', function () {\n        let entity = this.get('entity');\n        return Profile.getProfileForModel(entity, getOwner(this));\n    }),\n\n    filteredFields: computed('entity.id', 'section', 'excludedFields.[]', 'profile.readableSections.[]', function () {\n        let section = this.get('section');\n        let fieldList = section.get('fieldList');\n        let isSuper = this.get('session.user.isAdmin') && !this.get('session.user.personId');\n\n        let fields = [],\n            filteredFields = [];\n        let excludedFields = this.get('excludedFields');\n        let excludedFieldsFilter = curry(filterExcludedField)(excludedFields);\n\n        if (isSuper) {\n            filteredFields = fieldList.filter(excludedFieldsFilter);\n        } else {\n            let readableFieldPaths = this.get('profile').getReadableFieldPathsForSection(section);\n\n            filteredFields = fieldList\n                .filter(excludedFieldsFilter)\n                .filter(field => {\n                    let section = this.get('section');\n                    let fieldPath = field.get('fieldPath');\n                    if (!section) {\n                        return false;\n                    }\n                    return readableFieldPaths.indexOf(fieldPath) !== -1;\n                })\n                .filter(field => {\n                    return field.type !== 'group';\n                });\n        }\n\n        fields.addObjects(filteredFields);\n\n        return fields;\n    }),\n\n    fieldData: computed('entity.id', 'filteredFields.[]', 'editingSection', '_newFields.[]', function () {\n        const filteredFields = this.get('filteredFields');\n        return this.getFieldEntries(filteredFields);\n    }),\n\n    groupedFieldData: computed('fieldData.[]', 'fieldData.length', function () {\n        const fieldData = this.get('fieldData');\n        const groupedData = groupBy(fieldData, data => data.get('field.key'));\n        return map(groupedData, (data, key) => ({ key, fieldData: data }));\n    }),\n\n    instructionText: computed('intl.isoLocale', function () {\n        const intl = this.get('intl');\n        const section = this.get('section').getI18nKey();\n        const key = `${section}_instructionText`;\n\n        if (intl.query(key)) {\n            return intl.lookup(key).toString();\n        } else {\n            return this.get('section.instructionText');\n        }\n    }),\n\n    fieldValuesToAdd: computed('filteredFields.[]', function () {\n        let fields = this.get('filteredFields');\n        return fields.filterBy('repeatable');\n    }),\n\n    fieldSectionHasData: computed('fields.@each.isEmpty', 'editing', function () {\n        if (this.get('editing')) {\n            return true;\n        }\n\n        const fields = this.get('fieldData') || [];\n        return fields.some(field => !field.get('isEmpty'));\n    }),\n\n    canEditSection: computed(\n        'editingProfile',\n        'entity.id',\n        'session.user.isAdmin',\n        'profile.writeableSections.[]',\n        function () {\n            let editingProfile = this.get('editingProfile');\n            let permissions = this.get('profile.writeableSections');\n\n            if (this.get('session.user.isAdmin') && editingProfile) {\n                return true;\n            }\n\n            return permissions.indexOf(this.get('section.key')) !== -1 && editingProfile;\n        }\n    ),\n\n    hideAddNew: computed('section.key', 'section.fieldList', function () {\n        const sections = ['location', 'education', 'bio'];\n        return (\n            !sections.includes(this.get('section.key')) && isEmpty(this.get('section.fieldList').filterBy('repeatable'))\n        );\n    }),\n\n    disableSave: computed('entity.type', 'fieldData.@each.{isValid,isEmpty}', function () {\n        const fieldData = this.get('fieldData');\n        const isGroup = this.get('entity.type') === 'group';\n        const validFields = fieldData.map(data => {\n            const emptyCheck = ['weblink', 'email'];\n\n            if (emptyCheck.includes(data.get('field.type')) && !isGroup) {\n                return data.get('isValid') && !data.get('isEmpty');\n            }\n\n            return data.get('isValid');\n        });\n\n        return reject(validFields).length > 0;\n    }),\n\n    showEditAction: computed('canEditSection', 'editingProfile', 'editingSection', function () {\n        const canEditSection = this.get('canEditSection');\n        const editingProfile = this.get('editingProfile');\n        const editingSection = this.get('editingSection');\n\n        return canEditSection && editingProfile && !editingSection;\n    }),\n\n    showHeaderLock: computed('editingProfile', 'canEditSection', function () {\n        return this.get('editingProfile') && !this.get('canEditSection');\n    }),\n\n    showAddNew: computed('editing', 'hideAddNew', function () {\n        return this.get('editing') && !this.get('hideAddNew');\n    }),\n\n    onEditingChange: observer('editingProfile', function () {\n        Ember.run.once(this, 'handleEditingChange');\n    }),\n\n    onValidityChange: observer('disableSave', function () {\n        const disableModal = this.get('disableModal');\n        if (disableModal) {\n            Ember.run.once(this, disableModal, this.get('disableSave'));\n        }\n    }),\n\n    getFieldEntries(fields) {\n        return fields\n            .map(field => {\n                const entity = this.get('entity');\n                const path = field.get('fieldPath');\n                const repeatable = Ember.get(field, 'repeatable');\n\n                let values = this.get('entity').getFieldValue(path) || [];\n\n                if (isEmpty(values) && !this.get('hideEmptyValues')) {\n                    entity.set(path, '');\n                    values = entity.get(path);\n                }\n\n                if (repeatable) {\n                    return values.map(valueReference =>\n                        FieldData.create({\n                            entity,\n                            field,\n                            valueReference,\n                            session: this.get('session'),\n                            permissions: this.get('permissions')\n                        })\n                    );\n                }\n\n                return FieldData.create({\n                    entity,\n                    field,\n                    valueReference: values,\n                    session: this.get('session'),\n                    permissions: this.get('permissions')\n                });\n            })\n            .flat()\n            .filter(v => !!v);\n    },\n\n    handleEditingChange() {\n        this.set('editingSection', false);\n    },\n\n    reconcileNewFields() {\n        this.set('_newFields', []);\n    },\n\n    saveSection(reload = true) {\n        const intl = this.get('intl');\n        const notification = this.get('notification');\n        const entity = this.get('entity');\n        const section = this.get('section');\n\n        this.set('saving', true);\n\n        return entity\n            .saveSection(section)\n            .then(() => {\n                if (reload) {\n                    entity.reload();\n                }\n\n                if (Ember.get(section, 'key') === 'contactInfo' && this.get('session.features.emergencyLocation')) {\n                    return;\n                }\n                const title = intl.lookup('notification.titles.profileSave');\n                const message = intl.lookup('notification.fieldSection.saved');\n\n                notification.info(title, message, { markdownToHtml: false, tag: 'profile' });\n            })\n            .catch(response => {\n                const errors = response.errors || response.payload;\n                const error = !isEmpty(errors) && errors[0];\n\n                this.set('saving', false);\n\n                if (!error) {\n                    return Ember.RSVP.reject(response);\n                }\n\n                if (error.payload && error.payload.code === 'VERSION_MISMATCH') {\n                    return Ember.RSVP.resolve();\n                }\n\n                const statusCode = error.code || error.status;\n                if (statusCode === 500 || statusCode === 400) {\n                    let errorTitle = intl.lookup('notification.titles.profileSaveError');\n                    let errorMessage =\n                        error && error.detail ? error.detail : intl.lookup('notification.fieldSection.error');\n\n                    const title = error.title || (error.details && error.details.title);\n                    if (title) {\n                        // Check if its a duplicate error and let the user know\n                        const regex = /Duplicate value (?:.*) (.*)=[\\S]+/;\n                        const match = title.match(regex);\n                        if (match && match[1]) {\n                            const field = match[1];\n                            if (field === 'contactInfo.email_main') {\n                                errorMessage = intl.lookup('notification.fieldSection.duplicateEmailError');\n                            }\n                        }\n                    }\n\n                    notification.error(errorTitle, errorMessage, { markdownToHtml: false, tag: 'profile' });\n\n                    this.reset();\n                }\n\n                return Ember.RSVP.reject(response);\n            });\n    },\n\n    reset() {\n        return this.get('entity')\n            .reload()\n            .then(() => {\n                this.notifyPropertyChange('section');\n\n                let entity = this.get('entity');\n                let fieldPaths = this.get('section.fieldList').mapBy('fieldPath');\n                fieldPaths.forEach(path => {\n                    let currentValue = entity.getFieldValue(path);\n                    if (Array.isArray(currentValue)) {\n                        const tempValues = currentValue.filter(value => !!value.tempId);\n                        if (tempValues.length && currentValue.length) {\n                            entity.set(path, [], { overwrite: true });\n                        } else if (tempValues.length) {\n                            tempValues.forEach(value => {\n                                currentValue.removeObject(value);\n                            });\n                        }\n                    } else if (currentValue.tempId && !currentValue._id) {\n                        entity.set(path, [], { overwrite: true });\n                    }\n                });\n            });\n    },\n\n    scrollToNewField(fieldData) {\n        let elem = this.$().find(`[data-field-id=${fieldData.get('fieldId')}]`);\n        let parent = elem.parents('.field-section');\n        if (!isEmpty(elem)) {\n            let top = elem.position().top;\n            let parentTop = parent.position().top;\n            Ember.$('#orgspan').animate(\n                {\n                    scrollTop: top + parentTop\n                },\n                600\n            );\n        }\n    },\n\n    setupInstructionText() {\n        let text = this.get('instructionText');\n        if (text) {\n            this.$('.title').tooltip({\n                title: text,\n                placement: 'right'\n            });\n        }\n    },\n\n    _updateMasonry() {\n        rerunLayouts();\n    },\n\n    updateMasonry() {\n        Ember.run(() => Ember.run.scheduleOnce('afterRender', this, this._updateMasonry));\n    }\n});\n","import Ember from 'ember';\nimport { task, waitForQueue } from 'ember-concurrency';\nimport EmergencyLocationUtil from 'connections-ui/utils/emergency-location-util';\n\nimport _ from 'lodash';\n\nimport EntityFieldSection from '../component';\n\nimport ContactInfoGroup from './contact-info-group';\n\nconst { inject, computed } = Ember;\n\nfunction keyForField(field) {\n    let type = field.type;\n    let key = field.key;\n\n    if (_.includes(['email', 'phone', 'address'], type)) {\n        return type;\n    } else if (_.includes(['im', 'address'], key) || type === 'multiline-text') {\n        return key;\n    } else {\n        return 'other';\n    }\n}\n\nexport default EntityFieldSection.extend({\n    intl: inject.service(),\n    session: inject.service(),\n    notification: inject.service('notification-proxy'),\n\n    hideAddNew: false,\n    hideEmptyValues: true,\n    hideFooterRemoveButton: true,\n    updatedElocationAddress: {\n        street1: '',\n        street2: '',\n        city: '',\n        state: '',\n        zipcode: '',\n        country: ''\n    },\n\n    previewAddress: {\n        street1: '',\n        street2: '',\n        city: '',\n        state: '',\n        zipcode: '',\n        country: ''\n    },\n\n    previewAddressisEligible: false,\n\n    excludedFields: ['chat', 'voicemailEnabled'],\n\n    _groupedContactInfo: null,\n\n    actions: {\n        editSection() {\n            if (this.editElocation && this.get('session.features.emergencyLocation')) {\n                this.editElocation();\n            }\n            this._super(...arguments);\n        },\n\n        saveSection() {\n            const intl = this.get('intl');\n            const entity = this.get('entity');\n            const primaryContactSection = this.get('entity.fieldConfig.primaryContactInfo');\n            const latestPrimaryContactInfo = _.clone(this.get('entity.primaryContactInfo'));\n\n            this.set('saving', true);\n\n            this.saveSection(false)\n                .then(() => {\n                    // cant set non-existent fields as primary...so delay primary saving\n                    if (!this.get('session.features.emergencyLocation')) {\n                        this.set('saving', false);\n                        this.set('editingSection', false);\n                    }\n                    return this.reconcilePrimaryContact(latestPrimaryContactInfo);\n                })\n                .then(() => {\n                    return entity.saveSection(primaryContactSection);\n                })\n                .then(() => {\n                    const errorField = this.get('_newFields').find(field => {\n                        return !_.isEmpty(field.get('value.rel.errorCode'));\n                    });\n\n                    if (errorField) {\n                        const title = intl.lookup('notification.titles.profileContactInfoError');\n                        const message = intl.lookup('notification.fieldSection.contactInfoError');\n                        this.get('notification').error(title, message);\n                    }\n                })\n                .finally(() => {\n                    entity.reload();\n\n                    Ember.run.once(this, 'reconcileNewFields');\n\n                    if (this.get('session.features.emergencyLocation')) {\n                        const isAddressEmpty =\n                            !this.get('updatedElocationAddress.city') &&\n                            !this.get('updatedElocationAddress.street1') &&\n                            !this.get('updatedElocationAddress.street2') &&\n                            !this.get('updatedElocationAddress.state') &&\n                            !this.get('updatedElocationAddress.zipcode');\n\n                        if (this.saveElocation && !isAddressEmpty) {\n                            return this.saveElocation(this.get('updatedElocationAddress'));\n                        } else if (this.refreshAllEmergencylocationInfo) {\n                            //Should run this in case user changes from a primary number that is not E911 capable to one that is.\n                            return this.refreshAllEmergencylocationInfo(true); //notify=true\n                        }\n                    } else {\n                        return Ember.RSVP.resolve();\n                    }\n                })\n                .then(() => {\n                    if (this.get('session.features.emergencyLocation')) {\n                        const title = intl.lookup('notification.titles.profileSave');\n                        const message = intl.lookup('notification.fieldSection.saved');\n                        this.get('notification').info(title, message, { markdownToHtml: false, tag: 'profile' });\n                        if (this.cancelEditElocation) {\n                            this.cancelEditElocation();\n                        }\n                        this.set('editingSection', false);\n                    }\n                })\n                .catch(errObject => {\n                    if (errObject.softError && !errObject.hardError) {\n                        //If only inline custom errors\n                        //softError are handled in the service\n                        if (this.cancelEditElocation) {\n                            this.cancelEditElocation();\n                        }\n                        this.set('editingSection', false);\n                        return;\n                    }\n                    if (this.get('session.features.emergencyLocation')) {\n                        const title = intl.lookup('emergencyLocation.errors.title');\n                        const hardErrorMessage = errObject.hardError ? errObject.hardError : '';\n                        const defaultErrorMessage = intl.lookup('emergencyLocation.errors.e911LocationSet');\n\n                        const message = hardErrorMessage || defaultErrorMessage;\n                        this.get('notification').error(title, message);\n                    }\n                })\n                .finally(() => {\n                    this.set('saving', false);\n                    if (!this.get('session.features.emergencyLocation')) {\n                        this.set('editingSection', false);\n                    }\n                });\n        },\n\n        updateElocationOnChange(updatedAddress) {\n            this.set('updatedElocationAddress', updatedAddress);\n        },\n\n        addNewEntry(group) {\n            const field = group.get('field') || group.get('repeatableField') || group;\n            this._super(field);\n        },\n\n        removeContactSection(fieldData, group) {\n            _.forEach(fieldData, field => {\n                this._super(field);\n            });\n\n            const groupedFieldData = this.get('_groupedContactInfo');\n            if (groupedFieldData) {\n                groupedFieldData.removeObject(group);\n            }\n        },\n\n        removeEntry(fieldData) {\n            let key = keyForField(fieldData.get('field'));\n            let group = this.get('groupedContactInfo').findBy('key', key);\n            if (group) {\n                group.get('fieldData').removeObject(fieldData);\n\n                if (fieldData.get('isPrimaryField')) {\n                    this.removePrimaryContact(fieldData);\n                }\n\n                this._super(...arguments);\n            }\n        },\n        setPrimaryCallback(phoneNumber) {\n            if (!this.get('session.features.emergencyLocation')) {\n                return;\n            }\n            if (this.getEmergencyLocation) {\n                this.getEmergencyLocation(phoneNumber)\n                    .then(response => {\n                        this.set('previewAddressIsEligible', true);\n                        this.set('previewAddress', response.address);\n                    })\n                    .catch(err => {\n                        this.set('previewAddressIsEligible', false);\n                        this.set('previewAddress', {\n                            street1: '',\n                            street2: '',\n                            city: '',\n                            state: '',\n                            zipcode: '',\n                            country: ''\n                        });\n\n                        const errorMessage = this.get('intl').lookup(EmergencyLocationUtil.getErrorString(err));\n                        this.set('previewAddressError', errorMessage);\n                    });\n            }\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n        this.set('_groupedContactInfo', []);\n    },\n\n    didReceiveAttrs() {\n        const editingElocation = this.get('editingElocation');\n        if (this.get('session.features.emergencyLocation') && editingElocation) {\n            this.get('setEditingSection').perform(editingElocation);\n        }\n    },\n\n    setEditingSection: task(function* (editingElocation) {\n        yield waitForQueue('actions');\n        this.set('editingSection', editingElocation);\n        const phoneNumber =\n            this.get('emergencyLocationData.primaryVoice.number') ||\n            this.get('emergencyLocationData.primaryVoice.display');\n        if (phoneNumber) {\n            this.get('actions.setPrimaryCallback').call(this, phoneNumber);\n        }\n    }).restartable(),\n\n    groupedContactInfo: computed('entity.id', 'fieldData', 'fieldData.[]', 'fieldData.@each.', function () {\n        return this.handleData(this.get('fieldData'));\n    }),\n\n    missingData: computed('filteredFields.[]', 'fieldData.[]', function () {\n        let fields = this.get('filteredFields');\n        let fieldData = this.get('fieldData');\n        let missingFields = _.difference(fields, fieldData.mapBy('field'));\n        return _.reject(missingFields, field => {\n            let type = field.get('type');\n            return fieldData.filterBy('field.type', type).length > 0;\n        });\n    }),\n\n    fieldValuesToAdd: computed('missingData.[]', function () {\n        let fields = this.get('missingData');\n        return fields.filterBy('repeatable');\n    }),\n\n    disableSave: computed('groupedContactInfo.@each.disableSave', function () {\n        const fieldData = this.get('groupedContactInfo');\n        const disableSave = fieldData.mapBy('disableSave');\n        return _.filter(disableSave).length > 0;\n    }),\n\n    handleData(data) {\n        return _.chain(data)\n            .groupBy(fieldData => {\n                return keyForField(fieldData.get('field'));\n            })\n            .map((fieldData, key) => {\n                let data = {\n                    key,\n                    fieldData,\n                    section: this.get('section')\n                };\n\n                Ember.setOwner(data, Ember.getOwner(this));\n\n                return ContactInfoGroup.create(data);\n            })\n            .filter()\n            .value();\n    },\n\n    removePrimaryContact(fieldData) {\n        let entity = this.get('entity');\n        let type = fieldData.get('field.type');\n        if (type === 'phone') {\n            type = 'voice';\n        }\n\n        let path = `primaryContactInfo.${type}`;\n        entity.set(path, [], { overwrite: true });\n    },\n\n    reconcilePrimaryContact(latestPrimaryContactInfo) {\n        let fields = this.get('fieldData');\n        let entity = this.get('entity');\n        let primaryContactCollection = [];\n        fields.rejectBy('isEmpty').forEach(fieldData => {\n            let type = fieldData.get('field.type');\n            if (type === 'phone') {\n                type = 'voice';\n            }\n\n            let primary = Ember.get(latestPrimaryContactInfo, type);\n            this._storePrimary(primary, type, fieldData, primaryContactCollection);\n            if (type === 'voice') {\n                // run the voice primary checks for SMS as well\n                type = 'sms';\n                primary = Ember.get(latestPrimaryContactInfo, type);\n                this._storePrimary(primary, type, fieldData, primaryContactCollection);\n            }\n        });\n\n        return entity.reload().then(() => {\n            _.forEach(primaryContactCollection, contact => {\n                entity.setPrimaryContact(contact.type, contact.value, contact.fieldPath, contact.fieldData);\n            });\n        });\n    },\n\n    _storePrimary(primary, type, fieldData, collection) {\n        if (_.isEmpty(primary)) {\n            return;\n        }\n        let fieldPath = fieldData.get('field.fieldPath');\n        let fieldDataId = fieldData.get('fieldId');\n        primary = primary[0];\n\n        let equalFieldIds = primary.value.fieldId === fieldDataId;\n        let equalFieldPaths = primary.value.fieldPath === fieldPath;\n\n        // New fields also set to primary have a temp id generated using Ember.generateGuid\n        let isNewFieldValue = primary.value.fieldId.indexOf('ember') === 0;\n\n        // New fields will at least match the field path, if not the field id (different temp id)\n        if (isNewFieldValue && !equalFieldIds && equalFieldPaths) {\n            // Lets also check for value equal on extension or number\n            let value = fieldData.get('value.value');\n            let valueNumber = value.number;\n            let primaryNumber = primary.ref.number;\n\n            // Sometimes we will have formatting\n            if (valueNumber && valueNumber.replace) {\n                valueNumber = valueNumber.replace(/[-\\s]/gi, '');\n            }\n            if (primaryNumber && primaryNumber.replace) {\n                primaryNumber = primaryNumber.replace(/[-\\s]/gi, '');\n            }\n\n            if (primary.ref.extension === value.extension || primaryNumber === valueNumber) {\n                collection.push({\n                    type,\n                    fieldPath,\n                    fieldData,\n                    value: fieldData.get('value')\n                });\n            }\n        } else if (primary.value && equalFieldPaths && equalFieldIds) {\n            collection.push({\n                type,\n                fieldPath,\n                fieldData,\n                value: fieldData.get('value')\n            });\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['contact-group-choices'],\n\n    entity: null,\n\n    field: null,\n    entry: null,\n\n    showDropdown: false,\n\n    currentLabel: computed.reads('field.i18nLabel'),\n\n    fieldChoices: computed('field', 'entry', function () {\n        let keys = this.get('field.labelKeys');\n        let entity = this.get('entity');\n        let field = this.get('field');\n        let path = field.get('fieldPath').replace(/\\./gi, '_');\n        return _.map(keys, function (key) {\n            return {\n                field,\n                keyPath: `${entity.get('type')}_${path}_labelKey_${key}`\n            };\n        });\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"a/PgzvrS\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"field\\\",\\\"repeatable\\\"]]],null,{\\\"statements\\\":[[6,[\\\"drop-down\\\"],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[28,[\\\"showDropdown\\\"]],\\\"entity-field-section.entity-contact-info.contact-group-choices\\\"]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"menu-selector dropdown-button\\\"],[15,\\\"type\\\",\\\"button\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[13],[1,[26,[\\\"currentLabel\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-caret-down\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"show\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"fieldChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"clickable\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[[28,[\\\"choice\\\",\\\"keyPath\\\"]]],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"choice\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"span\\\",[]],[13],[1,[26,[\\\"currentLabel\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-contact-info/contact-group-choices/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed } = Ember;\n\nexport default Ember.Object.extend({\n    intl: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n\n    key: null,\n    field: null,\n    section: null,\n    fieldData: [],\n\n    label: computed('key', function () {\n        return this.get('intl').lookup(`entity.fieldTypes.${this.get('key')}.name`);\n    }),\n\n    addNewLabel: computed('key', function () {\n        return this.get('intl').lookup(`entity.fieldTypes.${this.get('key')}.addNew`);\n    }),\n\n    isEmpty: computed('fieldData', 'fieldData.@each.isEmpty', 'field', function () {\n        let emptyFields = this.get('fieldData').mapBy('isEmpty');\n        return emptyFields && _.reject(emptyFields).length === 0;\n    }),\n\n    containsRepeatable: computed('fieldData.[]', 'field', 'repeatableField', function () {\n        let field = this.get('field') || this.get('repeatableField');\n        if (field) {\n            return field.get('repeatable');\n        }\n\n        return this.get('fieldData').filterBy('field.repeatable').length > 0;\n    }),\n\n    repeatableField: computed('fieldData.[]', 'key', 'section', function () {\n        let key = this.get('key');\n        return this.get('section.fieldList')\n            .filterBy('repeatable')\n            .find(function (field) {\n                return field.get('key') === key || field.get('type') === key;\n            });\n    }),\n\n    disableSave: computed('fieldData.[]', 'fieldData.@each.isValid', function () {\n        const fieldData = this.get('fieldData');\n        let validFields = fieldData.map(data => {\n            let emptyCheck = ['weblink', 'email'];\n\n            if (_.includes(emptyCheck, data.get('field.type'))) {\n                return data.get('isValid') && !data.get('isEmpty');\n            }\n\n            return data.get('isValid');\n        });\n\n        return _.reject(validFields).length > 0;\n    }),\n\n    isPhone: computed.equal('key', 'phone'),\n    isEmail: computed.equal('key', 'email'),\n    isIm: computed.equal('key', 'im'),\n    isAddress: computed.equal('key', 'address'),\n\n    showHeadings: computed('isPhone', 'isEmail', 'permissions.canEditProfiles', function () {\n        if (this.get('isEmail')) {\n            return this.get('permissions.canEditProfiles');\n        }\n        return this.get('isPhone');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"GkUYy3xB\",\"block\":\"{\\\"statements\\\":[[19,\\\"components/entity-field-section/-section-header\\\"],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"sectionInfo\\\",\\\"empty\\\"]],[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"p\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"fieldSectionHasData\\\"]],\\\"hidden\\\",\\\"no-data\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.sectionEmpty\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"groupedContactInfo\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-group entries field-entries contact-info-\\\",[28,[\\\"group\\\",\\\"key\\\"]],\\\"-type\\\\n                    \\\",[33,[\\\"if\\\"],[[28,[\\\"group\\\",\\\"isEmpty\\\"]],\\\"empty-group\\\"],null],\\\"\\\\n                    \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null],[28,[\\\"group\\\",\\\"isEmpty\\\"]]],null],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"heading-label\\\"],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"4\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-label\\\"],[16,\\\"id\\\",[34,[\\\"heading-label-\\\",[28,[\\\"group\\\",\\\"key\\\"]]]]],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"group\\\",\\\"label\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[33,[\\\"or\\\"],[[28,[\\\"group\\\",\\\"isIm\\\"]],[28,[\\\"group\\\",\\\"isAddress\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-label remove-section clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"removeContactSection\\\",[28,[\\\"group\\\",\\\"fieldData\\\"]],[28,[\\\"group\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-remove-section\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"group\\\",\\\"showHeadings\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"headings\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[16,\\\"id\\\",[34,[\\\"primary-\\\",[28,[\\\"group\\\",\\\"key\\\"]]]]],[15,\\\"class\\\",\\\"primary\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"group\\\",\\\"isPhone\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"field.primaryVoice\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.primary\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"group\\\",\\\"isPhone\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[16,\\\"id\\\",[34,[\\\"primary-sms-\\\",[28,[\\\"group\\\",\\\"key\\\"]]]]],[15,\\\"class\\\",\\\"accept-sms\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"field.primarySMS\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-values entry-values\\\"],[15,\\\"role\\\",\\\"group\\\"],[16,\\\"aria-labelledby\\\",[34,[\\\"heading-label-\\\",[28,[\\\"group\\\",\\\"key\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"group\\\",\\\"fieldData\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-entry\\\\n                                \\\",[28,[\\\"fieldData\\\",\\\"field\\\",\\\"type\\\"]],\\\"-field\\\\n                                \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null],[28,[\\\"fieldData\\\",\\\"isEmpty\\\"]]],null],\\\"hide\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null]]]],[16,\\\"data-field-id\\\",[34,[[28,[\\\"fieldData\\\",\\\"fieldId\\\"]]]]],[13],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"emergencyLocationOn\\\"]],[33,[\\\"eq\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\",\\\"componentName\\\"]],\\\"entity-fields/phone-field\\\"],null]],null]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\",\\\"componentName\\\"]]],[[\\\"entity\\\",\\\"editing\\\",\\\"fieldData\\\",\\\"showLabel\\\",\\\"setPrimaryCallback\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"fieldData\\\"]],true,[33,[\\\"action\\\"],[[28,[null]],\\\"setPrimaryCallback\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\",\\\"componentName\\\"]]],[[\\\"entity\\\",\\\"editing\\\",\\\"fieldData\\\",\\\"showLabel\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"fieldData\\\"]],true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"and\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\",\\\"repeatable\\\"]],[28,[\\\"editing\\\"]]],null],[28,[\\\"fieldData\\\",\\\"removable\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeEntry\\\",[28,[\\\"fieldData\\\"]]]],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-remove-value\\\"],[13],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"fieldData\\\"]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"group\\\",\\\"containsRepeatable\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-new-value\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-flat btn-sm add-new-value\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"addNewEntry\\\",[28,[\\\"group\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"+\\\"],[14],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"group\\\",\\\"addNewLabel\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"group\\\"]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"emergencyLocationOn\\\"]],[28,[\\\"onOwnProfile\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content emergency-location-section\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-group entries field-entries\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-entry-container field-entry text-field \\\",[33,[\\\"if\\\"],[[28,[\\\"editingElocation\\\"]],\\\"editing\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"emergency-location\\\"],null,[[\\\"emergencyLocationData\\\",\\\"editingElocation\\\",\\\"showResetButton\\\",\\\"personId\\\",\\\"showTitle\\\",\\\"showTitleIcons\\\",\\\"previewAddress\\\",\\\"previewAddressIsEligible\\\",\\\"previewAddressError\\\",\\\"saving\\\",\\\"updateElocationOnChange\\\"],[[28,[\\\"emergencyLocationData\\\"]],[28,[\\\"editingElocation\\\"]],false,[28,[\\\"personId\\\"]],true,false,[28,[\\\"previewAddress\\\"]],[28,[\\\"previewAddressIsEligible\\\"]],[28,[\\\"previewAddressError\\\"]],[28,[\\\"saving\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"updateElocationOnChange\\\"],null]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showRemoveSectionModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"extraClassNames\\\",\\\"showHeader\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"confirm\\\",\\\"cancel\\\"],[\\\"remove-section-confirmation\\\",false,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],[33,[\\\"t\\\"],[\\\"common.confirm\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSection\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelRemoveSection\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"p\\\",[]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[19,\\\"components/entity-field-section/-section-footer\\\"],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":true}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-contact-info/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport EntityFieldSection from '../component';\nimport template from '../template';\n\nconst { computed } = Ember;\n\nexport default EntityFieldSection.extend({\n    layout: template,\n\n    disableAddValueDropdown: true,\n\n    fallbackToEmptyLabel: true,\n\n    actions: {\n        toggleAddValue() {\n            this.send('addNewEntry', this.get('section.fieldList.0'));\n        }\n    },\n\n    canAddNew: computed('fieldData.[]', function () {\n        let fieldData = this.get('fieldData');\n        let empties = fieldData.filterBy('isEmpty', true);\n        return empties.length < 1;\n    }),\n\n    disableSave: computed('fieldData.@each.{isValid,isEmpty}', function () {\n        let fieldData = this.get('fieldData');\n        let validFields = fieldData.map(field => {\n            return field.get('isValid') && !field.get('isEmpty');\n        });\n\n        return _.reject(validFields).length > 0;\n    })\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport EntityFieldSection from '../component';\n\nconst { computed } = Ember;\n\nexport default EntityFieldSection.extend({\n    classNames: ['entity-groups'],\n\n    actions: {\n        changeGroups(group) {\n            this.set('showMore', false);\n            this.set('activeKey', group);\n        },\n\n        toggleMore() {\n            this.toggleProperty('showMore');\n        }\n    },\n\n    allKeys: null,\n    activeKey: null,\n\n    showMore: false,\n    flowTabsInline: true,\n\n    init() {\n        this._super(...arguments);\n\n        const entity = this.get('entity');\n        const fieldConfig = entity.get('fieldConfig');\n\n        const hasOfficialField = !!fieldConfig.getFieldByKey('groups.official');\n        const hasSocialField = !!fieldConfig.getFieldByKey('groups.social');\n\n        const allKeys = [];\n        if (hasOfficialField) {\n            allKeys.push('official');\n        }\n        if (hasSocialField) {\n            allKeys.push('social');\n        }\n\n        let activeKey = 'official';\n        if (!hasOfficialField) {\n            activeKey = hasSocialField ? 'social' : 'owned';\n        }\n\n        this.setProperties({\n            allKeys,\n            activeKey,\n            hasSocialField,\n            hasOfficialField\n        });\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        let section = this.get('sectionInfo');\n        let promises = this.get('allKeys').map(key => this.getGroups(key));\n\n        Ember.RSVP.all(promises).then(function (results) {\n            let groups = _.flatten(results);\n            section.set('isEmpty', groups.length === 0);\n        });\n\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            const title = this.$('.title');\n            const tabs = this.$('.nav-tabs li');\n            if (title && !_.isEmpty(tabs)) {\n                const titleWidth = title.width();\n                const tabWidth = _.chain(tabs)\n                    .map(tab => Ember.$(tab).width())\n                    .reduce((acc, val) => val + acc, 0);\n                this.set('flowTabsInline', tabWidth + titleWidth < this.$().width());\n            }\n        });\n    },\n\n    canEditSection: computed(function () {\n        return false;\n    }),\n\n    activeGroups: computed('entity.id', 'activeKey', 'showMore', function () {\n        let promise = this.getGroups(this.get('activeKey')).then(groups => {\n            if (!this.get('showMore')) {\n                return _.slice(groups, 0, 4);\n            }\n            return groups;\n        });\n\n        return DS.PromiseArray.create({ promise });\n    }),\n\n    section: computed('entity.fieldConfig.groups', function () {\n        return this.get('entity.fieldConfig.groups');\n    }),\n\n    shouldShowMore: computed('activeKey', function () {\n        let promise = this.getGroups(this.get('activeKey')).then(groups => {\n            return groups.length > 4;\n        });\n\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    getGroups(key) {\n        return this.get(`entity.${key}Groups`);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"PlHuty2R\",\"block\":\"{\\\"statements\\\":[[19,\\\"components/entity-field-section/-section-header\\\"],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content tab-container\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"nav nav-tabs nav-tabs-flex\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasOfficialField\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"nav-tab-official active\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#official\\\"],[15,\\\"data-toggle\\\",\\\"tab\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"changeGroups\\\",\\\"official\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"server_translations.group_general_groupType_labelKey_groups_official\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"hasSocialField\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"nav-tab-social\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#social\\\"],[15,\\\"data-toggle\\\",\\\"tab\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"changeGroups\\\",\\\"social\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"server_translations.group_general_groupType_labelKey_groups_social\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"nav-tab-owned\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#owned\\\"],[15,\\\"data-toggle\\\",\\\"tab\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"changeGroups\\\",\\\"owned\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.owned\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"activeGroups\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"activeGroups\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"group \\\",[28,[\\\"group\\\",\\\"groupType\\\"]]]]],[16,\\\"title\\\",[28,[\\\"group\\\",\\\"name\\\"]],null],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"size\\\",\\\"entity\\\",\\\"isLinkable\\\",\\\"enableMiniCard\\\",\\\"canViewChat\\\",\\\"canViewVideo\\\"],[96,[28,[\\\"group\\\"]],true,true,[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]]]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"group.detail\\\",[28,[\\\"group\\\",\\\"id\\\"]]],[[\\\"classNames\\\"],[\\\"name\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[28,[\\\"group\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"group\\\"]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"group-message\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.noGroupMemberships\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"error\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"group-message error\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.loadError\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"group-message group-loading-message\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"common.loading\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"shouldShowMore\\\"]],[28,[\\\"activeGroups\\\",\\\"isFulfilled\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"class\\\",[34,[\\\"show-more-less \\\",[33,[\\\"if\\\"],[[28,[\\\"showMore\\\"]],\\\"showing-more\\\",\\\"showing-less\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleMore\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showMore\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.showLess\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.showMore\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":true}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-groups/template.hbs\"}});","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nimport EntityFieldSection from '../component';\nimport template from '../template';\n\nconst { computed } = Ember;\n\nexport default EntityFieldSection.extend(LoggerMixin, {\n    layout: template,\n\n    scrollOnAddNew: false,\n    disableAddValueDropdown: true,\n\n    _cachedGroupFieldData: [],\n    _cachedLocations: [],\n\n    actions: {\n        toggleAddValue() {\n            this.send('addNewEntry', this.get('section.fieldList.0'));\n        },\n\n        removeEntry(fieldData) {\n            let entity = this.get('entity');\n            let field = fieldData.get('field');\n            let entry = fieldData.get('entry');\n            let location = fieldData.get('_sectionLocation');\n            let path = field.getFieldPath();\n            let fields = this.get('fieldData');\n            let currentEntry = fields.findBy('_sectionLocation', location);\n\n            fields.removeObject(currentEntry);\n            entity.getFieldValue(path).removeObject(entry);\n        }\n    },\n\n    disableSave: computed(function () {\n        return false;\n    }),\n\n    getFieldEntries() {\n        const entries = this._super(...arguments);\n        return entries.filter(entry => {\n            const value = entry.get('value');\n            if (value.value) {\n                const location = value.value;\n                if (location && !location.locationId) {\n                    this.logger.warn('Location without id encountered. Removing.');\n                    return false;\n                }\n            }\n            return true;\n        });\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport Profile from '../../entity-profile/profiles/profile';\nimport EntityFieldSection from '../component';\n\nimport { BASE_PERSON } from '../../../models/person';\n\nimport RelationshipGroup from './relationship-group';\n\nconst { inject, getOwner, computed } = Ember;\n\nexport default EntityFieldSection.extend({\n    classNames: ['entity-relationships'],\n\n    intl: inject.service(),\n    store: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n\n    scrollOnAddNew: false,\n    disableAddValueDropdown: true,\n\n    viewingMore: { siblings: false, reports: false },\n\n    _relationships: null,\n\n    actions: {\n        toggleAddValue() {\n            const field = this.get('repeatableField');\n            this.send('addNewEntry', field);\n        },\n\n        addNewEntry(field) {\n            this._super(...arguments);\n\n            const entity = this.get('entity');\n            const path = field.get('fieldPath');\n            const fieldValue = _.last(entity.get(path));\n\n            const count = this.get('otherRelationships.length');\n            const key = this.get('intl').t('person.relationships.relationship', { count: !!count ? count : count + 1 });\n\n            Ember.set(fieldValue, 'labelKey', key);\n            this.set('otherRelationships.lastObject.key', key);\n\n            this.notifyPropertyChange('otherRelationshipValues');\n        },\n\n        updatedField(relationshipGroup) {\n            let excludedFields = this.get('excludedFields');\n            let fieldPath = relationshipGroup.get('fieldPath');\n            if (!fieldPath || relationshipGroup.get('isOtherRelationship')) {\n                return;\n            }\n\n            let fieldKey = fieldPath.split('.')[1];\n            if (relationshipGroup.get('people.length') === 0) {\n                excludedFields.removeObject(fieldKey);\n            } else {\n                excludedFields.addObject(fieldKey);\n            }\n        },\n\n        removeSection() {\n            let reports = this.get('relationships').findBy('key', 'defaultReports');\n            let promise = Ember.RSVP.resolve();\n            if (reports && reports.get('promise')) {\n                promise = reports.get('promise').then(people => {\n                    if (people) {\n                        people.forEach(person => {\n                            reports.removePerson(person);\n                        });\n                    }\n                });\n            }\n\n            return promise.then(() => {\n                let entity = this.get('entity');\n                let fieldList = this.get('section.fieldList');\n                fieldList.forEach(field => {\n                    let path = field.get('fieldPath');\n                    if (entity.get(path)) {\n                        entity.set(path, [], { overwrite: true });\n                    }\n                });\n\n                return this.saveReports()\n                    .then(() => this.saveSection())\n                    .then(() => {\n                        this.set('sectionInfo.adding', false);\n                        this.set('sectionInfo.editingSection', false);\n\n                        this.attrs.removeSection(this.get('sectionInfo'));\n\n                        this.send('cancelRemoveSection');\n                    });\n            });\n        },\n\n        saveSection() {\n            const intl = this.get('intl');\n            const notification = this.get('notification');\n\n            this.set('saving', true);\n\n            this.saveReports()\n                .then(() => this.saveSection())\n                .then(() => {\n                    this.set('saving', false);\n                    this.set('editingSection', false);\n                })\n                .then(() => {\n                    // Cache bust!\n                    this.get('entity').clearDirectReportsCache();\n                })\n                .catch(err => {\n                    const title = intl.lookup('notification.titles.profileSaveError');\n                    const message = intl.lookup('notification.fieldSection.error');\n                    notification.error(title, message);\n\n                    this.set('saving', false);\n                    this.set('editingSection', false);\n\n                    this.reset().then(() => {\n                        this.notifyPropertyChange('allRelationships');\n                    });\n\n                    return Ember.RSVP.reject(err);\n                });\n        },\n\n        updatedLabel() {\n            const fields = this.get('otherRelationships').filter(field => {\n                return _.isEmpty(field.get('label'));\n            });\n            this.set('disableSave', fields.length !== 0);\n        }\n    },\n\n    section: computed('entity.fieldConfig.relationships', function () {\n        return this.get('entity.fieldConfig.relationships');\n    }),\n\n    manager: computed.reads('entity.manager'),\n    management: computed.reads('entity.superiors'),\n    assistants: computed.reads('entity.adminAssistants'),\n    defaultReports: computed.reads('filteredReports'),\n    defaultSiblings: computed.reads('filteredSiblings'),\n\n    init() {\n        this._super(...arguments);\n        this.set('_relationships', []);\n    },\n\n    relationships: computed('entity.id', 'otherRelationships.[]', 'assistants.[]', 'management.[]', function () {\n        let relationshipKeys = ['management', 'defaultReports', 'defaultSiblings', 'assistants'];\n\n        const cachedGroups = this.get('_relationships');\n        if (cachedGroups && cachedGroups.length > 0) {\n            // Set relationship promise so that reloads can happen if necessary\n            cachedGroups.forEach(group => {\n                const key = group.get('key');\n                const promise = this.get(key);\n                group.set('promise', promise);\n            });\n            return cachedGroups;\n        }\n\n        const groups = relationshipKeys.map(key => {\n            let entity = this.get('entity');\n            let relationship = this.get(key);\n\n            if (!relationship) {\n                return;\n            }\n\n            let data = {\n                key: key,\n                entity: entity,\n                promise: relationship\n            };\n\n            Ember.setOwner(data, Ember.getOwner(this));\n\n            return RelationshipGroup.create(data);\n        });\n\n        this.set('_relationships', groups);\n\n        return groups;\n    }),\n\n    otherRelationships: computed('otherRelationshipValues', function () {\n        const entity = this.get('entity');\n        const values = this.get('otherRelationshipValues');\n        return Object.keys(values).map(key => {\n            const value = values[key];\n            let promise = Ember.RSVP.resolve([]);\n            const ids = value.mapBy('value').reject(id => !id);\n            if (ids && !_.isEmpty(ids) && ids[0]) {\n                promise = this.get('store').findByIds('person', ids, BASE_PERSON);\n            }\n\n            let data = {\n                key,\n                promise,\n                entity: entity\n            };\n\n            Ember.setOwner(data, Ember.getOwner(this));\n\n            return RelationshipGroup.create(data);\n        });\n    }),\n\n    allRelationships: computed('otherRelationships.[]', function () {\n        return [].concat(this.get('relationships'), this.get('otherRelationships'));\n    }),\n\n    otherRelationshipValues: computed('entity.relationships.relationships.[]', function () {\n        const entity = this.get('entity');\n        const values = entity.getFieldValue('relationships.relationships');\n        // Fallback to incorrect form of \"labelkey\" due to directory bug\n        return _.groupBy(values, v => v.labelKey || v.labelkey);\n    }),\n\n    filteredReports: computed.reads('entity.directReports'),\n    filteredSiblings: computed('entity.siblings', function () {\n        let promise = this.get('entity.siblings').then(siblings => {\n            return siblings.filter(sibling => {\n                return sibling.get('id') !== this.get('entity.id');\n            });\n        });\n\n        return DS.PromiseArray.create({\n            promise\n        });\n    }),\n\n    readableFieldPaths: computed('entity.id', function () {\n        let profile = Profile.getProfileForModel(this.get('entity'), getOwner(this));\n        return profile.getReadableFieldPathsForSection(this.get('section'));\n    }),\n\n    repeatableField: computed('filteredFields.[]', function () {\n        return this.get('filteredFields')\n            .filter(field => {\n                return field.get('repeatable') && field.get('customLabels');\n            })\n            .find(field => {\n                const key = field.get('key');\n                return key === 'relationships';\n            });\n    }),\n\n    hideAddNew: computed('repeatableField', function () {\n        return _.isEmpty(this.get('repeatableField'));\n    }),\n\n    canAddMultiple: computed('repeatableField', function () {\n        return this.get('repeatableField.customLabels');\n    }),\n\n    excludedFields: computed('relationships.[]', function () {\n        return ['directReportCount'];\n    }),\n\n    saveReports() {\n        let promise = Ember.RSVP.resolve();\n        let reports = this.get('relationships').findBy('key', 'defaultReports');\n\n        if (reports && reports.get('reportsToSave')) {\n            let people = reports.get('reportsToSave');\n            let section = this.get('section');\n            let promises = people.map(person => {\n                // we have to load permissions before saving...this is unconventional\n                return person.get('readWritePermissions').then(() => person.saveSection(section));\n            });\n            promise = Ember.RSVP.all(promises);\n\n            reports.set('reportsToSave', []);\n        }\n\n        return promise;\n    }\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport forEachRight from 'lodash/forEachRight';\nimport isEmpty from 'lodash/isEmpty';\nimport uniqBy from 'lodash/uniqBy';\n\nconst { set, inject, computed, observer, Component } = Ember;\n\nconst LIMIT = 15;\n\nfunction getNextPerson(orderedPeople, people, person) {\n    if (person && person.get && person.get('id')) {\n        orderedPeople.pushObject(person);\n        const manager = person.getFieldValue('relationships.manager');\n        if (!manager) {\n            return;\n        }\n        const nextPerson = people.find(p => {\n            return p.get('id') === manager.guid;\n        });\n\n        if (!nextPerson) {\n            return;\n        }\n        return getNextPerson(orderedPeople, people, nextPerson);\n    }\n}\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['field-component', 'relationship-field'],\n\n    intl: inject.service(),\n\n    entity: null,\n    editing: false,\n    relationship: null,\n    fieldValuesToAdd: [],\n\n    showingMore: false,\n\n    people: null,\n\n    attrs: {\n        onUpdateLabel: () => {},\n        onUpdateField: () => {}\n    },\n\n    actions: {\n        selectPerson(person) {\n            const relationship = this.get('relationship');\n            relationship.addPerson(person);\n            this.get('onUpdateField')(relationship);\n        },\n\n        removePerson(person) {\n            const relationship = this.get('relationship');\n            relationship.removePerson(person);\n            this.get('onUpdateField')(relationship);\n        },\n\n        removeRelationship() {\n            let shouldRemove = true;\n            if (this.get('relationship.people.length')) {\n                const message = this.get('intl').lookup('person.relationships.confirmRemove').toString();\n                shouldRemove = confirm(message);\n            }\n\n            if (shouldRemove) {\n                const relationship = this.get('relationship');\n                if (relationship.get('isOtherRelationship')) {\n                    const key = this.get('relationship.key');\n                    const values = this.get('entity.relationships.relationships');\n                    const valuesToRemove = values.filter(value => value.labelKey === key);\n                    values.removeObjects(valuesToRemove);\n                } else {\n                    const people = relationship.get('people');\n                    forEachRight(people, person => relationship.removePerson(person));\n                }\n\n                this.get('onUpdateField')(relationship);\n            }\n        },\n\n        toggleShowing() {\n            this.toggleProperty('showingMore');\n        },\n\n        onUpdateLabel(newLabel, oldLabel) {\n            const people = this.get('people');\n            const ids = people.mapBy('id');\n            const values = this.get('entity.relationships.relationships').filter(\n                value => (value.labelKey === oldLabel || value.labelkey === oldLabel) && ids.includes(value.value)\n            );\n\n            uniqBy(values, 'value').forEach(value => {\n                set(value, 'labelKey', newLabel);\n            });\n\n            this.get('onUpdateLabel')(...arguments);\n        }\n    },\n\n    canEdit: computed.and('editing', 'relationship.canEdit'),\n    canRemove: computed('canEdit', 'people.[]', 'manager', function () {\n        const canEdit = this.get('canEdit');\n        if (this.get('isManagerField')) {\n            return canEdit && !isEmpty(this.get('manager'));\n        }\n        return canEdit && !isEmpty(this.get('people'));\n    }),\n\n    manager: computed.reads('entity.manager.content'),\n    isManagerField: computed.equal('relationship.key', 'management'),\n\n    updatePeople: observer('relationship.people.[]', 'showingMore', 'isManagerField', function () {\n        const people = this.get('relationship.people') || Ember.A([]);\n\n        if (this.get('isManagerField')) {\n            const cachedPeople = this.get('people');\n            if (cachedPeople && people && cachedPeople.length > 0 && people.length === cachedPeople.length) {\n                return;\n            }\n            const orderedPeople = Ember.A([]);\n            this.get('entity.manager')\n                .then(getNextPerson.bind(this, orderedPeople, people))\n                .catch(err => {\n                    this.logger.error('Error loading managers:', { err });\n                    this.set('people', people);\n                })\n                .finally(() => this.set('people', orderedPeople));\n        }\n\n        if (this.get('showingMore')) {\n            this.set('people', people);\n            return;\n        }\n\n        this.set('people', people.slice(0, LIMIT));\n    }),\n\n    hasMore: computed('relationship.people.[]', function () {\n        return this.get('relationship.people.length') > LIMIT;\n    }),\n\n    haveManager: computed('manager', function () {\n        return !isEmpty(this.get('manager'));\n    }),\n\n    hideSection: computed('editing', 'canEdit', 'relationship.people.[]', function () {\n        const editing = this.get('editing');\n        const canEdit = this.get('canEdit');\n        if (editing) {\n            return !canEdit;\n        }\n\n        return !this.get('relationship.people.length');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"PemVvDr5\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-group \\\",[28,[\\\"relationship\\\",\\\"key\\\"]],\\\"-relationship relationship-container \\\",[33,[\\\"if\\\"],[[28,[\\\"hideSection\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-entry field-entries\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-label\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"entity-field-section/entity-relationships/relationship-label\\\"],null,[[\\\"entity\\\",\\\"relationship\\\",\\\"editing\\\",\\\"onUpdateLabel\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"relationship\\\"]],[28,[\\\"editing\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"onUpdateLabel\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"entry-values field-value \\\",[33,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]],\\\"editing\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"relationship\\\",\\\"loading\\\"]],[33,[\\\"not\\\"],[[28,[\\\"canEdit\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.loading\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[6,[\\\"entity-field-section/entity-relationships/relationship-search\\\"],null,[[\\\"entity\\\",\\\"type\\\",\\\"select\\\",\\\"relationship\\\"],[[28,[\\\"entity\\\"]],\\\"person\\\",\\\"selectPerson\\\",[28,[\\\"relationship\\\"]]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"result-container clickable\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"relationship\\\",\\\"isManagerRelationship\\\"]],\\\"is-manager\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"unless\\\"],[[33,[\\\"can-edit\\\"],[[28,[\\\"result\\\"]],\\\"relationships.manager\\\"],null],\\\"disabled\\\"],null]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],[28,[\\\"selectResult\\\"]],[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\"],[[28,[\\\"result\\\"]],false,false]]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"result\\\",\\\"selectResult\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"canEdit\\\"]],[28,[\\\"isManagerField\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"haveManager\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"person-icon\\\"],null,[[\\\"person\\\",\\\"componentUpdated\\\"],[[28,[\\\"manager\\\"]],[28,[\\\"componentUpdated\\\"]]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"removePerson\\\",[28,[\\\"person\\\"]]]],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row\\\"],[13],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"relationship\\\",\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"relationship\\\",\\\"loading\\\"]]],null],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.loading\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"people\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"person-icon\\\"],null,[[\\\"person\\\",\\\"componentUpdated\\\"],[[28,[\\\"person\\\"]],[28,[\\\"componentUpdated\\\"]]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"removePerson\\\",[28,[\\\"person\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row\\\"],[13],[14],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isManagerField\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"divider-icon ion-ios-arrow-right\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"person\\\"]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasMore\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"toggle-showing\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleShowing\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showingMore\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.showLess\\\"],null],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.showMore\\\"],null],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canRemove\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"remove-relationship\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"removeRelationship\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-remove-section\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-relationships/relationship-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { inject, computed } = Ember;\n\nexport default Ember.Object.extend({\n    intl: inject.service(),\n    session: inject.service(),\n    notification: inject.service('notification-proxy'),\n    permissions: inject.service(),\n\n    key: null,\n    entity: null,\n    promise: null,\n    cache: null,\n\n    reportsToSave: [],\n\n    loading: computed('promise.isPending', 'people.[]', function () {\n        return this.get('promise.isPending') && this.get('people.length') === 0;\n    }),\n\n    init() {\n        this._super(...arguments);\n\n        this.set('cache', []);\n    },\n\n    people: computed('promise', function () {\n        let cache = this.get('cache');\n        this.get('promise').then(people => {\n            if (people) {\n                if (cache.length === 0 || cache.length !== people.length) {\n                    cache.clear();\n                    cache.addObjects(people);\n                }\n            }\n        });\n        return cache;\n    }),\n\n    label: computed('key', 'isOtherRelationship', function () {\n        const intl = this.get('intl');\n        const key = this.get('key');\n        if (this.get('isOtherRelationship')) {\n            const field = this.get('session.person.fieldConfig.relationships.relationships');\n            const fieldKey = field.getI18nKey();\n            const lookupKey = `${fieldKey}_labelKey_${key}`;\n            if (intl.query(lookupKey)) {\n                return intl.lookup(lookupKey);\n            }\n            return key;\n        }\n\n        return intl.lookup(`person.relationships.${key}`).toString();\n    }),\n\n    canEdit: computed('key', function () {\n        let key = this.get('key');\n        if (key === 'management' || key === 'assistants') {\n            return this.get('permissions.canEditProfiles');\n        } else if (_.includes(key.toLowerCase(), 'siblings')) {\n            return false;\n        }\n\n        return true;\n    }),\n\n    isManagerRelationship: computed.equal('key', 'management'),\n\n    isReportRelationship: computed('key', function () {\n        let key = this.get('key');\n        return _.includes(key.toLowerCase(), 'reports');\n    }),\n\n    isAssistantsRelationship: computed.equal('key', 'assistants'),\n\n    isOtherRelationship: computed('key', function () {\n        let relationshipKeys = ['management', 'defaultReports', 'defaultSiblings', 'assistants'];\n\n        return !_.includes(relationshipKeys, this.get('key'));\n    }),\n\n    fieldPath: computed('key', 'isOtherRelationship', function () {\n        let key = this.get('key');\n        if (key === 'assistants') {\n            return 'relationships.administrativeAssistant';\n        } else if (_.includes(key, 'reports')) {\n            return 'children';\n        } else if (key === 'otherRelationships' || this.get('isOtherRelationship')) {\n            return 'relationships.relationships';\n        }\n    }),\n\n    values: computed('entity', 'fieldPath', function () {\n        let entity = this.get('entity');\n        let fieldPath = this.get('fieldPath');\n        if (fieldPath) {\n            return entity.getFieldValue(fieldPath);\n        }\n        return null;\n    }),\n\n    addPerson(person) {\n        const entity = this.get('entity');\n        const fieldPath = this.get('fieldPath');\n        const key = this.get('key');\n        const intl = this.get('intl');\n\n        if (this.get('isManagerRelationship')) {\n            this.addManager(entity, person);\n        } else {\n            this.get('people').addObject(person);\n            if (this.get('isReportRelationship')) {\n                const personId = person.get('id');\n                const currentManager = entity.getFieldValue('relationships.manager');\n                if (currentManager && currentManager.value === personId) {\n                    this.get('people').removeObject(person);\n                    this.get('notification').error(\n                        intl.lookup('notification.titles.profileDataError').toString(),\n                        intl.lookup('notification.person.managerReportError').toString(),\n                        {\n                            forceBrowserNotification: true,\n                            tag: 'relationship'\n                        }\n                    );\n                } else {\n                    this.addManager(person, entity);\n                    this.get('reportsToSave').addObject(person);\n                }\n            } else {\n                let fieldValue = _.find(entity.get(fieldPath), value => _.isEmpty(value.value));\n\n                if (_.isEmpty(fieldValue)) {\n                    entity.set(fieldPath, person.get('id'));\n                    fieldValue = _.last(entity.get(fieldPath));\n                } else {\n                    Ember.set(fieldValue, 'value', person.get('id'));\n                }\n\n                Ember.set(fieldValue, 'labelKey', key);\n            }\n        }\n    },\n\n    removePerson(person) {\n        let fieldPath = this.get('fieldPath');\n        if (this.get('isManagerRelationship')) {\n            this.removeManager(this.get('entity'));\n        } else {\n            this.get('people').removeObject(person);\n            let values = this.get('entity').getFieldValue(fieldPath);\n            if (!_.isEmpty(values)) {\n                let value = values.findBy('value', person.get('id'));\n                values.removeObject(value);\n            } else if (this.get('isReportRelationship')) {\n                this.removeManager(person);\n                this.get('reportsToSave').addObject(person);\n            }\n        }\n    },\n\n    addManager(person, newManager) {\n        this.removeManager(person);\n        person.set('relationships.manager', newManager.get('id'));\n    },\n\n    removeManager(person) {\n        if (!person) {\n            person = this.get('entity');\n        }\n\n        let manager = person.getFieldValue('relationships.manager');\n        if (!_.isEmpty(manager)) {\n            person.get('relationships.manager').removeObject(manager);\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['relationship-label'],\n\n    intl: inject.service(),\n\n    attrs: {\n        onUpdateLabel: () => {}\n    },\n\n    entity: null,\n    editing: false,\n    relationship: null,\n\n    showLabelChoices: false,\n\n    actions: {\n        updateLabel(event) {\n            Ember.run(this, this.updateLabel, event.target.value);\n        },\n\n        focusInput() {\n            this.set('showLabelChoices', true);\n        },\n\n        selectLabel({ key }) {\n            this.updateLabel(key);\n            this.set('showLabelChoices', false);\n        },\n\n        toggleChoices() {\n            this.$('input').trigger('focus');\n        }\n    },\n\n    isOtherRelationship: computed.reads('relationship.isOtherRelationship'),\n\n    hasLabelChoices: computed.gt('labelChoices.length', 0),\n\n    canShowLabelChoices: computed.and('editing', 'showLabelChoices', 'isOtherRelationship', 'hasLabelChoices'),\n\n    field: computed(function () {\n        return this.get('entity.fieldConfig.relationships.relationships');\n    }),\n\n    labelChoices: computed('field.labelKeys.[]', function () {\n        const intl = this.get('intl');\n        const i18nKey = this.get('field.i18nKey');\n        const labelKeys = this.get('field.labelKeys');\n        return labelKeys.map(key => {\n            return {\n                key,\n                text: intl.lookup(`${i18nKey}_labelKey_${key}`)\n            };\n        });\n    }),\n\n    didInsertElement() {\n        if (!this.get('isOtherRelationship')) {\n            return;\n        }\n\n        Ember.$(window).on(`click.${this.elementId}`, event => {\n            Ember.run(() => {\n                const target = Ember.$(event.target);\n                if (!target.parents(`#${this.elementId}`).length) {\n                    this.set('showLabelChoices', false);\n                }\n            });\n        });\n    },\n\n    willDestroyElement() {\n        Ember.$(window).off(`.${this.elementId}`);\n    },\n\n    updateLabel(newLabel) {\n        const relationship = this.get('relationship');\n        const oldLabel = relationship.get('key');\n\n        relationship.set('key', newLabel);\n\n        this.setLabelKey(newLabel, oldLabel);\n    },\n\n    setLabelKey(newLabel, oldLabel) {\n        this.attrs.onUpdateLabel(newLabel, oldLabel);\n        this.handleTooltip(newLabel);\n    },\n\n    handleTooltip(label) {\n        const message = this.get('intl').lookup('person.relationships.emptyLabel');\n        const input = this.$('input');\n        if (_.isEmpty(label)) {\n            input\n                .tooltip({\n                    title: message.toString(),\n                    placement: 'right',\n                    trigger: 'manual'\n                })\n                .tooltip('show');\n        } else {\n            input.tooltip('destroy');\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"KAdyYx7i\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"isOtherRelationship\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"hidden\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-relationship\\\"]]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.labels.relationship\\\"],null],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-relationship\\\"]]],[16,\\\"value\\\",[34,[[28,[\\\"relationship\\\",\\\"label\\\"]]]]],[15,\\\"class\\\",\\\"form-control purecloud-input\\\"],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateLabel\\\"],null],null],[16,\\\"onfocus\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"focusInput\\\"],null],null],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasLabelChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-arrow-down-b\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleChoices\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[1,[28,[\\\"relationship\\\",\\\"label\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"label-choices \\\",[33,[\\\"unless\\\"],[[28,[\\\"canShowLabelChoices\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"labelChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"label-choice\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectLabel\\\",[28,[\\\"choice\\\"]]]],[13],[0,\\\"\\\\n            \\\"],[1,[28,[\\\"choice\\\",\\\"text\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"choice\\\"]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-relationships/relationship-label/template.hbs\"}});","import Ember from 'ember';\n\nimport EntitySearch from '../../../entity-search/component';\nimport layout from '../../../entity-search/template';\n\nconst { on, run, inject, RSVP } = Ember;\n\nexport default EntitySearch.extend({\n    classNames: ['relationship-search'],\n    layout,\n\n    intl: inject.service(),\n    session: inject.service(),\n    permissions: inject.service(),\n\n    entity: null,\n    relationship: null,\n    searchLimit: 6,\n\n    actions: {\n        selectResult(result) {\n            const isOtherRelationship =\n                this.get('relationship.isOtherRelationship') || this.get('relationship.isAssistantsRelationship');\n            const entity = this.get('entity');\n            let canEdit = this.get('permissions.canEditProfiles');\n            if (isOtherRelationship) {\n                canEdit = entity.get('id') === this.get('session.person.id') || canEdit;\n            }\n\n            if (canEdit) {\n                this.set('searchQuery', '');\n                this.set('userInput', '');\n\n                this.sendAction('select', result);\n            }\n        }\n    },\n\n    resultsLoaded: on('didRender', function () {\n        if (!this.get('currentSearchRequest.isFulfilled')) {\n            return false;\n        }\n\n        this.get('currentSearchRequest')\n            .then(([people]) => {\n                // Lets be safe...\n                if (this.isDestroyed || this.isDestroying) {\n                    return;\n                }\n\n                this.$('.disabled').tooltip('destroy');\n\n                return RSVP.all(people.map(person => person.get('readWritePermissions')));\n            })\n            .then(() => {\n                run.scheduleOnce('afterRender', this, function () {\n                    // ...doubly safe\n                    if (this.isDestroyed || this.isDestroying) {\n                        return;\n                    }\n\n                    if (this.get('relationship.isManagerRelationship')) {\n                        this.$('.disabled').tooltip({\n                            title: this.get('intl').lookup('person.relationships.cantModify').toString(),\n                            placement: 'top',\n                            trigger: 'hover',\n                            container: `#${this.elementId} .search-results`\n                        });\n                    }\n                });\n            });\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"UEbDChTm\",\"block\":\"{\\\"statements\\\":[[19,\\\"components/entity-field-section/-section-header\\\"],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"allRelationships\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-field-section/entity-relationships/relationship-field\\\"],null,[[\\\"entity\\\",\\\"editing\\\",\\\"relationship\\\",\\\"componentUpdated\\\",\\\"onUpdateField\\\",\\\"onUpdateLabel\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"relationship\\\"]],[28,[\\\"componentUpdated\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"updatedField\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"updatedLabel\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"relationship\\\"]},null],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showRemoveSectionModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"extraClassNames\\\",\\\"showHeader\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"confirm\\\",\\\"cancel\\\"],[\\\"remove-section-confirmation\\\",false,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],[33,[\\\"t\\\"],[\\\"common.confirm\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSection\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelRemoveSection\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"p\\\",[]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[19,\\\"components/entity-field-section/-section-footer\\\"],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":true}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-relationships/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"NU+9H46N\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"hideHeader\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[19,\\\"components/entity-field-section/-section-header\\\"],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"sectionInfo\\\",\\\"empty\\\"]],[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"p\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"fieldSectionHasData\\\"]],\\\"hidden\\\",\\\"no-data\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.sectionEmpty\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-section-content \\\",[33,[\\\"if\\\"],[[28,[\\\"ownProfile\\\"]],\\\"own-profile\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"groupedFieldData\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-group entries field-entries field-group-\\\",[28,[\\\"groupedData\\\",\\\"key\\\"]],\\\"\\\\n                    num-entries-\\\",[28,[\\\"groupedData\\\",\\\"fieldData\\\",\\\"length\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[33,[\\\"sort-field-data\\\"],[[28,[\\\"groupedData\\\",\\\"fieldData\\\"]]],[[\\\"group\\\"],[[28,[\\\"groupedData\\\"]]]]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[33,[\\\"and\\\"],[[28,[\\\"data\\\",\\\"isEmpty\\\"]],[28,[\\\"isViewMode\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-entry-container field-entry\\\\n                                \\\",[28,[\\\"data\\\",\\\"field\\\",\\\"fieldPathClass\\\"]],\\\"\\\\n                                \\\",[28,[\\\"data\\\",\\\"field\\\",\\\"type\\\"]],\\\"-field\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"data\\\",\\\"isEmpty\\\"]],\\\"empty-field-entry\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"data\\\",\\\"isNewValue\\\"]],\\\"new-field-entry\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"data\\\",\\\"field\\\",\\\"repeatable\\\"]],\\\"repeatable\\\"],null]]]],[16,\\\"data-field-id\\\",[34,[[28,[\\\"data\\\",\\\"fieldId\\\"]]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entry-label\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"entity\\\",\\\"editing\\\",\\\"field\\\",\\\"entry\\\",\\\"writeable\\\",\\\"showHistoryYearRange\\\",\\\"fallbackToEmpty\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"data\\\",\\\"field\\\"]],[28,[\\\"data\\\",\\\"fieldValue\\\"]],[28,[\\\"data\\\",\\\"writeable\\\"]],false,[28,[\\\"fallbackToEmptyLabel\\\"]]]]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\\n                            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"entry-values \\\",[33,[\\\"if\\\"],[[28,[\\\"data\\\",\\\"isEmpty\\\"]],\\\"empty\\\"],null]]]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"data\\\",\\\"field\\\",\\\"componentName\\\"]]],[[\\\"entity\\\",\\\"editing\\\",\\\"fieldData\\\",\\\"allFieldData\\\",\\\"cancelAddNew\\\",\\\"componentUpdated\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"data\\\"]],[28,[\\\"fieldData\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"removeEntry\\\"],null],[28,[\\\"componentUpdated\\\"]]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"data\\\",\\\"field\\\",\\\"repeatable\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"delete\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"data\\\",\\\"isEmpty\\\"]],[28,[\\\"data\\\",\\\"isNewValue\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"removeEntry\\\",[28,[\\\"data\\\"]]]],[13],[0,\\\"\\\\n                                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row\\\"],[13],[14],[0,\\\"\\\\n                                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"data\\\",\\\"isNewValue\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"removeEntry\\\",[28,[\\\"data\\\"]]]],[13],[0,\\\"\\\\n                                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-remove-section\\\"],[13],[14],[0,\\\"\\\\n                                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],false],[0,\\\"\\\\n                                                \\\"],[14],[0,\\\"\\\\n                                            \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"                                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"data\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"groupedData\\\"]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showRemoveSectionModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"extraClassNames\\\",\\\"showHeader\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"confirm\\\",\\\"cancel\\\"],[\\\"remove-section-confirmation\\\",false,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],[33,[\\\"t\\\"],[\\\"common.confirm\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSection\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelRemoveSection\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"p\\\",[]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[19,\\\"components/entity-field-section/-section-footer\\\"],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":true}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { on } = Ember;\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    ensurePopulatedField: on('didRender', function () {\n        if (!this.get('editing')) {\n            return;\n        }\n        if (this.isFieldEmpty()) {\n            Ember.run.scheduleOnce('afterRender', this, this.setValues);\n        }\n    }),\n\n    setValues() {\n        let entity = this.get('entity');\n        let path = this.get('field').getFieldPath();\n        let entry = this.get('entry');\n\n        if (!_.isEmpty(entry)) {\n            Ember.set(entry, 'value', '');\n            entity.set(path, [entry], { overwrite: true });\n        } else {\n            entity.set(path, '');\n        }\n\n        let value = entity.getFieldValue(path);\n        if (Array.isArray(value)) {\n            value = value[0];\n        }\n        this.set('entry', value);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"jMlriNvw\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showLabel\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"textarea\\\"],null,[[\\\"value\\\",\\\"classNames\\\",\\\"class\\\"],[[28,[\\\"entry\\\",\\\"value\\\"]],\\\"form-control\\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"protocol\\\",\\\"value\\\"],[\\\"map\\\",[28,[\\\"entry\\\",\\\"value\\\"]]]]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/address-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    didInsertElement() {\n        this._super(...arguments);\n        this.ensurePopulatedField();\n    },\n\n    ensurePopulatedField: Ember.observer('editing', function () {\n        if (!this.get('editing')) {\n            return;\n        }\n\n        const entity = this.get('entity');\n        const path = this.get('field').getFieldPath();\n        const entry = this.get('entry');\n\n        if (_.isEmpty(entry) || entry.value === undefined) {\n            entity.set(path, false);\n        }\n\n        // Make sure things get bound correctly for input checkbox changes\n        this.set('entry', entity.getFieldValue(path));\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"CNWFv3l8\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"for\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-entry-value\\\"],null],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"type\\\",\\\"id\\\",\\\"name\\\",\\\"checked\\\"],[\\\"checkbox\\\",[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-entry-value\\\"],null],\\\"entry.value\\\",[28,[\\\"entry\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[\\\"label \\\",[33,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\"]],\\\"label-success\\\",\\\"label-danger\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-check-circle\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.boolean.checked-true\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.boolean.checked-false\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/boolean-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from '../../../utils/dates';\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { inject, observer, computed } = Ember;\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    intl: inject.service(),\n\n    complexField: true,\n    complexValueFields: ['entry.value.year', 'entry.value.month', 'entry.value.day'],\n\n    actions: {\n        selectDate(date) {\n            if (!date) {\n                this.set('entry.value', null);\n            } else {\n                const day = date.getDate();\n                const month = date.getMonth() + 1;\n                const year = date.getFullYear();\n                const value = { day, month, year };\n\n                this.set('entry.value', value);\n            }\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        const timer = Ember.run.scheduleOnce('afterRender', this, 'ensurePopulatedField');\n        this.timers.pushObject(timer);\n    },\n\n    populateFieldOnRender: observer('canEdit', function () {\n        const timer = Ember.run.scheduleOnce('afterRender', this, 'ensurePopulatedField');\n        this.timers.pushObject(timer);\n    }),\n\n    value: computed('entry.value', function () {\n        let entry = this.get('entry');\n\n        if (!this.isComplexFieldEmpty()) {\n            let copy = Ember.copy(entry, true);\n            copy.value.month -= 1;\n\n            return moment(copy.value).toDate();\n        }\n\n        return null;\n    }),\n\n    formattedValue: computed('value', function () {\n        const date = this.get('value');\n        if (!date) {\n            return '';\n        }\n        return moment(date).format('L');\n    }),\n\n    options: computed('intl.locale', function () {\n        const localeData = moment.localeData();\n        return {\n            i18n: {\n                previousMonth: this.get('intl').t('chat.presence.outOfOffice.picker.previousMonth').toString(),\n                nextMonth: this.get('intl').t('chat.presence.outOfOffice.picker.nextMonth').toString(),\n                months: localeData._months,\n                weekdays: localeData._weekdays,\n                weekdaysShort: localeData._weekdaysShort\n            }\n        };\n    }),\n\n    dateFormat: computed('intl.iosLocale', function () {\n        let locale = this.get('intl.isoLocale');\n        if (locale === 'no') {\n            // moment uses nb as its Norwegian locale\n            locale = 'nb';\n        }\n        return moment.localeData(locale)._longDateFormat.L;\n    }),\n\n    ensurePopulatedField() {\n        if (!this.get('editing')) {\n            return;\n        }\n\n        const entry = this.get('entry');\n        const entity = this.get('entity');\n        const path = this.get('field.fieldPath');\n\n        if (_.isEmpty(entry)) {\n            entity.set(path, entry);\n        } else {\n            entity.set(path, [entry], { overwrite: true });\n        }\n\n        if (_.isEmpty(entry.value)) {\n            let value = {\n                year: null,\n                month: null,\n                day: null\n            };\n\n            Ember.set(entry, 'value', value);\n        }\n\n        this.set('entry', entity.getFieldValue(path));\n    },\n\n    isComplexFieldEmpty: function () {\n        let entry = this.get('entry');\n        if (!entry || !entry.value) {\n            return true;\n        }\n\n        return (\n            typeof entry.value.year !== 'number' &&\n            typeof entry.value.month !== 'number' &&\n            typeof entry.value.day !== 'number'\n        );\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"CiFxiWqE\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"pikaday-input\\\"],null,[[\\\"value\\\",\\\"classNames\\\",\\\"format\\\",\\\"placeholder\\\",\\\"firstDay\\\",\\\"onSelection\\\",\\\"options\\\"],[[28,[\\\"value\\\"]],\\\"form-control\\\",[28,[\\\"dateFormat\\\"]],\\\"\\\",0,[33,[\\\"action\\\"],[[28,[null]],\\\"selectDate\\\"],null],[28,[\\\"options\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[13],[1,[26,[\\\"formattedValue\\\"]],true],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"empty-value\\\"],[13],[0,\\\"\\\\n\\\"],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/date-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { inject, computed } = Ember;\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    classNameBindings: ['isValid::invalid-value'],\n\n    intl: inject.service(),\n    permissions: inject.service(),\n\n    currentTooltip: null,\n    isActive: false,\n\n    hasError: computed.not('isValid'),\n\n    actions: {\n        setPrimary() {\n            this.set('isPrimary', true);\n        },\n\n        focus() {\n            this.set('isActive', true);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        if (!this.get('editing') || this.isDestroyed) {\n            return;\n        }\n\n        const entry = this.get('entry');\n        let empty;\n        if (!entry) {\n            empty = true;\n        } else {\n            empty = _.isEmpty(entry.value);\n        }\n\n        if (empty) {\n            const timer = Ember.run.scheduleOnce('afterRender', this, this.setValues);\n            this.timers.push(timer);\n        }\n    },\n\n    isPrimary: computed('entry._id', 'entity.primaryContactInfo.email.firstObject.value.fieldId', 'isEmpty', {\n        get() {\n            let entryId = this.get('entry._id');\n            let fieldId = this.get('entity.primaryContactInfo.email.firstObject.value.fieldId');\n            return fieldId && fieldId === entryId && !this.get('isEmpty');\n        },\n\n        set(key, value) {\n            let entity = this.get('entity');\n            let type = this.get('fieldData.field.type');\n\n            entity.setPrimaryContact(\n                type,\n                this.get('entry'),\n                this.get('fieldData.field.fieldPath'),\n                this.get('fieldData')\n            );\n\n            return value;\n        }\n    }),\n\n    errorMessage: computed('isValid', 'entry.value', 'entity.type', function () {\n        const intl = this.get('intl');\n        const valid = this.get('isValid');\n        const empty = _.isEmpty(this.get('entry.value'));\n        const isGroup = this.get('entity.type') === 'group';\n\n        if (empty && !isGroup) {\n            return intl.lookup('tooltip.fields.email.blankError').toString();\n        }\n\n        if (!valid && !empty) {\n            return intl.lookup('tooltip.fields.email.invalidError').toString();\n        }\n    }),\n\n    canSetPrimary: computed.reads('permissions.canEditProfiles'),\n\n    focusOut() {\n        this.set('isActive', false);\n    },\n\n    setValues() {\n        const entity = this.get('entity');\n        const field = this.get('field');\n        const path = field.getFieldPath();\n        const entry = this.get('entry');\n\n        if (!_.isEmpty(entry)) {\n            Ember.set(entry, 'value', '');\n\n            if (!field.get('repeatable')) {\n                entity.set(path, [entry], { overwrite: true });\n            }\n        } else {\n            entity.set(path, '');\n        }\n\n        if (!field.get('repeatable')) {\n            let value = entity.getFieldValue(path);\n            if (Array.isArray(value)) {\n                value = value[0];\n            }\n            this.set('entry', value);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"Y6Xi0XRF\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"for\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field\\\"],null],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"email-field-content \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"value \\\",[33,[\\\"if\\\"],[[28,[\\\"hasError\\\"]],\\\"has-error\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\",\\\"class\\\",\\\"focus-in\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field\\\"],null],[28,[\\\"entry\\\",\\\"value\\\"]],\\\"form-control\\\",[33,[\\\"if\\\"],[[28,[\\\"hasError\\\"]],\\\"validation-error\\\"],null],\\\"focus\\\"]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasError\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error help-block\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[26,[\\\"errorMessage\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"session\\\",\\\"features\\\",\\\"AGORA-268_connections-ui-in-admin-ui\\\"]],[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"entry\\\",\\\"value\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"id\\\",\\\"protocol\\\",\\\"value\\\",\\\"title\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field\\\"],null],\\\"mailto\\\",[28,[\\\"entry\\\",\\\"value\\\"]],[28,[\\\"entry\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n            \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"value-type\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"canSetPrimary\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"radio-input\\\"],null,[[\\\"checked\\\",\\\"disabled\\\",\\\"onClick\\\",\\\"name\\\",\\\"ariaLabelledby\\\"],[[28,[\\\"isPrimary\\\"]],[28,[\\\"isEmpty\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setPrimary\\\"],null],\\\"primaryMail\\\",\\\"primary-email\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isPrimary\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"label label-default\\\"],[15,\\\"role\\\",\\\"status\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.primary\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"common.primary\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/email-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { on, inject, computed, observer } = Ember;\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    classNames: ['history'],\n\n    intl: inject.service(),\n\n    complexField: true,\n    complexValueFields: [\n        'entry.value.where',\n        'entry.value.startDate.month',\n        'entry.value.startDate.year',\n        'entry.value.endDate.month',\n        'entry.value.endDate.year'\n    ],\n\n    errors: null,\n    isActive: false,\n\n    actions: {\n        saveHistoryEntry() {\n            this.set('isNewField', false);\n            this.set('isEmpty', false);\n        },\n\n        cancelHistoryEntry() {\n            this.attrs.cancelAddNew(this.get('fieldData'));\n        },\n\n        focus() {\n            this.set('isActive', true);\n        }\n    },\n\n    focusOut: function () {\n        this.set('isActive', false);\n    },\n\n    showTooltip: computed('isValid', 'entry.value.where', 'isActive', function () {\n        let active = this.get('isActive');\n        let valid = this.get('isValid');\n        let empty = _.isEmpty(this.get('entry.value.where'));\n        return !active && (empty || !valid);\n    }),\n\n    focusNewField() {\n        let empty = _.isEmpty(this.get('entry.value.where'));\n        let added = this.get('entry.isAdded');\n\n        if (empty && !added) {\n            let $input = this.$('.where input');\n            this.set('entry.isAdded', true);\n            $input.trigger('focus');\n        }\n    },\n\n    ensureDateObjectsExist() {\n        if (!this.get('editing')) {\n            return;\n        }\n\n        let entry = this.get('entry');\n\n        if (typeof entry.value !== 'object') {\n            Ember.set(entry, 'value', {});\n        }\n\n        if (!entry.value.endDate) {\n            Ember.set(entry, 'value.endDate', {\n                month: null,\n                year: null\n            });\n        }\n\n        if (!entry.value.startDate) {\n            Ember.set(entry, 'value.startDate', {\n                month: null,\n                year: null\n            });\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n\n        this.set('errors', {\n            where: false,\n            date: false\n        });\n\n        Ember.run.once(this, this.ensureDateObjectsExist);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        Ember.run.scheduleOnce('afterRender', this, this.focusNewField);\n        Ember.run.scheduleOnce('afterRender', this, this.calculateValidityOnInsert);\n    },\n\n    calculateValidityOnInsert() {\n        this.validityChanged();\n    },\n\n    resetData: on('willDestroyElement', function () {\n        this.cleanFieldForSave();\n    }),\n\n    section: computed.reads('fieldData.field.section'),\n    useEducationLabels: computed.equal('section.key', 'education'),\n\n    isNewField: computed('entry._id', 'entry.tempId', function () {\n        return !this.get('entry._id') && this.get('entry.tempId');\n    }),\n\n    where: computed('entry.value.where', 'entity.bio.workHistory.[]', function () {\n        return this.get('entry.value.where');\n    }),\n\n    what: computed('entry.value.what', 'entity.bio.workHistory.[]', function () {\n        return this.get('entry.value.what');\n    }),\n\n    notes: computed('entry.value.notes', 'entity.bio.workHistory.[]', function () {\n        return this.get('entry.value.notes');\n    }),\n\n    whereLabel: computed('useEducationLabels', function () {\n        const intl = this.get('intl');\n        if (this.get('useEducationLabels')) {\n            return intl.lookup('entity.fieldTypes.history.educationWhere');\n        }\n        return intl.lookup('entity.fieldTypes.history.where').toString();\n    }),\n\n    datesLabel: computed('useEducationLabels', function () {\n        const intl = this.get('intl');\n        if (this.get('useEducationLabels')) {\n            return intl.lookup('entity.fieldTypes.history.educationDates');\n        }\n        return intl.lookup('entity.fieldTypes.history.dates').toString();\n    }),\n\n    whatLabel: computed('useEducationLabels', function () {\n        const intl = this.get('intl');\n        if (this.get('useEducationLabels')) {\n            return intl.lookup('entity.fieldTypes.history.educationWhat');\n        }\n        return intl.lookup('entity.fieldTypes.history.what').toString();\n    }),\n\n    notesLabel: computed(function () {\n        return this.get('intl').lookup('entity.fieldTypes.history.notes');\n    }),\n\n    validityChanged: observer('showTooltip', 'isEmpty', function () {\n        let isValid = this.get('isValid');\n        let isEmpty = this.get('isEmpty');\n\n        Ember.run.scheduleOnce('afterRender', this, this.whereErrorChanged, isEmpty);\n        Ember.run.scheduleOnce('afterRender', this, this.dateErrorChanged, !isValid);\n    }).on('init'),\n\n    whereErrorChanged(error) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n\n        if (!this.get('editing')) {\n            return;\n        }\n        let showTooltip = this.get('showTooltip');\n\n        var input = this.get('whereInput');\n        if (error && showTooltip) {\n            var elem = this.$('.where input');\n            if (!input && elem.length) {\n                input = elem.tooltip({\n                    placement: 'top',\n                    title: this.get('intl').lookup('entity.fieldTypes.history.validation.whereError').toString(),\n                    trigger: 'manual'\n                });\n\n                this.set('whereInput', input);\n            }\n\n            if (input) {\n                input.tooltip('show');\n            }\n        } else {\n            if (input) {\n                input.tooltip('hide');\n            }\n        }\n    },\n\n    dateErrorChanged(error) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n\n        if (!this.get('editing')) {\n            return;\n        }\n\n        var input = this.get('dateInput');\n        if (error) {\n            var elem = this.$('.from-date input');\n            if (!input && elem.length) {\n                input = elem.tooltip({\n                    placement: 'top',\n                    title: this.get('intl').lookup('entity.fieldTypes.history.validation.dateError').toString(),\n                    trigger: 'manual'\n                });\n\n                this.set('dateInput', input);\n            }\n\n            if (input) {\n                input.tooltip('show');\n            }\n        } else {\n            if (input) {\n                input.tooltip('hide');\n            }\n        }\n    },\n\n    isComplexFieldEmpty: function () {\n        // only required field is `where`\n        var where = this.get('entry.value.where');\n        return where === undefined || _.isEmpty(where.trim());\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"uwmska7a\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]],\\\" \\\",[33,[\\\"if\\\"],[[28,[\\\"isNewField\\\"]],\\\"new-field\\\"],null],\\\" \\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"field-error\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"inputs where-and-dates\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"where\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-where\\\"]]],[15,\\\"class\\\",\\\"history-field-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"whereLabel\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\",\\\"focus-in\\\",\\\"class\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-where\\\"],null],[28,[\\\"entry\\\",\\\"value\\\",\\\"where\\\"]],\\\"form-control\\\",\\\"focus\\\",[33,[\\\"if\\\"],[[28,[\\\"errors\\\",\\\"where\\\"]],\\\"validation-error\\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"date-range\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"history-field-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"datesLabel\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"date-pickers\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"from-date\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"date-picker\\\"],null,[[\\\"entity\\\",\\\"value\\\",\\\"format\\\",\\\"minView\\\",\\\"inputMode\\\",\\\"minDate\\\",\\\"maxDate\\\",\\\"error\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"entry\\\",\\\"value\\\",\\\"startDate\\\"]],\\\"monthYear\\\",\\\"months\\\",true,[28,[\\\"field\\\",\\\"params\\\",\\\"minStartDate\\\"]],[28,[\\\"field\\\",\\\"params\\\",\\\"maxStartDate\\\"]],[28,[\\\"errors\\\",\\\"date\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"to\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.history.to\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"to-date\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"date-picker\\\"],null,[[\\\"entity\\\",\\\"value\\\",\\\"format\\\",\\\"minView\\\",\\\"inputMode\\\",\\\"minDate\\\",\\\"maxDate\\\",\\\"placeholder\\\",\\\"error\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"entry\\\",\\\"value\\\",\\\"endDate\\\"]],\\\"monthYear\\\",\\\"months\\\",true,[28,[\\\"field\\\",\\\"params\\\",\\\"minEndDate\\\"]],[28,[\\\"field\\\",\\\"params\\\",\\\"maxEndDate\\\"]],\\\"entity.fieldTypes.history.toPlaceholder\\\",[28,[\\\"errors\\\",\\\"date\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"inputs what\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-what\\\"]]],[15,\\\"class\\\",\\\"history-field-label\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"whatLabel\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-what\\\"],null],[28,[\\\"entry\\\",\\\"value\\\",\\\"what\\\"]],\\\"form-control\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"inputs note\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-notes\\\"]]],[15,\\\"class\\\",\\\"history-field-label\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"notesLabel\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[1,[33,[\\\"textarea\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-notes\\\"],null],[28,[\\\"entry\\\",\\\"value\\\",\\\"notes\\\"]],\\\"form-control\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isNewField\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"remove-new-field\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"cancelHistoryEntry\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"h5\\\",[]],[15,\\\"class\\\",\\\"where\\\"],[13],[1,[26,[\\\"where\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"what\\\"],[13],[1,[26,[\\\"what\\\"]],false],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"notes\\\"]]],null,{\\\"statements\\\":[[6,[\\\"expander-plugin\\\"],null,null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"multi-line-value\\\"],[[28,[\\\"notes\\\"]]],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"dates\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"fallbackToEmpty\\\",\\\"showInstructionText\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],true,false]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/history-field/template.hbs\"}});","import TextField from '../text-field/component';\n\nexport default TextField.extend();\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { inject, computed, observer, Component } = Ember;\n\nexport default Component.extend(FieldComponentMixin, {\n    intl: inject.service(),\n    store: inject.service(),\n    session: inject.service(),\n\n    location: null,\n    parentLocation: null,\n    floorLocation: null,\n\n    googleMapsHref: '',\n\n    showFloorplan: false,\n\n    init() {\n        this._super(...arguments);\n        this.set('location', this.get('locationData'));\n        this.set('filterLocations', this.filterLocationsHelper.bind(this));\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        Ember.run.scheduleOnce('afterRender', this, this.focusFieldOnInsert);\n    },\n\n    focusFieldOnInsert() {\n        const input = this.$('input');\n        if (input) {\n            input.trigger('focus');\n        }\n    },\n\n    actions: {\n        selectParentLocation(location) {\n            this.set('parentLocation', location);\n            this.send('selectLocation', location);\n            this.set('isEmpty', true);\n        },\n\n        selectFloorLocation(location) {\n            this.set('floorLocation', location);\n            this.send('selectLocation', location);\n            this.set('isEmpty', false);\n        },\n\n        saveNewLocation() {\n            let parentLocation = this.get('parentLocation');\n            let floorLocation = this.get('floorLocation');\n            if (floorLocation) {\n                this.send('selectLocation', floorLocation);\n            } else {\n                this.send('selectLocation', parentLocation);\n            }\n        },\n\n        cancelNewLocation() {\n            this.get('cancelAddNew')(this.get('fieldData'));\n        },\n\n        selectLocation(location) {\n            let entry = this.get('entry');\n            let id = location.get('id');\n\n            let value = {\n                locationId: id,\n                coordinates: {},\n                notes: ''\n            };\n\n            if (location.get('floorplanImage') && location.get('floorplanImage.length') > 0) {\n                value.coordinates = {\n                    x: 0,\n                    y: 0\n                };\n            }\n\n            Ember.set(entry, 'value', value);\n            this.set('location', this.get('locationData'));\n        },\n\n        removeNewParentLocation() {\n            this.set('parentLocation', null);\n        },\n\n        noop() {},\n\n        toggleFloorplan() {\n            Ember.run.once(this, this.toggleProperty, 'showFloorplan');\n        },\n\n        hideFloorplan() {\n            this.set('showFloorplan', false);\n            this.set('location', this.get('locationData'));\n        },\n\n        confirm() {\n            var location = this.get('location');\n            var entity = this.get('entity');\n\n            if (location === undefined) {\n                location = Ember.RSVP.resolve(this.get('modal.location'));\n            }\n\n            if (entity === undefined) {\n                entity = this.get('modal.entity');\n            }\n\n            return location\n                .then(() => entity.save())\n                .then(() => entity.reload())\n                .catch(resp => {\n                    if (resp.responseText) {\n                        var json = JSON.parse(resp.responseText);\n                        var code = Ember.get(json, 'payload.code');\n                        if (code === 'VERSION_MISMATCH') {\n                            this.bubbleAction({\n                                action: 'confirm'\n                            });\n                        }\n                    }\n                });\n        },\n\n        cancel() {\n            var location = this.get('location');\n            if (location === undefined) {\n                location = Ember.RSVP.resolve(this.get('modal.location'));\n            }\n\n            location.then(location => {\n                this.get('modal.controller.entity').reset();\n                location.reload();\n            });\n        }\n    },\n\n    parentLocationName: computed('location.parent.name', function () {\n        return this.get('intl').lookup('field.in', {\n            location: this.get('location.parent.name')\n        });\n    }),\n\n    isValid: computed('entry.value.locationId', 'parentLocation', function () {\n        var entry = this.get('entry');\n\n        var selectedFloor = !_.isEmpty(Ember.get(entry, 'value')) && !_.isEmpty(Ember.get(entry, 'value.locationId'));\n        var haveParent = !_.isEmpty(this.get('parentLocation'));\n\n        return haveParent || selectedFloor;\n    }),\n\n    haveFloor: computed('editing', 'location', 'locationData', 'parentLocation', 'selectedFloor', function () {\n        let location;\n        if (!this.get('location')) {\n            location = this.get('locationData');\n        } else {\n            location = this.get('location');\n        }\n        if (!this.get('editing')) {\n            return true;\n        }\n\n        if (this.get('parentLocation') && !this.get('selectedFloor')) {\n            return false;\n        }\n        return location || this.get('selectedFloor');\n    }),\n\n    locationData: computed('entry.value.locationId', 'editing', function () {\n        let id = this.get('entry.value.locationId');\n        let emptyPromise = DS.PromiseObject.create({\n            promise: Ember.RSVP.resolve(undefined)\n        });\n\n        if (this.get('parentLocation') && !this.get('floorLocation')) {\n            return emptyPromise;\n        } else if (id) {\n            return this.get('store').findRecord('location', id);\n        }\n\n        return emptyPromise;\n    }),\n\n    locationAddress: computed('location', 'locationData', function () {\n        let location;\n        if (!this.get('location')) {\n            location = this.get('locationData');\n        } else {\n            location = this.get('location');\n        }\n        let promise = location.then(location => {\n            if (!location) {\n                return '';\n            }\n\n            if (location.get('isFloor')) {\n                return location.get('parent.address');\n            }\n\n            return location.get('address');\n        });\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    isRichAddress: computed('locationAddress', function () {\n        let promise = this.get('locationAddress').then(address => {\n            return typeof address !== 'string';\n        });\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    parentLocations: computed(function () {\n        var promise = this.store.findAll('location').then(function (locations) {\n            return _.filter(\n                locations.content.map(x => x.getRecord()),\n                function (location) {\n                    return (\n                        location.get('state') !== 'deleted' &&\n                        location.get('type') !== 'floor' &&\n                        location.get('id') !== null\n                    );\n                }\n            );\n        });\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    canShowEdit: computed('editing', 'location', function () {\n        return this.get('editing') && !_.isEmpty(this.get('location.content.parent.content.sublocationOrder'));\n    }),\n\n    locationChoices: computed('parentLocation', function () {\n        var parentLocation = this.get('parentLocation');\n        if (!parentLocation) {\n            return DS.PromiseArray.create({\n                promise: Ember.RSVP.resolve([])\n            });\n        }\n\n        return this.get('parentLocation.floors');\n    }),\n\n    choiceText: computed('parentLocation', function () {\n        const intl = this.get('intl');\n        var parentLocation = this.get('parentLocation');\n        if (!parentLocation) {\n            return intl.lookup('locations.selectLocation');\n        }\n\n        return `${intl.lookup('locations.selectFloor')}${parentLocation.get('name')}`;\n    }),\n\n    selectedParentLocation: computed('parentLocation', function () {\n        return !_.isEmpty(this.get('parentLocation'));\n    }),\n\n    editText: computed('location', 'location.isFloor', function () {\n        const intl = this.get('intl');\n        if (this.get('location.isFloor')) {\n            return intl.lookup('locations.selectOfficeShort');\n        }\n\n        return intl.lookup('locations.editLocation');\n    }),\n\n    attachmentId: computed('elementId', function () {\n        return `${this.elementId}-attachment`;\n    }),\n\n    setGoogleMapsLinkInfo: observer('location.parent', function () {\n        var parent = this.get('location.parent');\n\n        if (parent) {\n            parent.then(\n                Ember.run.bind(this, parentLocation => {\n                    if (this.get('_state') === 'inDOM') {\n                        var address;\n                        if (parentLocation) {\n                            address = parentLocation.get('address');\n                        } else if (!parentLocation) {\n                            address = this.get('location.address');\n                        }\n\n                        if (typeof address === 'string') {\n                            address = address.replace(/^\\s+|\\s+$/g, '').replace('\\n', ' ');\n                            if (address.length > 0) {\n                                this.set('googleMapsHref', `https://maps.google.com/?q=${address}`);\n                            }\n                        } else if (address && typeof address === 'object') {\n                            let street1 = address.street1 || '';\n                            let street2 = address.street2 || '';\n                            let street = street1 && street2 ? `${street1} ${street2}` : street1;\n                            let city = address.city || '';\n                            let state = address.state || '';\n                            let zipcode = address.zipcode || '';\n                            let country = address.country || '';\n                            address = `${street} ${city}, ${state}, ${zipcode}, ${country}`\n                                .replace(/^\\s+|\\s+$/g, '')\n                                .replace('\\n', ' ');\n                            if (address.length > 0) {\n                                this.set('googleMapsHref', `https://maps.google.com/?q=${address}`);\n                            }\n                        }\n                    }\n                })\n            );\n        }\n    }),\n\n    parentLocationUpdated: observer('parentLocation', function () {\n        if (this.get('parentLocation')) {\n            var dropdown = this.$('.dropdown-menu-view');\n\n            if (dropdown) {\n                dropdown.addClass('flash');\n\n                Ember.run.scheduleOnce('afterRender', this, this.toggleFlash, dropdown);\n            }\n        }\n    }),\n\n    filterLocationsHelper(data) {\n        let entity = this.get('entity');\n        let fieldPath = this.get('field.fieldPath');\n        let locationIds = entity.getFieldValue(fieldPath).mapBy('value.locationId');\n        let locations = _.filter(\n            locationIds.map(id => {\n                if (!id) {\n                    return;\n                }\n\n                let location = this.get('store').peekRecord('location', id);\n                if (!location) {\n                    return;\n                }\n                if (location.get('parent.id')) {\n                    return location.get('parent.content');\n                }\n                return location;\n            })\n        );\n\n        return _.reject(data, location => {\n            return _.includes(locations.mapBy('id'), location.get('id')) || location.get('isFloor');\n        });\n    },\n\n    toggleFlash(dropdown) {\n        Ember.run.later(\n            this,\n            function () {\n                dropdown.removeClass('flash');\n            },\n            150\n        );\n    },\n\n    showFloorPlan() {\n        this.set('showFloorplan', true);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"yVVZmAiU\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"location\\\"]],[28,[\\\"location\\\",\\\"isPending\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location-image\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"location\\\",\\\"isPending\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"location\\\",\\\"floorplan\\\"]],[28,[\\\"location\\\",\\\"parent\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"class\\\"],[[28,[\\\"location\\\",\\\"parent\\\"]],96,\\\"location-image\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"class\\\"],[[28,[\\\"location\\\"]],96,\\\"location-image\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information location-details\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"h5\\\",[]],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"location\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"location\\\",\\\"parent\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[26,[\\\"parentLocationName\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"locationAddress\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"address\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"isRichAddress\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.location.address\\\"],[[\\\"street1\\\",\\\"street2\\\",\\\"city\\\",\\\"state\\\",\\\"country\\\",\\\"zipcode\\\"],[[28,[\\\"locationAddress\\\",\\\"street1\\\"]],[28,[\\\"locationAddress\\\",\\\"street2\\\"]],[28,[\\\"locationAddress\\\",\\\"city\\\"]],[28,[\\\"locationAddress\\\",\\\"state\\\"]],[28,[\\\"locationAddress\\\",\\\"country\\\"]],[28,[\\\"locationAddress\\\",\\\"zipcode\\\"]]]]],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"expand-line-breaks\\\"],[[28,[\\\"locationAddress\\\",\\\"content\\\"]]],null],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location-actions\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"editing\\\"]],[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null],[28,[\\\"location\\\",\\\"floorplan\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"floorplan\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-sm btn-flat floorplan-action\\\"],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"id\\\",[34,[[26,[\\\"attachmentId\\\"]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleFloorplan\\\"]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-floor-plan\\\"],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.location.editFloor\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.location.floorplan\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"floorplan-popover\\\"],null,[[\\\"show\\\",\\\"attachmentId\\\",\\\"hidePopover\\\"],[[28,[\\\"showFloorplan\\\"]],[28,[\\\"attachmentId\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"hideFloorplan\\\"],null]]],{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"floorplan-editor\\\"],null,[[\\\"entity\\\",\\\"location\\\",\\\"editing\\\",\\\"parentLocation\\\",\\\"field\\\",\\\"fieldData\\\",\\\"saveLocation\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"locationData\\\",\\\"content\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"location\\\",\\\"parent\\\"]],[28,[\\\"field\\\"]],[28,[\\\"fieldData\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"confirm\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"googleMapsHref\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"map\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-sm btn-flat\\\"],[15,\\\"target\\\",\\\"_blank\\\"],[15,\\\"rel\\\",\\\"noopener noreferrer\\\"],[16,\\\"href\\\",[26,[\\\"googleMapsHref\\\"]],null],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-map\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.location.map\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"new-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"parent-location \\\",[33,[\\\"unless\\\"],[[28,[\\\"parentLocation\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"class\\\"],[[28,[\\\"parentLocation\\\"]],96,\\\"location-image\\\"]]],false],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"h5\\\",[]],[15,\\\"class\\\",\\\"location-name\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"parentLocation\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"parentLocation\\\",\\\"address\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"address\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"expand-line-breaks\\\"],[[28,[\\\"parentLocation\\\",\\\"address\\\"]]],null],true],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"floorLocation\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"floor-location \\\",[33,[\\\"unless\\\"],[[28,[\\\"parentLocation\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"location\\\",\\\"floorplan\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"class\\\"],[[28,[\\\"parentLocation\\\"]],96,\\\"location-image\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"class\\\"],[[28,[\\\"location\\\"]],96,\\\"location-image\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"h5\\\",[]],[15,\\\"class\\\",\\\"location-name\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[28,[\\\"floorLocation\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"location-container dropdown\\\\n                            \\\",[33,[\\\"if\\\"],[[28,[\\\"selectedParentLocation\\\"]],\\\"selected-parent\\\"],null],\\\"\\\\n                            \\\",[33,[\\\"unless\\\"],[[28,[\\\"parentLocation\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"locationChoices\\\"]]],null,{\\\"statements\\\":[[6,[\\\"dropdown-menu\\\"],null,[[\\\"title\\\"],[[28,[\\\"choiceText\\\"]]]],{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"locationChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"parent-location floor-choice\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectFloorLocation\\\",[28,[\\\"location\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\"],[[28,[\\\"location\\\"]],96]]],false],[0,\\\"\\\\n                                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"content\\\"],[13],[0,\\\"\\\\n                                            \\\"],[11,\\\"div\\\",[]],[13],[0,\\\"\\\\n                                                \\\"],[11,\\\"strong\\\",[]],[13],[1,[28,[\\\"location\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n                                            \\\"],[14],[0,\\\"\\\\n                                            \\\"],[11,\\\"div\\\",[]],[13],[0,\\\"\\\\n                                                \\\"],[1,[28,[\\\"location\\\",\\\"address\\\"]],false],[0,\\\"\\\\n                                            \\\"],[14],[0,\\\"\\\\n                                        \\\"],[14],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"location\\\"]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"empty\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"field.noFloors\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"entity-search\\\"],null,[[\\\"type\\\",\\\"filterFunction\\\",\\\"select\\\",\\\"class\\\"],[\\\"locations\\\",[28,[\\\"filterLocations\\\"]],\\\"selectParentLocation\\\",[33,[\\\"concat\\\"],[[33,[\\\"if\\\"],[[28,[\\\"parentLocation\\\"]],\\\"hide\\\"],null],\\\" \\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/location-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { on, run, set } = Ember;\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    classNameBindings: ['isValid::invalid-text'],\n\n    ensurePopulatedField: on('didRender', function () {\n        if (!this.get('editing') || this.isDestroyed) {\n            return;\n        }\n        if (this.isFieldEmpty()) {\n            run(() => {\n                const timer = run.once(this, this.setValues);\n                this.timers.pushObject(timer);\n            });\n        }\n    }),\n\n    isFieldEmpty() {\n        let field = this.get('field');\n        let entity = this.get('entity');\n\n        if (field && entity) {\n            let path = this.get('field').getFieldPath();\n            let value = this.get('entity').getFieldValue(path);\n\n            return _.isEmpty(value);\n        }\n    },\n\n    setValues() {\n        let entity = this.get('entity');\n        let path = this.get('field').getFieldPath();\n        let entry = this.get('entry');\n\n        if (!_.isEmpty(entry)) {\n            set(entry, 'value', '');\n            entity.set(path, [entry], { overwrite: true });\n        } else {\n            entity.set(path, '');\n        }\n\n        let value = entity.getFieldValue(path);\n        if (Array.isArray(value)) {\n            value = value[0];\n        }\n\n        this.set('entry', value);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"O5e8hUC7\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showLabel\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"textarea\\\"],null,[[\\\"value\\\",\\\"classNames\\\",\\\"class\\\"],[[28,[\\\"entry\\\",\\\"value\\\"]],\\\"form-control\\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error help-block\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.maxFieldWithLength\\\"],[[\\\"length\\\"],[[28,[\\\"field\\\",\\\"params\\\",\\\"maxLength\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"multi-line-value\\\"],[[28,[\\\"entry\\\",\\\"value\\\"]]],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/multiline-text-field/template.hbs\"}});","import Ember from 'ember';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    actions: {\n        selectPersonFromPicker: function (person) {\n            this.set('entry.value', person.get('id'));\n        }\n    },\n\n    person: Ember.computed('entry.value', function () {\n        var value = this.get('entry.value');\n        if (value) {\n            return this.store.find('person', value);\n        }\n\n        return undefined;\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"u4vyWJcp\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"person\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"person-icon\\\"],null,[[\\\"personId\\\"],[[28,[\\\"person\\\",\\\"id\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/person-field/template.hbs\"}});","/* global intlTelInputUtils */\n\nimport Ember from 'ember';\nimport _ from 'lodash';\nimport debounce from 'lodash.debounce';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { get, inject, computed, observer, Component } = Ember;\n\nlet requireFields = ['contactInfo.phone_other'];\n\nexport default Component.extend(FieldComponentMixin, {\n    classNameBindings: ['isNumberError:invalid-value', 'hasErrorCode:has-error-code'],\n\n    intl: inject.service(),\n    webrtc: inject.service(),\n    phone: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n    addressformat: inject.service(),\n\n    complexField: true,\n    complexValueFields: ['entry.value.number', 'entry.value.extension', 'entry.value.acceptSMS'],\n\n    isActive: false,\n\n    entry: computed.alias('fieldData.value'),\n\n    timers: null,\n\n    actions: {\n        setPrimary() {\n            this.set('isPrimary', true);\n            if (\n                this.get('session.features.emergencyLocation') &&\n                this.get('entry.value.number') &&\n                this.setPrimaryCallback\n            ) {\n                this.setPrimaryCallback(this.get('entry.value.number'));\n            }\n        },\n\n        setPrimarySMS() {\n            this.set('isPrimarySMS', true);\n            this.set('entry.value.acceptsSMS', true);\n        },\n\n        toggleSMS(event) {\n            this.toggleProperty('entry.value.acceptsSMS');\n\n            if (event) {\n                event.stopPropagation();\n            }\n        },\n\n        makeCall: debounce(function () {\n            var phoneNumber = this.get('entry');\n            this.bubbleAction({\n                action: 'startCallByNumber',\n                actionContext: [phoneNumber]\n            });\n        }, 250),\n\n        focus() {\n            this.set('isActive', true);\n        },\n\n        updateNumber(event) {\n            this.set('entry.value.number', event.target.value);\n        },\n\n        updateExtension(value) {\n            this.set('entry.value.extension', value);\n        }\n    },\n\n    init() {\n        this.set('timers', []);\n\n        this._super(...arguments);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.ensurePopulatedField();\n    },\n\n    ensurePopulatedField: observer('editing', function () {\n        const timer = Ember.run.scheduleOnce('afterRender', this, this._setupData);\n        this.get('timers').addObject(timer);\n    }),\n\n    addBehavior: observer('editing', function () {\n        let timer;\n        if (!this.get('editing')) {\n            timer = Ember.run.scheduleOnce('afterRender', this, this.setupTooltips);\n            this.get('timers').addObject(timer);\n\n            return;\n        }\n\n        timer = Ember.run.scheduleOnce('afterRender', this, this._setupInput);\n        this.get('timers').addObject(timer);\n    }).on('didInsertElement'),\n\n    dialableNumber: computed('entry.rel.e164', 'entry.value.{number,extension}', function () {\n        var e164 = this.get('entry.rel.e164');\n        if (e164) {\n            return e164;\n        }\n\n        var number = this.get('entry.value.number');\n        var extension = this.get('entry.value.extension');\n\n        number = number ? number.replace(/\\D/g, '') : number;\n        extension = extension ? extension.replace(/\\D/g, '') : extension;\n\n        if (number) {\n            number = this.get('addressformat').formatAddress(number);\n            if (extension) {\n                return `${number};ext=${extension}`;\n            } else {\n                return number;\n            }\n        } else if (extension) {\n            return extension;\n        }\n    }),\n\n    isPrimarySMS: computed('entry._id', 'entity.primaryContactInfo.sms', 'isEmpty', {\n        get() {\n            return this.checkPrimaryForType('sms');\n        },\n\n        set(key, value) {\n            const entity = this.get('entity');\n            const type = 'sms';\n\n            entity.setPrimaryContact(type, this.get('entry'), this.get('field.fieldPath'));\n\n            return value;\n        }\n    }),\n\n    isPrimary: computed('entry._id', 'entity.primaryContactInfo.voice', 'isEmpty', {\n        get() {\n            return this.checkPrimaryForType('voice');\n        },\n\n        set(key, value) {\n            let entity = this.get('entity');\n            let type = this.get('fieldData.field.type');\n\n            entity.setPrimaryContact(type, this.get('entry'), this.get('field.fieldPath'));\n\n            return value;\n        }\n    }),\n\n    dialCode: computed('entry.value.number', function () {\n        let $input = this.get('$input');\n        let initialCountry = !_.isEmpty($input) ? $input.intlTelInput('getSelectedCountryData') : null;\n        if (_.isEmpty(initialCountry) && this.get('intl.iso2LocaleCountry')) {\n            initialCountry = this.get('intl.iso2LocaleCountry');\n        }\n        return initialCountry.dialCode;\n    }),\n\n    errorMsg: computed('entry.value.{number,extension}', function () {\n        const intl = this.get('intl');\n        const number = this.get('entry.value.number');\n        const extension = this.get('entry.value.extension');\n        const $input = this.get('$input');\n\n        let iso2LocaleCountry, initialCountry;\n\n        if (this.get('intl.iso2LocaleCountry')) {\n            iso2LocaleCountry = this.get('intl.iso2LocaleCountry.iso2');\n        }\n\n        if ($input.intlTelInput('getSelectedCountryData')) {\n            initialCountry = $input.intlTelInput('getSelectedCountryData').iso2;\n        }\n\n        if (!initialCountry) {\n            $input.intlTelInput('setCountry', iso2LocaleCountry);\n        }\n\n        if (_.isEmpty(number) && !_.isEmpty(extension)) {\n            return null;\n        }\n\n        // https://github.com/Bluefieldscom/intl-tel-input/blob/master/lib/libphonenumber/src/utils.js#L175\n        let errorCode = $input.intlTelInput('getValidationError');\n        let message = '';\n        switch (errorCode) {\n            case intlTelInputUtils.validationError.INVALID_COUNTRY_CODE:\n                message = intl.lookup('entity.fieldTypes.phone.validation.invalidCountryCode');\n                break;\n            case intlTelInputUtils.validationError.TOO_SHORT:\n                message = intl.lookup('entity.fieldTypes.phone.validation.tooShort');\n                break;\n            case intlTelInputUtils.validationError.TOO_LONG:\n                // I don't understand this error.  This occurs on U.S. numbers as you type them in with an area code.  Using 'Not a number' instead of too long message.\n                // this.set('errorMsg', lookup('entity.fieldTypes.phone.validation.tooLong'));\n                message = intl.lookup('entity.fieldTypes.phone.validation.notANumber');\n                break;\n            case intlTelInputUtils.validationError.NOT_A_NUMBER:\n                message = intl.lookup('entity.fieldTypes.phone.validation.notANumber');\n                break;\n            default:\n                message = null;\n        }\n\n        return message;\n    }),\n\n    isRequiredPhone: computed('field', function () {\n        let path = this.get('field').getFieldPath();\n        return Ember.A(requireFields).includes(path);\n    }),\n\n    isRequiredError: computed('entry.value.{number,extension}', 'isRequiredPhone', function () {\n        if (!this.get('isRequiredPhone')) {\n            return false;\n        }\n        let number = this.get('entry.value.number');\n        let extension = this.get('entry.value.extension');\n        return _.isEmpty(number) && _.isEmpty(extension);\n    }),\n\n    isNumberError: computed('entry.value.{number,extension}', '$input', 'isRequiredPhone', function () {\n        let number = this.get('entry.value.number');\n        let extension = this.get('entry.value.extension');\n        if (!this.get('isRequiredPhone') && _.isEmpty(number)) {\n            return false;\n        } else if (this.get('isRequiredPhone') && _.isEmpty(number) && !_.isEmpty(extension)) {\n            // Any extension is allowed because we dont know what the extension pool contains\n            return false;\n        }\n        const $input = this.get('$input');\n        if (!$input || !$input.intlTelInput) {\n            return false;\n        }\n        return !$input.intlTelInput('isValidNumber');\n    }),\n\n    errorClass: computed('isRequiredError', 'isNumberError', function () {\n        if (this.get('isRequiredError')) {\n            return 'has-error';\n        }\n        if (this.get('isNumberError')) {\n            return 'has-warning';\n        }\n        return '';\n    }),\n\n    isValid: computed('entry.value.{number,extension}', 'isRequiredError', function () {\n        if (!this.get('editing') || this.isDestroyed || this.isDestroying) {\n            return true;\n        }\n\n        const isRequiredError = this.get('isRequiredError');\n        const isValid = this.get('isRequiredPhone') ? !isRequiredError : true;\n\n        const timer = Ember.run.scheduleOnce('afterRender', this, this._setFieldDataValidity, isValid);\n        this.get('timers').addObject(timer);\n\n        return isValid;\n    }),\n\n    hasError: computed.not('isValid'),\n    hasErrorCode: computed('entry.rel.errorCode', function () {\n        return !_.isEmpty(this.get('entry.rel.errorCode'));\n    }),\n\n    errorMessage: computed('entry.rel.errorCode', function () {\n        const errorCode = this.get('entry.rel.errorCode');\n        const key = `purecloud.error.api.${errorCode}`;\n        return this.get('intl').lookup(key, null, errorCode.replace(/_/g, ' ')).toString();\n    }),\n\n    didUpdateAttrs({ newAttrs }) {\n        if (!get(newAttrs, 'editing.value') && !this.get('isValid')) {\n            this.set('entry.value.number', '');\n        }\n    },\n\n    willDestroyElement() {\n        this.get('timers').forEach(timer => Ember.run.cancel(timer));\n\n        this.$('.phone-input').intlTelInput('destroy');\n\n        this._super(...arguments);\n    },\n\n    checkPrimaryForType(type) {\n        let entryId = this.get('entry._id');\n        let fieldId = this.get(`entity.primaryContactInfo.${type}.firstObject.value.fieldId`);\n        return fieldId && fieldId === entryId && !this.get('isEmpty');\n    },\n\n    focusOut() {\n        this._super(...arguments);\n\n        this.set('isActive', false);\n\n        const value = this.get('entry.value.number');\n        if (value === '+1') {\n            this.set('entry.value.number', '');\n        }\n    },\n\n    focusNewField() {\n        let empty = this.get('isEmpty');\n        let added = this.get('entry.isAdded');\n\n        if (added) {\n            return;\n        }\n\n        this.set('entry.isAdded', true);\n        if (empty) {\n            this.$('.phone-input').trigger('focus');\n        }\n    },\n\n    cleanFieldForSave() {\n        if (this.get('entry.value') && this.get('$input')) {\n            var countryData = this.get('$input').intlTelInput('getSelectedCountryData');\n            if (countryData && countryData.iso2) {\n                this.set('entry.value.countryCode', countryData.iso2.toLocaleUpperCase());\n            }\n        }\n    },\n\n    isComplexFieldEmpty() {\n        var number = this.get('entry.value.number');\n        var extension = this.get('entry.value.extension');\n        return (\n            ((typeof number === 'string' && number.length === 0) || number === undefined) &&\n            ((typeof extension === 'string' && extension.length === 0) || extension === undefined)\n        );\n    },\n\n    setupTooltips() {\n        this.$('[data-toggle=\"tooltip\"]').tooltip();\n    },\n\n    _setupData() {\n        if (!this.get('editing')) {\n            return;\n        }\n\n        let entry = this.get('entry');\n        let entity = this.get('entity');\n        let emptyData = {\n            number: '',\n            extension: '',\n            acceptsSMS: false\n        };\n\n        if (_.isEmpty(entry) || (_.isEmpty(entry.value) && !this.get('field.repeatable'))) {\n            let path = this.get('field').getFieldPath();\n            entity.set(path, emptyData);\n            this.set('entry', _.last(entity.get(path)));\n        } else if (!_.isEmpty(entry) && _.isEmpty(entry.value)) {\n            Ember.set(entry, 'value', emptyData);\n        }\n    },\n\n    _setupInput() {\n        if (!this.get('editing')) {\n            return;\n        }\n\n        const orgCountryCode = this.get('session.org').getFieldValue('general.defaultCountryCode');\n        let countryCode = 'us';\n        if (orgCountryCode && orgCountryCode.value) {\n            countryCode = orgCountryCode.value.toLowerCase();\n        }\n\n        let $input = this.$('.phone-input');\n        $input.intlTelInput({\n            nationalMode: false,\n            utilsScript: `${this.get('application.urlprefix')}assets/intltelinput/utils.js`,\n            // preferredCountries: ['us', 'gb', 'es', 'fr']\n            initialCountry: countryCode\n        });\n\n        $input.on('blur', function () {\n            //Let the Ember input binding know that the plugin updated the value after blur event.\n            $input.trigger('change');\n        });\n\n        this.set('$input', $input);\n        this.notifyPropertyChange('isValid');\n    },\n\n    _setFieldDataValidity(value) {\n        this.set('fieldData.isValid', value);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"esVDJxxY\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"for\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-number\\\"],null],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"phone-field-content \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"value \\\",[26,[\\\"errorClass\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"number\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-number\\\"]]],[15,\\\"type\\\",\\\"tel\\\"],[16,\\\"value\\\",[34,[[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]]]]],[16,\\\"class\\\",[34,[\\\"phone-input form-control phone-number \\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],[16,\\\"onfocus\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"focus\\\"],[[\\\"on\\\"],[\\\"focus\\\"]]],null],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateNumber\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-extension\\\"]]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extensionLabel\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"key-up\\\",\\\"classNames\\\",\\\"class\\\",\\\"placeholder\\\",\\\"type\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-extension\\\"],null],[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]],\\\"updateExtension\\\",\\\"form-control phone-extension\\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-warning\\\"],null],[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],\\\"tel\\\"]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isRequiredError\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error help-block\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.validation.notANumber\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isNumberError\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warn help-block\\\"],[13],[0,\\\"\\\\n\\\"],[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.acdInteraction.sms.errors.invalidNumberFormat\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"session\\\",\\\"features\\\",\\\"AGORA-268_connections-ui-in-admin-ui\\\"]],[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"enabled\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasErrorCode\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[15,\\\"data-toggle\\\",\\\"tooltip\\\"],[15,\\\"data-placement\\\",\\\"right\\\"],[15,\\\"data-trigger\\\",\\\"hover\\\"],[16,\\\"title\\\",[34,[[26,[\\\"errorMessage\\\"]]]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-warning\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"id\\\",\\\"label\\\",\\\"protocol\\\",\\\"value\\\",\\\"title\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-number\\\"],null],[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]],\\\"tel\\\",[28,[\\\"dialableNumber\\\"]],[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\",\\\"title\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]],\\\"tel\\\",[28,[\\\"dialableNumber\\\"]],[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"value-type \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"primary-phone-choice\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"radio-input\\\"],null,[[\\\"checked\\\",\\\"disabled\\\",\\\"onClick\\\",\\\"name\\\",\\\"ariaLabelledby\\\"],[[28,[\\\"isPrimary\\\"]],[28,[\\\"isEmpty\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setPrimary\\\"],null],\\\"primaryPhone\\\",\\\"primary-phone\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"isPrimary\\\"]],[28,[\\\"isPrimarySMS\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"label label-default\\\"],[15,\\\"role\\\",\\\"status\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"field.primaryVoiceSMS\\\"],null]]]],[13],[1,[33,[\\\"t\\\"],[\\\"field.primaryVoiceSMS\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isPrimary\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"label label-default\\\"],[15,\\\"role\\\",\\\"status\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"field.primaryVoice\\\"],null]]]],[13],[1,[33,[\\\"t\\\"],[\\\"field.primaryVoice\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isPrimarySMS\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"label label-default\\\"],[15,\\\"role\\\",\\\"status\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"field.primarySMS\\\"],null]]]],[13],[1,[33,[\\\"t\\\"],[\\\"field.primarySMS\\\"],null],false],[14],[0,\\\"\\\\n                \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"value-type primary-sms-choice\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"radio-input\\\"],null,[[\\\"checked\\\",\\\"disabled\\\",\\\"onClick\\\",\\\"name\\\",\\\"ariaLabelledby\\\"],[[28,[\\\"isPrimarySMS\\\"]],[28,[\\\"isEmpty\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setPrimarySMS\\\"],null],\\\"primarySms\\\",\\\"primary-sms-phone\\\"]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"loading-indicator\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/phone-field/template.hbs\"}});","import Ember from 'ember';\nimport find from 'lodash/find';\nimport isEmpty from 'lodash/isEmpty';\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    intl: Ember.inject.service(),\n\n    choice: Ember.computed.alias('entry.value'),\n\n    actions: {\n        setValue(value) {\n            if (!value) {\n                value = this.get('defaultValue.id');\n            }\n\n            this.set('choice', value);\n            Ember.set(this, 'entry.value', value);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        const timer = Ember.run.scheduleOnce('afterRender', this, 'ensurePopulatedField');\n        this.timers.pushObject(timer);\n    },\n\n    populateFieldOnRender: Ember.observer('editing', function () {\n        const timer = Ember.run.scheduleOnce('afterRender', this, 'ensurePopulatedField');\n        this.timers.pushObject(timer);\n    }),\n\n    ensurePopulatedField() {\n        if (!this.get('editing')) {\n            return;\n        }\n\n        const path = this.get('field').getFieldPath();\n        const entry = this.get('entry');\n        const entity = this.get('entity');\n\n        if (this.isFieldEmpty()) {\n            let value = this.get('field.params.allowedValues')[0];\n\n            if (!value) {\n                value = '';\n            }\n\n            if (!isEmpty(entry)) {\n                Ember.set(entry, 'value', value);\n                entity.set(path, [entry], { overwrite: true });\n            } else {\n                entity.set(path, value);\n            }\n\n            this.set('entry', entity.getFieldValue(path));\n        }\n    },\n\n    defaultValue: Ember.computed('content', 'entry.value', function () {\n        const value = this.get('entry.value');\n        if (!isEmpty(value)) {\n            const defaultValue = find(this.get('content'), 'id', value);\n            if (!isEmpty(defaultValue)) {\n                return defaultValue;\n            }\n        }\n\n        return this.get('content.0.id');\n    }),\n\n    content: Ember.computed('field.params.allowedValues', function () {\n        const allowedValues = this.get('field.params.allowedValues') || [];\n        return allowedValues.map(value => {\n            const label = this.translatedAllowedValue(value).toString();\n            return {\n                id: value,\n                label\n            };\n        });\n    }),\n\n    translatedValue: Ember.computed('entry.value', function () {\n        const value = this.get('entry.value');\n        if (value) {\n            const fieldKey = this.get('field').getI18nKey();\n            const valueKey = value.replace(/\\./g, '_');\n            const key = `${fieldKey}_value_${valueKey}`;\n\n            if (this.get('intl').query(key)) {\n                return this.get('intl').lookup(key);\n            }\n        }\n        return value;\n    }),\n\n    translatedAllowedValue(value) {\n        const fieldKey = this.get('field').getI18nKey();\n        const valueKey = value.replace(/\\./g, '_');\n        const key = `${fieldKey}_value_${valueKey}`;\n\n        if (this.get('intl').query(key)) {\n            return this.get('intl').lookup(key);\n        }\n\n        return valueKey;\n    },\n\n    isFieldEmpty() {\n        const field = this.get('field');\n        const entity = this.get('entity');\n\n        if (field && entity) {\n            const path = this.get('field').getFieldPath();\n            const value = this.get('entity').getFieldValue(path);\n\n            return isEmpty(value);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"Qv4n7ECK\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-10\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"select\\\",[]],[15,\\\"class\\\",\\\"form-control\\\"],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setValue\\\"],[[\\\"value\\\"],[\\\"target.value\\\"]]],null],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"content\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"option\\\",[]],[16,\\\"value\\\",[28,[\\\"item\\\",\\\"id\\\"]],null],[16,\\\"selected\\\",[33,[\\\"eq\\\"],[[28,[\\\"choice\\\"]],[28,[\\\"item\\\",\\\"id\\\"]]],null],null],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"item\\\",\\\"label\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"item\\\"]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[13],[1,[26,[\\\"translatedValue\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/select-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\nimport { rerunLayouts } from '../../../utils/masonry';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend(FieldComponentMixin, {\n    classNames: ['tags'],\n    classNameBindings: ['field.fieldPathClass'],\n\n    intl: inject.service(),\n\n    actions: {\n        addTag(tag) {\n            let tags = this.get('entry.value');\n            if (!_.isEmpty(tag) || (typeof tag === 'string' && !_.isEmpty(tag.trim()))) {\n                if (tags.indexOf(tag) !== -1) {\n                    this.send('showDuplicateError', tag);\n                }\n                tags.addObject(tag);\n                rerunLayouts();\n            }\n        },\n\n        removeTag(tag) {\n            this.get('entry.value').removeObject(tag);\n            rerunLayouts();\n        },\n\n        showDuplicateError(tag) {\n            let addTag = this.$('.add-tag');\n\n            addTag\n                .tooltip({\n                    title: this.get('intl').lookup('tooltip.fields.tags.duplicate', { tag }).toString(),\n                    placement: 'bottom',\n                    trigger: 'manual'\n                })\n                .tooltip('show');\n\n            Ember.run.later(function () {\n                addTag.tooltip('destroy');\n            }, 3000);\n        }\n    },\n\n    linkable: computed('field.fieldPath', function () {\n        const fieldPath = this.get('field.fieldPath');\n        return _.includes(['skills.skills', 'skills.certs'], fieldPath);\n    }),\n\n    sortedTags: computed('entry.value.[]', function () {\n        let tags = this.get('entry.value') || [];\n        return _.sortBy(tags, tag => tag.toLowerCase());\n    }),\n\n    ensurePopulatedField: Ember.on('didRender', function () {\n        if (!this.get('editing') || this.isDestroyed) {\n            return;\n        }\n\n        const timer = Ember.run.once(this, this.setValues);\n        this.timers.pushObject(timer);\n    }),\n\n    setValues() {\n        let entry = this.get('entry');\n        let fieldPath = this.get('field').getFieldPath();\n        let entity = this.get('entity');\n\n        if (entity && (!entry || typeof entry.value !== 'object')) {\n            entity.set(fieldPath, [], { recordChange: true });\n            this.set('entry', entity.getFieldValue(fieldPath));\n        }\n    }\n});\n","import Ember from 'ember';\nimport { eventToString } from 'connections-ui/utils/keystroke';\n\nconst { on, Component, inject } = Ember;\n\nexport default Component.extend({\n    classNames: ['tag-editor'],\n\n    ajax: inject.service(),\n    search: inject.service(),\n\n    attrs: {\n        field: null,\n        addTag() {}\n    },\n\n    tagValue: null,\n\n    currentRequest: null,\n\n    initTagInput: on('didInsertElement', function () {\n        let $typeahead = this.$('input').typeahead(\n            { highlight: true, hint: false },\n            {\n                name: 'tags',\n                async: true,\n                limit: 100,\n                displayKey: 'text',\n                source: Ember.run.bind(this, (query, syncResults, asyncResults) => {\n                    Ember.run.debounce(this, this.performSearch.bind(this, query, asyncResults), 300);\n                })\n            }\n        );\n\n        $typeahead.on('typeahead:selected', this.addTagFromTypeahead.bind(this));\n        $typeahead.on('typeahead:change', this.clearInput.bind(this));\n\n        this.$('input').on('blur', this.clearInput.bind(this));\n    }),\n\n    removeBehavior: on('willDestroyElement', function () {\n        this.$('input').typeahead('destroy');\n    }),\n\n    performSearch(query, cb) {\n        let type = 'purecloud.skills';\n        const fieldPath = this.get('field').getFieldPath();\n        if (fieldPath === 'skills.spokenLanguages') {\n            type = 'purecloud.languages';\n        }\n        const request = this.get('search').search({\n            types: ['tags'],\n            query: [\n                {\n                    type: 'TERM',\n                    value: type,\n                    fields: ['namespace']\n                },\n                {\n                    type: 'STARTS_WITH',\n                    value: query,\n                    fields: ['name']\n                }\n            ],\n            returnFields: ['key']\n        });\n        this.set('currentRequest', request);\n        return request\n            .then(data => {\n                let tags = data.results;\n                let suggestions = Ember.A(tags).map(function (tag) {\n                    return {\n                        value: tag.key,\n                        text: tag.key\n                    };\n                });\n\n                cb(suggestions);\n            })\n            .catch(() => {\n                cb([]);\n            });\n    },\n\n    addTagFromTypeahead(event, suggestion /*, dataset*/) {\n        Ember.run(() => {\n            this.attrs.addTag(suggestion.value);\n            this.set('tagValue', '');\n\n            this.$('input').typeahead('close');\n        });\n    },\n\n    clearInput() {\n        Ember.run(() => {\n            if (!this.get('tagValue')) {\n                this.$('input').val('');\n            }\n        });\n    },\n\n    keyDown(event) {\n        if (eventToString(event) === 'ENTER') {\n            this.attrs.addTag(this.get('tagValue'));\n            this.set('tagValue', '');\n\n            this.$('input').typeahead('close');\n\n            let currentRequest = this.get('currentRequest');\n            if (currentRequest && currentRequest.abort) {\n                currentRequest.abort();\n            }\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"c9aPS9VM\",\"block\":\"{\\\"statements\\\":[[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-tag-add\\\"]]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"common.add\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[1,[33,[\\\"input\\\"],null,[[\\\"class\\\",\\\"id\\\",\\\"value\\\",\\\"placeholder\\\"],[\\\"form-control tag-editor-input\\\",[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-tag-add\\\"],null],[28,[\\\"tagValue\\\"]],[33,[\\\"t\\\"],[\\\"common.add\\\"],null]]]],false],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"add\\\"],[13],[0,\\\"+\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/tag-field/tag-editor/template.hbs\"}});","import Ember from 'ember';\n\nconst { Component } = Ember;\n\nexport default Component.extend({\n    tagName: 'span',\n    classNames: ['tag', 'tag-label', 'label-default'],\n    classNameBindings: ['flash'],\n\n    flash: false,\n\n    timers: [],\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        const timer = Ember.run.scheduleOnce('afterRender', this, this.flashTag);\n        this.timers.pushObject(timer);\n    },\n\n    willDestroyElement() {\n        this.timers.forEach(timer => Ember.run.cancel(timer));\n        this.timers = [];\n\n        this._super(...arguments);\n    },\n\n    flashTag() {\n        this.set('flash', true);\n\n        const timer = Ember.run.later(\n            this,\n            () => {\n                this.set('flash', false);\n            },\n            500\n        );\n        this.timers.pushObject(timer);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"jBdMbnJ7\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-tag\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"entity-fields/tag-field/tag-editor\\\"],null,[[\\\"field\\\",\\\"addTag\\\"],[[28,[\\\"field\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"addTag\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"sortedTags\\\"]]],null,{\\\"statements\\\":[[6,[\\\"entity-fields/tag-field/tag-wrapper\\\"],null,null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text\\\"],[13],[1,[28,[\\\"tag\\\"]],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"remove-tag clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"removeTag\\\",[28,[\\\"tag\\\"]]]],[13],[0,\\\"\\\\n                        ×\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"tag\\\"]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"sortedTags\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"linkable\\\"]]],null,{\\\"statements\\\":[[6,[\\\"link-to\\\"],[\\\"search\\\",[33,[\\\"query-params\\\"],null,[[\\\"query\\\",\\\"entity\\\",\\\"queryFacets\\\"],[\\\"\\\",\\\"people\\\",[33,[\\\"join-strings\\\"],[\\\":\\\",[28,[\\\"field\\\",\\\"fieldPath\\\"]],[28,[\\\"tag\\\"]]],null]]]]],[[\\\"title\\\",\\\"classNames\\\"],[[33,[\\\"t\\\"],[\\\"search.forTag\\\"],[[\\\"tag\\\"],[[28,[\\\"tag\\\"]]]]],\\\"tag tag-label label-default clickable\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text\\\"],[13],[1,[28,[\\\"tag\\\"]],false],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"remove-tag clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"removeTag\\\",[28,[\\\"tag\\\"]]]],[13],[0,\\\"\\\\n                            ×\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"tag tag-label label-default\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text\\\"],[13],[1,[28,[\\\"tag\\\"]],false],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"remove-tag clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"removeTag\\\",[28,[\\\"tag\\\"]]]],[13],[0,\\\"\\\\n                            ×\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"tag\\\"]},null]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/tag-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport textValidator from '../../entity-fields/validators/text';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { on, inject, observer, computed, Component } = Ember;\n\nconst requiredFieldPaths = ['general.name', 'contactInfo.im'];\n\nexport default Component.extend(FieldComponentMixin, {\n    classNames: ['text-field'],\n    classNameBindings: ['canEdit:editing', 'onProfile:on-profile'],\n\n    intl: inject.service(),\n    embedded: inject.service(),\n\n    attrs: {\n        onProfile: false\n    },\n\n    onProfile: false,\n    isGeneralField: false,\n\n    actions: {\n        saveField(event) {\n            const value = event.target.value;\n            if (this.get('onProfile') && this.get('canEdit')) {\n                if (event.type === 'keyup' && event.keyCode !== 13) {\n                    return;\n                }\n                this.saveField(value);\n\n                if (this.get('isGeneralField')) {\n                    // notifyUserGeneralFieldUpdated will trigger a userGeneralFieldUpdated event to Web-Directory if entity is current user.\n                    const embedded = this.get('embedded');\n                    embedded.notifyUserGeneralFieldUpdated(this.get('entity.id'));\n                }\n            } else if (this.get('canEdit')) {\n                this.set('entry.value', value);\n            }\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n    },\n\n    showPlaceholder: computed.reads('onProfile'),\n\n    isValid: computed('entry.value', function () {\n        let fieldData = this.get('fieldData');\n\n        if (fieldData) {\n            return fieldData.get('isValid');\n        } else {\n            let entry = this.get('entry');\n            let field = this.get('field');\n            return textValidator.isValid(entry, field);\n        }\n    }),\n\n    watchValidityToDisableModal: observer('isValid', function () {\n        const disable = this.get('disableModal');\n        if (typeof disable === 'function') {\n            Ember.run.next(null, disable, !this.get('isValid'));\n        }\n    }),\n\n    isEmpty: computed('entry.value', function () {\n        return this.isFieldEmpty();\n    }),\n\n    placeholderText: computed('showPlaceholder', function () {\n        if (this.get('showPlaceholder')) {\n            return this.get('field.i18nLabel');\n        }\n\n        return '';\n    }),\n\n    setMinWidth: observer('canEdit', 'entry.value', function () {\n        // self sizing behavior...\n        if (this.get('onProfile') && this.get('canEdit') && _.isEmpty(this.get('entry.value'))) {\n            Ember.run.scheduleOnce('afterRender', () => {\n                let span = Ember.$('<span class=\"off-page\"></span>');\n                let placeholder = this.get('placeholderText');\n                span.text(placeholder);\n                this.$().append(span);\n                this.$('input').css('min-width', span.width() + 15);\n                span.remove();\n            });\n        }\n    }).on('didInsertElement'),\n\n    ensurePopulatedWhenEditing: observer('editing', 'canEdit', function () {\n        Ember.run.once(this, this.ensurePopulatedField);\n    }).on('didInsertElement'),\n\n    ensurePopulatedField() {\n        if ((!this.get('editing') || this.isDestroyed) && !this.get('isGeneralField')) {\n            return;\n        }\n        if (this.isFieldEmpty()) {\n            Ember.run.once(this, this.setValues);\n        }\n    },\n\n    setWidth: on('didRender', function () {\n        if (this.get('onProfile') && this.get('canEdit')) {\n            let span = this.$('span');\n            this.$('input').width(span.width() + 5);\n        }\n    }),\n\n    setValues() {\n        const entity = this.get('entity');\n        const field = this.get('field');\n        const path = field.getFieldPath();\n        const entry = this.get('entry');\n\n        if (!_.isEmpty(entry)) {\n            Ember.set(entry, 'value', '');\n\n            if (!field.get('repeatable')) {\n                entity.set(path, [entry], { overwrite: true });\n            }\n        } else {\n            entity.set(path, '');\n        }\n\n        if (!field.get('repeatable')) {\n            let value = entity.getFieldValue(path);\n            if (Array.isArray(value)) {\n                value = value[0];\n            }\n            this.set('entry', value);\n        }\n    },\n\n    isFieldEmpty() {\n        let entry = this.get('entry');\n\n        if (!entry) {\n            return true;\n        }\n\n        return _.isEmpty(entry.value);\n    },\n\n    getFieldError() {\n        const intl = this.get('intl');\n        let value = this.get('entry.value');\n        let maxLength = this.get('field.params.maxLength');\n        let fieldPath = this.get('field.fieldPath');\n        if (_.isEmpty(value) && _.includes(requiredFieldPaths, fieldPath)) {\n            return intl.lookup('tooltip.fields.text.requiredError').toString();\n        }\n\n        return intl.lookup('tooltip.fields.text.lengthError', { length: maxLength }).toString();\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"6lvbG/5y\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showLabel\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\",\\\"writeable\\\",\\\"canEdit\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"canEdit\\\"]],[28,[\\\"canEdit\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[16,\\\"for\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null]]]],[13],[1,[26,[\\\"placeholderText\\\"]],false],[14],[0,\\\"\\\\n        \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null]]]],[16,\\\"class\\\",[34,[\\\"form-control purecloud-input \\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],[16,\\\"value\\\",[34,[[28,[\\\"entry\\\",\\\"value\\\"]]]]],[16,\\\"placeholder\\\",[34,[[26,[\\\"placeholderText\\\"]]]]],[16,\\\"onkeyup\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"saveField\\\"],[[\\\"on\\\"],[\\\"keyup\\\"]]],null],[16,\\\"onblur\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"saveField\\\"],[[\\\"on\\\"],[\\\"blur\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.requiredField\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.maxField\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"entry-value\\\"],[13],[1,[28,[\\\"entry\\\",\\\"value\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"off-page\\\"],[13],[1,[28,[\\\"entry\\\",\\\"value\\\"]],false],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/text-field/template.hbs\"}});","import Ember from 'ember';\n\nimport email from './validators/email';\nimport tag from './validators/tag';\nimport history from './validators/history';\nimport text from './validators/text';\nimport location from './validators/location';\nimport date from './validators/date';\nimport phone from './validators/phone';\nimport boolean from './validators/boolean';\nimport address from './validators/address';\nimport select from './validators/select';\nimport multiline from './validators/multiline-text';\nimport person from './validators/person';\nimport weblink from './validators/weblink';\nimport image from './validators/image';\n\nconst { getOwner, computed } = Ember;\n\nexport default Ember.Object.extend({\n    fieldConfig: computed(function () {\n        return getOwner(this).lookup('field-config:person');\n    }),\n\n    default: {\n        isValid() {\n            return false;\n        },\n\n        isEmpty() {\n            return true;\n        }\n    },\n    tag,\n    text,\n    date,\n    email,\n    phone,\n    image,\n    person,\n    select,\n    history,\n    boolean,\n    address,\n    location,\n    weblink,\n    'multiline-text': multiline\n}).create();\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default {\n    isValid(entry, field) {\n        var maxLength = field.get('params.maxLength');\n        if (entry && _.isEmpty(entry.value)) {\n            return true;\n        }\n        return !!(entry && entry.value && Ember.get(entry, 'value.length') <= maxLength);\n    },\n\n    isEmpty(entry) {\n        let value = entry.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","export default {\n    isValid(bool) {\n        let value = bool.value;\n        return (value !== undefined && value !== null) || value === '';\n    },\n\n    isEmpty(bool) {\n        let value = bool.value;\n        return value === undefined || value === null || value === '';\n    }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default {\n    isValid(date, field) {\n        if (field.get('required')) {\n            let value = date.value;\n            return !_.isEmpty(value) && value.day && value.month && value.year;\n        }\n\n        return true;\n    },\n\n    isEmpty(date) {\n        if (!date) {\n            return true;\n        }\n\n        let value = date.value;\n        return _.isEmpty(value);\n    },\n\n    cleanFieldForEntity(entity, field, entry) {\n        let value = Ember.get(entry, 'value');\n        let path = field.getFieldPath();\n\n        if (value) {\n            if (typeof value.year !== 'number') {\n                delete value.year;\n            }\n\n            if (typeof value.month !== 'number') {\n                delete value.month;\n            }\n\n            if (typeof value.day !== 'number') {\n                delete value.day;\n            }\n\n            if (!value.year && !value.month && !value.day) {\n                value = {};\n            }\n        }\n\n        if (_.isEmpty(value)) {\n            let data = entity.get(path);\n            if (data) {\n                data.removeObject(entry);\n            }\n        } else {\n            Ember.set(entry, 'value', value);\n        }\n    }\n};\n","import _ from 'lodash';\n\nfunction isValidEmail(email) {\n    let reg =\n        /^(([^<>()\\[\\]\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\.,;:\\s@\"]+)*)|(\".+\"))@(([^<>()[\\]\\.,;:\\s@\"]+\\.)+[^<>()[\\]\\.,;:\\s@\"]{2,})$/;\n    return email.match(reg);\n}\n\nfunction isEmpty(email) {\n    let value = email && email.value;\n    return !!(value === undefined || value === null || _.isEmpty(value));\n}\n\nexport default {\n    isEmpty,\n\n    isValid(entry, field) {\n        const isGroupField = field.get('section.fieldConfig.entityType') === 'group';\n        if (isEmpty(entry) && isGroupField) {\n            return true;\n        }\n        var maxLength = field.get('params.maxLength');\n\n        return !!(entry && entry.value && entry.value.length <= maxLength && !!isValidEmail(entry.value));\n    }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from 'ember-purecloud-components/utils/dates';\n\nexport default {\n    isValid(history) {\n        if (history && history.value) {\n            let startDate = history.value.startDate;\n            let endDate = history.value.endDate;\n\n            let haveStartDate = !!(startDate && startDate.month && startDate.year);\n            let haveEndDate = !!(endDate && endDate.month && endDate.year);\n\n            if (!haveStartDate && !haveEndDate) {\n                return true;\n            } else if (!haveStartDate && haveEndDate) {\n                return false;\n            } else if (haveStartDate && !haveEndDate) {\n                return true;\n            } else {\n                if (startDate.year < endDate.year) {\n                    return true;\n                } else if (startDate.year > endDate.year) {\n                    return false;\n                } else {\n                    return startDate.month <= endDate.month;\n                }\n            }\n        }\n\n        return history;\n    },\n\n    isEmpty(history) {\n        let value = history.value;\n        // only required field is `where`\n        var where = Ember.get(value, 'where');\n        return where === undefined || _.isEmpty(where.trim());\n    },\n\n    cleanFieldForEntity(entity, field, entry) {\n        let month, year, day;\n        let startDate = Ember.get(entry, 'value.startDate');\n        let endDate = Ember.get(entry, 'value.endDate');\n\n        if (moment.isMoment(startDate)) {\n            startDate = {\n                month: Ember.get(entry, 'value.startDate').format('M'),\n                year: Ember.get(entry, 'value.startDate').format('YYYY')\n            };\n        }\n\n        if (moment.isMoment(endDate)) {\n            endDate = {\n                month: Ember.get(entry, 'value.endDate').format('M'),\n                year: Ember.get(entry, 'value.endDate').format('YYYY')\n            };\n        }\n\n        if (startDate) {\n            day = parseInt(startDate.day);\n            month = parseInt(startDate.month);\n            year = parseInt(startDate.year);\n\n            if (typeof day !== 'number' || isNaN(day)) {\n                delete startDate.day;\n            }\n            if (typeof month !== 'number' || isNaN(month)) {\n                delete startDate.month;\n            }\n            if (typeof year !== 'number' || isNaN(year)) {\n                delete startDate.year;\n            }\n        } else if (startDate === undefined) {\n            startDate = {};\n        }\n\n        if (endDate) {\n            day = parseInt(endDate.day);\n            month = parseInt(endDate.month);\n            year = parseInt(endDate.year);\n\n            if (typeof day !== 'number' || isNaN(day)) {\n                delete endDate.day;\n            }\n            if (typeof month !== 'number' || isNaN(month)) {\n                delete endDate.month;\n            }\n            if (typeof year !== 'number' || isNaN(year)) {\n                delete endDate.year;\n            }\n        } else if (endDate === undefined) {\n            endDate = {};\n        }\n\n        if (entry.value) {\n            Ember.set(entry, 'value.startDate', startDate);\n            Ember.set(entry, 'value.endDate', endDate);\n        }\n    }\n};\n","import _ from 'lodash';\n\nexport default {\n    isValid(text) {\n        return text !== undefined;\n    },\n\n    isEmpty(text) {\n        if (!text) {\n            return true;\n        }\n\n        let value = text.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","import _ from 'lodash';\n\nexport default {\n    isValid(location) {\n        if (!location) {\n            return false;\n        }\n\n        let value = location.value;\n        return !_.isEmpty(value.locationId);\n    },\n\n    isEmpty(location) {\n        if (!location) {\n            return true;\n        }\n\n        let value = location.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","import _ from 'lodash';\n\nexport default {\n    isValid(text, field) {\n        if (!text) {\n            return false;\n        }\n\n        const maxLength = field.get('params.maxLength');\n        if (maxLength && text.value) {\n            return text.value.length <= maxLength;\n        }\n\n        if (field.get('required')) {\n            return !_.isEmpty(text);\n        }\n\n        return text !== undefined && text !== null;\n    },\n\n    isEmpty(text) {\n        if (!text) {\n            return true;\n        }\n\n        let value = text.value;\n        return _.isEmpty(value);\n    }\n};\n","import _ from 'lodash';\n\nexport default {\n    isValid(text) {\n        return text;\n    },\n\n    isEmpty(person) {\n        if (!person) {\n            return true;\n        }\n        let value = person.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst requireFields = ['contactInfo.phone_other'];\n\nfunction isEmptyValue(value) {\n    return value === undefined || value === null || _.isEmpty(value.trim());\n}\n\nexport default {\n    isValid(entry, field, intl, $input) {\n        if (arguments.length !== 4 || !entry || !field || !$input || !intl) {\n            return true;\n        }\n\n        const path = field.getFieldPath();\n        const params = Ember.get(field, 'params');\n        const number = Ember.get(entry, 'value.number');\n        const extension = Ember.get(entry, 'value.extension');\n\n        const isRequired = _.includes(requireFields, path);\n        if (_.isEmpty(number) && _.isEmpty(extension)) {\n            return !isRequired;\n        }\n\n        if (_.isEmpty(number) && !_.isEmpty(extension)) {\n            return true;\n        }\n\n        let isValid = number.length <= params.numberMaxLength;\n\n        if (extension && extension.length) {\n            isValid = isValid && extension.length <= params.extensionMaxLength && !!number;\n        }\n\n        return isValid;\n    },\n\n    isEmpty(phone) {\n        if (!phone || !phone.value) {\n            return true;\n        }\n\n        let value = phone.value;\n        let number = Ember.get(value, 'number');\n        let extension = Ember.get(value, 'extension');\n        return isEmptyValue(number) && isEmptyValue(extension);\n    },\n\n    cleanFieldForEntity(entity, field, entry) {\n        var value = Ember.get(entry, 'value');\n        var path = field.getFieldPath();\n\n        if (value) {\n            if (_.isEmpty(value.number)) {\n                delete value.number;\n            }\n\n            if (_.isEmpty(value.extension)) {\n                delete value.extension;\n            }\n\n            if (!value.number && !value.extension) {\n                value = {};\n            }\n        }\n\n        if (_.isEmpty(value)) {\n            var data = entity.get(path);\n            if (data) {\n                data.removeObject(entry);\n            }\n        } else {\n            Ember.set(entry, 'value', value);\n        }\n    }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default {\n    isValid(select) {\n        if (!select) {\n            return false;\n        }\n\n        return !!(select && select.value);\n    },\n\n    isEmpty(select) {\n        let value = select.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    },\n\n    cleanFieldForEntity(entity, field, entry) {\n        if (!entry) {\n            return;\n        }\n\n        var value = Ember.get(entry, 'value');\n        var path = field.getFieldPath();\n\n        if (_.isEmpty(value)) {\n            var data = entity.get(path);\n            if (data) {\n                data.removeObject(entry);\n            }\n        } else {\n            Ember.set(entry, 'value', value);\n        }\n    }\n};\n","import _ from 'lodash';\n\nexport default {\n    isValid() {\n        return true;\n    },\n\n    isEmpty(tags) {\n        let value = tags.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","import _ from 'lodash';\n\nconst requiredFieldPaths = ['general.name', 'contactInfo.im'];\n\nfunction isEmpty(text) {\n    if (typeof text === 'string') {\n        return _.isEmpty(text);\n    } else {\n        let value = text.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n}\n\nexport default {\n    isValid(text, field) {\n        if (!text) {\n            return false;\n        }\n\n        const maxLength = field.get('params.maxLength');\n        if ((maxLength && text.value && text.value.length > maxLength) || (!text.value && text.length > maxLength)) {\n            return false;\n        }\n\n        if ((field.get('required') || _.includes(requiredFieldPaths, field.getFieldPath())) && isEmpty(text)) {\n            return false;\n        }\n\n        return text !== undefined && text !== null;\n    },\n\n    isEmpty(text) {\n        return isEmpty(text);\n    }\n};\n","import _ from 'lodash';\n\nfunction isValidUrl(url) {\n    var reg =\n        /\\b((?:[a-z][\\w-]+:(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))/;\n    return reg.test(url);\n}\n\nexport default {\n    isValid(url) {\n        if (url && Object.prototype.hasOwnProperty.call(url, 'value')) {\n            url = url.value;\n        }\n\n        return _.isEmpty(url) || isValidUrl(url);\n    },\n\n    isEmpty(url) {\n        let value = url.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nimport validator from '../validators/weblink';\n\nconst { inject, observer, Component } = Ember;\n\nexport default Component.extend(FieldComponentMixin, {\n    classNames: ['web-link'],\n\n    intl: inject.service(),\n\n    tooltip: null,\n\n    labelChoices: Ember.computed(function () {\n        var baseKey = this.get('field').getI18nKey();\n        return _.map(\n            this.get('field.labelKeys'),\n            function (labelKey) {\n                return {\n                    id: labelKey,\n                    label: this._s(`${baseKey}_labelKey_${labelKey}`)\n                };\n            },\n            this\n        );\n    }),\n\n    customLabel: Ember.computed(function () {\n        return '<i class=\"ion-link\"></i>';\n    }),\n\n    isValid: Ember.computed('entry.value', function () {\n        let entry = this.get('entry');\n        return entry && this.isValidUrl(entry);\n    }),\n\n    validityChanged: observer('isValid', 'isEmpty', function () {\n        Ember.run.scheduleOnce('afterRender', this, 'setupTooltips');\n    }).on('didInsertElement'),\n\n    isValidUrl(url) {\n        return validator.isValid(url);\n    },\n\n    isFieldEmpty() {\n        return _.isEmpty(this.get('entry.value'));\n    },\n\n    setupTooltips() {\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n\n        let input = this.$('input');\n        if (this.get('isValid') && !this.get('isEmpty')) {\n            input.tooltip('destroy');\n            this.set('tooltip', null);\n        } else {\n            if (this.get('tooltip')) {\n                return;\n            }\n\n            let title = this.get('intl').lookup('tooltip.fields.weblink.error');\n            let tooltip = input\n                .attr('title', title)\n                .tooltip({\n                    placement: 'right',\n                    trigger: 'manual'\n                })\n                .tooltip('fixTitle')\n                .tooltip('show');\n            this.set('tooltip', tooltip);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"hik8w8PJ\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-link\\\"]]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.webLink.name\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\",\\\"class\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-link\\\"],null],[28,[\\\"entry\\\",\\\"value\\\"]],\\\"form-control\\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"url\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"value\\\",\\\"title\\\"],[[28,[\\\"entry\\\",\\\"value\\\"]],[28,[\\\"entry\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/weblink-field/template.hbs\"}});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { not, or, reads } from '@ember/object/computed';\nimport { bind, cancel, later, once, run, scheduleOnce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\nimport $ from 'jquery';\nimport Popper from 'popper.js';\nimport layout from './template';\n\nconst placeholderImages = {\n    isInitialized: false,\n    person: '',\n    group: '',\n    location: '',\n    floor: ''\n};\n\nfunction placeholderImage(entity) {\n    if (!placeholderImages.isInitialized) {\n        var baseUri = this.get('applicationUrlPrefix') + 'assets/images/svg/';\n\n        placeholderImages.person = baseUri + 'person.svg';\n        placeholderImages.group = baseUri + 'group.svg';\n        placeholderImages.location = baseUri + 'location.svg';\n        placeholderImages.floor = baseUri + 'floor.svg';\n        placeholderImages.queue = baseUri + 'queue.svg';\n\n        placeholderImages.isInitialized = true;\n    }\n    var type;\n    if (entity && entity.get && typeof entity.get === 'function') {\n        type = entity.get('type');\n\n        if (!type) {\n            type = 'person';\n        }\n    } else {\n        type = 'person';\n    }\n\n    return placeholderImages[type];\n}\n\nlet isNameLatin = /^[\\w\\s'\"-,.]+$/i;\n\nexport default Component.extend({\n    layout,\n    classNames: ['entity-mini-card-container'],\n    classNameBindings: [\n        'chatPresenceClass',\n        'microCard',\n        'showPresenceAndChatEnabled:chat-presence',\n        'isPlaceholderImageAndUseInitials:show-initials'\n    ],\n\n    feature: service(),\n    permissions: service(),\n    presenceSubscription: service(),\n\n    entity: null,\n    user: null,\n    size: 200,\n    self: null,\n    hoverParent: null,\n    type: 'profile',\n    applicationUrlPrefix: '',\n    showFavorite: true,\n    isPlaceholderImage: true,\n    useInitialsPlaceholder: false,\n    enableMiniCard: false,\n    microCard: false,\n    showMiniCard: false,\n    showQueueToggle: false,\n    showPresenceDropdown: false,\n    showLogOffButton: false,\n    isChatEnabled: false,\n    phoneServiceEnabled: false,\n    phoneAvailable: false,\n    isOneToOneOfflineOrBusy: true,\n    isGeolocationEnabled: false,\n    videoTooltipTitle: '',\n    imageLoadError: false,\n    isHoveringCard: false,\n    isHoveringImage: false,\n    hoverTimer: null,\n    isFirstHover: true,\n    canViewChat: true,\n    canViewVideo: true,\n\n    // Extensions for third-party UCC affordances\n    useMediaProviders: false,\n    haveMediaProviders: false,\n    mediaProviderComponent: null,\n    useIntegrationBadges: false,\n    integrationBadgesComponent: null,\n\n    tetherConstraints: [\n        {\n            to: 'scrollParent',\n            attachment: 'together',\n            pin: ['left', 'right']\n        }\n    ],\n    hovercardOffset: '0px 0px',\n    toggleFavorite() {},\n    callEntity() {},\n\n    actions: {\n        triggerShowMiniCard() {\n            once(this, this._displayHoverCard);\n            return false;\n        },\n        mouseEnterCard() {\n            this.set('isHoveringCard', true);\n            this.onHoverChanged();\n        },\n        mouseLeaveCard() {\n            this.set('isHoveringCard', false);\n            this.onHoverChanged();\n        },\n        onContact() {\n            run.next(() => this.set('showMiniCard', false));\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this._attachListeners();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._removeListeners();\n    },\n\n    isHovering: or('isHoveringCard', 'isHoveringImage'),\n    isOnline: not('entity.isOffline'),\n\n    chatPresence: reads('entity.activityPresence'),\n    chatPresenceClass: reads('entity.activityPresenceClass'),\n\n    tetherSelector: computed('elementId', function () {\n        return `#${this.get('elementId')}`;\n    }),\n\n    tetherElementId: computed('elementId', function () {\n        return `entity-mini-card-${this.get('elementId')}`;\n    }),\n\n    uniqueId: computed('elementId', function () {\n        return `${this.get('elementId')}-entity-mini-card`;\n    }),\n\n    entityType: computed('entity.type', function () {\n        return `entity-${this.get('entity.type')}`;\n    }),\n\n    linkToProfileRoute: computed('entity.type', function () {\n        if (this.get('entity.type') === 'person') {\n            return 'person.detail';\n        } else if (this.get('entity.type') === 'group') {\n            return 'group.detail';\n        }\n        return 'person.detail';\n    }),\n\n    cardImageUrl: computed(\n        'entity',\n        'entity.isLoaded',\n        'entity.profilePicture',\n        'entity.profilePictureSizes',\n        function () {\n            if (this.get('type') === 'profile') {\n                return this.getProfilePicture(75);\n            } else {\n                return '';\n            }\n        }\n    ),\n\n    name: computed('entity.name', function () {\n        return this.get('entity.name');\n    }),\n\n    nameInitials: computed('initialsPlaceholderSupported', 'entity.name', function () {\n        var name = $.trim(this.get('entity.name'));\n        if (this.get('initialsPlaceholderSupported') && name) {\n            const commaIndex = name.indexOf(',') > -1;\n            const spaceIndex = name.indexOf(' ') > -1;\n            const leftInitial = name[0].toUpperCase();\n            const rightInitial = name.charAt(name.indexOf(' ') + 1).toUpperCase();\n\n            if (commaIndex) {\n                return rightInitial + leftInitial;\n            } else if (!spaceIndex) {\n                return leftInitial;\n            } else {\n                return leftInitial + rightInitial;\n            }\n        }\n        return null;\n    }),\n\n    initialsPlaceholderSupported: computed('entity.name', 'entity.type', function () {\n        const name = this.get('entity.name');\n        if (name) {\n            return isNameLatin.test(name) || this.get('entity.type') === 'externalContact';\n        }\n\n        return false;\n    }),\n\n    isPlaceholderImageAndUseInitials: computed(\n        'useInitialsPlaceholder',\n        'isPlaceholderImage',\n        'nameInitials',\n        function () {\n            return this.get('useInitialsPlaceholder') && this.get('isPlaceholderImage') && !!this.get('nameInitials');\n        }\n    ),\n\n    showPresenceAndChatEnabled: computed('isChatEnabled', 'showPresence', 'entity.type', function () {\n        return this.get('isChatEnabled') && this.get('showPresence') && this.get('entity.type') === 'person';\n    }),\n\n    entityIsGroup: computed('entity.type', function () {\n        return this.get('entity.type') === 'group';\n    }),\n\n    entityDeleted: computed('entity.state', function () {\n        const state = this.get('entity.state');\n        return state && state.toLowerCase() === 'deleted';\n    }),\n\n    isSelfEntity: computed('entity.id', 'self.id', function () {\n        return this.get('entity.id') === this.get('self.id');\n    }),\n\n    placeholderImage,\n\n    getProfilePicture(size) {\n        const profilePicture = this.get('entity.profilePicture');\n        const deviceSize = this.sizeForDevice(size);\n\n        if (!isEmpty(profilePicture)) {\n            scheduleOnce('afterRender', this, this.set, 'isPlaceholderImage', false);\n            const exactMatch = profilePicture[`x${deviceSize}`];\n\n            if (exactMatch) {\n                return exactMatch;\n            }\n        }\n\n        scheduleOnce('afterRender', this, this.set, 'isPlaceholderImage', true);\n        return this.placeholderImage(this.get('entity'));\n    },\n\n    sizeForDevice(size) {\n        size = size || +this.get('size');\n\n        var profilePicture = this.get('entity.profilePicture');\n        var sizes = this.get('entity.profilePictureSizes');\n\n        if (profilePicture && sizes) {\n            // Note: window.devicePixelRatio changes based on which monitor the browser is on in a multi-monitor setup.\n            var ratio = window.devicePixelRatio > 0 ? window.devicePixelRatio : 1;\n            var deviceSize = size * ratio;\n            (sizes || []).forEach(s => {\n                if (s >= deviceSize) {\n                    size = s;\n                    return false;\n                }\n            });\n        }\n\n        return size;\n    },\n\n    mouseEnter() {\n        this.set('isHoveringImage', true);\n        this.onHoverChanged();\n    },\n\n    mouseLeave() {\n        this.set('isHoveringImage', false);\n        this.onHoverChanged();\n    },\n\n    _createPopper() {\n        const el = this.element;\n        if (!el) {\n            return;\n        }\n\n        const targetEl = el.querySelector('.mini-card-component-wrapper');\n        const cardEl = el.querySelector('.entity-mini-card');\n\n        this._popper = new Popper(targetEl, cardEl, {\n            placement: 'bottom',\n            modifiers: {\n                flip: {\n                    behavior: ['bottom', 'top', 'left']\n                },\n                offset: {\n                    offset: '40%p,10px'\n                },\n                arrow: {\n                    element: '.arrow'\n                },\n                preventOverflow: {\n                    padding: 1\n                }\n            }\n        });\n    },\n\n    _destroyPopper() {\n        if (!this._popper) {\n            return;\n        }\n        this._popper.destroy();\n        this._popper = null;\n    },\n\n    _displayHoverCard() {\n        if (!this.get('showMiniCard') && this.get('_state') === 'inDOM' && this.get('enableMiniCard')) {\n            this.set('showMiniCard', true);\n            scheduleOnce('afterRender', this, function () {\n                this._createPopper();\n\n                const image = new Image();\n                image.src = this.get('cardImageUrl');\n                image.onload = () => {\n                    this.set('imageLoadError', false);\n                    if (this._popper) {\n                        this._popper.scheduleUpdate();\n                    }\n                };\n                image.onerror = () => {\n                    this.set('imageLoadError', true);\n                    if (this._popper) {\n                        this._popper.scheduleUpdate();\n                    }\n                };\n            });\n        }\n    },\n\n    onHoverChanged() {\n        const hoverTimeout = 800;\n        const isHovering = this.get('isHovering');\n        let timer = this.get('hoverTimer');\n\n        cancel(timer);\n\n        if (isHovering) {\n            if (!this.get('enableMiniCard')) {\n                return;\n            }\n\n            timer = later(() => {\n                this._displayHoverCard();\n            }, hoverTimeout);\n        } else {\n            timer = later(() => {\n                if (!this.get('isHovering') && this.get('_state') === 'inDOM') {\n                    scheduleOnce('afterRender', this, () => {\n                        this.set('showMiniCard', false);\n                        this._destroyPopper();\n                    });\n                }\n            }, hoverTimeout);\n        }\n\n        this.set('hoverTimer', timer);\n    },\n\n    _attachListeners() {\n        let id = this.get('uniqueId');\n\n        $(window).on(\n            'click.' + id,\n            bind(this, function (event) {\n                if (!event) {\n                    return;\n                }\n                let target = $(event.target);\n\n                let clickedHoverCard = target.parents('#' + id).length || target.parents('.entity-mini-card').length;\n                let checkHoverState = !clickedHoverCard;\n\n                if (checkHoverState) {\n                    if (this.get('showMiniCard')) {\n                        this.set('showMiniCard', false);\n                        this._destroyPopper();\n                        event.preventDefault();\n                    }\n                }\n            })\n        );\n    },\n\n    _removeListeners() {\n        const id = this.get('elementId');\n        const uniqueId = this.get('uniqueId');\n        this.$().off(`.${id}`);\n        $(window).off(`.${uniqueId}`);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"2BQEkRdX\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"mini-card-component-wrapper\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"triggerShowMiniCard\\\"]],[13],[0,\\\"\\\\n    \\\"],[18,\\\"default\\\"],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"enableMiniCard\\\"]],[28,[\\\"showMiniCard\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"entity-mini-card visible\\\\n        \\\",[26,[\\\"tetherElementId\\\"]],\\\"\\\\n        \\\",[33,[\\\"if\\\"],[[28,[\\\"microCard\\\"]],\\\"micro-card\\\"],null],\\\"\\\\n        \\\",[33,[\\\"if\\\"],[[28,[\\\"imageLoadError\\\"]],\\\"image-load-error\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"mouseEnterCard\\\"],[[\\\"on\\\"],[\\\"mouseEnter\\\"]]],[5,[\\\"action\\\"],[[28,[null]],\\\"mouseLeaveCard\\\"],[[\\\"on\\\"],[\\\"mouseLeave\\\"]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"arrow\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"left-bar chat-presence \\\",[26,[\\\"chatPresenceClass\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entityDeleted\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image-link\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[26,[\\\"name\\\"]],null],[16,\\\"aria-label\\\",[26,[\\\"name\\\"]],null],[16,\\\"src\\\",[34,[[26,[\\\"cardImageUrl\\\"]]]]],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"link-to\\\"],[[28,[\\\"linkToProfileRoute\\\"]],[28,[\\\"entity\\\",\\\"id\\\"]]],[[\\\"classNames\\\"],[\\\"image-link\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[26,[\\\"name\\\"]],null],[16,\\\"aria-label\\\",[26,[\\\"name\\\"]],null],[16,\\\"src\\\",[34,[[26,[\\\"cardImageUrl\\\"]]]]],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"useIntegrationBadges\\\"]],[28,[\\\"integrationBadgesComponent\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"integrationBadgesComponent\\\"]]],[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"entityIsGroup\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"presence-label\\\"],null,[[\\\"entity\\\",\\\"wrap\\\",\\\"showStatus\\\",\\\"isChatEnabled\\\"],[[28,[\\\"entity\\\"]],true,false,[28,[\\\"isChatEnabled\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"entity-location\\\"],null,[[\\\"entity\\\",\\\"self\\\",\\\"isGeolocationEnabled\\\",\\\"class\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"self\\\"]],[28,[\\\"isGeolocationEnabled\\\"]],\\\"entity-geolocation align-center\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showPresenceDropdown\\\"]],[28,[\\\"permissions\\\",\\\"canViewSupervisorStatusControls\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"presence-selector-dropdown\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"right-bar\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"h4\\\",[]],[15,\\\"class\\\",\\\"name-header\\\"],[13],[1,[28,[\\\"entity\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"hasChatStatus\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"presence-label-group\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"status-block\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-quote-left blockquote-start\\\"],[13],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"status-text\\\"],[13],[1,[33,[\\\"flair\\\"],[[28,[\\\"entity\\\",\\\"chatStatus\\\"]]],null],true],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-title\\\"],[13],[1,[28,[\\\"entity\\\",\\\"title\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-department\\\"],[13],[1,[28,[\\\"entity\\\",\\\"department\\\"]],false],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showQueueToggle\\\"]],[28,[\\\"permissions\\\",\\\"canViewSupervisorStatusControls\\\"]],[28,[\\\"isOnline\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"queue-toggle-switch\\\"],null,[[\\\"dataOn\\\",\\\"dataOff\\\",\\\"entity\\\",\\\"continueOnQueue\\\"],[\\\"toggle.onQueue\\\",\\\"toggle.offQueue\\\",[28,[\\\"entity\\\"]],true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showLogOffButton\\\"]],[28,[\\\"permissions\\\",\\\"canLogOffAgents\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"logoff-link\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info-actions\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isSelfEntity\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-contact\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"entity-contact-group-v2\\\"],null,[[\\\"entity\\\",\\\"self\\\",\\\"linkProfile\\\",\\\"showFavorite\\\",\\\"compact\\\",\\\"showImages\\\",\\\"phoneServiceEnabled\\\",\\\"phoneAvailable\\\",\\\"isOneToOneOfflineOrBusy\\\",\\\"isChatEnabled\\\",\\\"isWebrtcEnabled\\\",\\\"isVideoButtonEnabled\\\",\\\"videoTooltipTitle\\\",\\\"onContact\\\",\\\"callEntity\\\",\\\"toggleFavorite\\\",\\\"canViewChat\\\",\\\"canViewVideo\\\",\\\"useMediaProviders\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"self\\\"]],[33,[\\\"not\\\"],[[28,[\\\"entityDeleted\\\"]]],null],[28,[\\\"showFavorite\\\"]],true,false,[28,[\\\"phoneServiceEnabled\\\"]],[28,[\\\"phoneAvailable\\\"]],[28,[\\\"isOneToOneOfflineOrBusy\\\"]],[28,[\\\"isChatEnabled\\\"]],[28,[\\\"isWebrtcEnabled\\\"]],[28,[\\\"isVideoButtonEnabled\\\"]],[28,[\\\"videoTooltipTitle\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"onContact\\\"],null],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"callEntity\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"toggleFavorite\\\"]]],null],[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]],[28,[\\\"useMediaProviders\\\"]]]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"user\\\"]],[28,[\\\"useMediaProviders\\\"]],[28,[\\\"mediaProviderComponent\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"mediaProviderComponent\\\"]]],[[\\\"user\\\",\\\"attachTo\\\",\\\"attachClickHandler\\\"],[[28,[\\\"entity\\\"]],[33,[\\\"concat\\\"],[\\\"#\\\",[28,[\\\"elementId\\\"]],\\\" .contact.webrtc\\\"],null],true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"elementId\\\"]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"link-to\\\"],[\\\"person.detail\\\",[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-personicon\\\"],[13],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"menu-label\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToProfile\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-hover-card-v2/template.hbs\"}});","define(\"connections-ui/components/entity-hover-card/component\", [\"exports\", \"ember-purecloud-components/components/entity-hover-card/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Component from '@ember/component';\nimport { computed, observer } from '@ember/object';\nimport { and, reads } from '@ember/object/computed';\nimport { cancel, later, once, run, scheduleOnce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\nimport $ from 'jquery';\nimport layout from './template';\n\nconst placeholderImages = {\n    isInitialized: false,\n    person: '',\n    group: '',\n    location: '',\n    floor: ''\n};\n\nfunction placeholderImage(entity) {\n    if (!placeholderImages.isInitialized) {\n        var baseUri = this.get('applicationUrlPrefix') + 'assets/images/svg/';\n\n        placeholderImages.person = baseUri + 'person.svg';\n        placeholderImages.group = baseUri + 'group.svg';\n        placeholderImages.location = baseUri + 'location.svg';\n        placeholderImages.floor = baseUri + 'floor.svg';\n        placeholderImages.queue = baseUri + 'queue.svg';\n\n        placeholderImages.isInitialized = true;\n    }\n    var type;\n    if (entity && entity.get && typeof entity.get === 'function') {\n        type = entity.get('type');\n\n        if (!type) {\n            type = 'person';\n        }\n    } else {\n        type = 'person';\n    }\n\n    return placeholderImages[type];\n}\n\nlet isNameLatin = /^[\\w\\s'\"-,.]+$/i;\n\nexport default Component.extend({\n    layout,\n    classNames: ['entity-image'],\n    classNameBindings: [\n        'chatPresenceClass',\n        'microCard',\n        'showPresenceAndChatEnabled:chat-presence',\n        'isPlaceholderImageAndUseInitials:show-initials',\n        'entityIsContact:external-contact'\n    ],\n\n    presenceSubscription: service(),\n\n    // parameters used by entity image\n    entity: null,\n    size: 200,\n    type: 'profile',\n    isLinkable: false,\n    applicationUrlPrefix: '',\n    subscribeToPresence: false,\n    showStatusQuote: false,\n    imageLoadError: false,\n    isPlaceholderImage: true,\n    showPresence: false,\n    canViewChat: true,\n    canViewVideo: true,\n    // parameters passed through to entity hover card\n    self: null,\n    showFavorite: true,\n    useInitialsPlaceholder: false,\n    enableMiniCard: false,\n    isChatEnabled: false,\n    phoneServiceEnabled: false,\n    phoneAvailable: false,\n    isOneToOneOfflineOrBusy: true,\n    isGeolocationEnabled: false,\n    videoTooltipTitle: '',\n    isVideoButtonEnabled: false,\n    // entity image logic\n\n    init() {\n        this._super(...arguments);\n        once(this, this._managePresenceSubscription);\n    },\n\n    callEntity() {},\n    toggleFavorite() {},\n\n    didInsertElement() {\n        this._super(...arguments);\n        const $img = this.$(`#${this.get('uniqueId')}`);\n        if ($img && $img.length) {\n            $img.on('load', () => {\n                const func = this.get('componentUpdated');\n                if (func && typeof func === 'function') {\n                    run(() => this.get('componentUpdated')());\n                }\n            });\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._removePresenceSubscription();\n        const $img = this.$(`#${this.get('uniqueId')}`);\n        if ($img && $img.length) {\n            $img.off();\n        }\n\n        if (this.get('_animationRun')) {\n            cancel(this.get('_animationRun'));\n        }\n    },\n\n    managePresenceSubscription: observer(\n        'isChatEnabled',\n        'entity.type',\n        'entity.jid',\n        'subscribeToPresence',\n        function () {\n            once(this, this._managePresenceSubscription);\n        }\n    ),\n\n    displayStatusQuote: and('showPresenceAndChatEnabled', 'showStatusQuote', 'entity.hasChatStatus'),\n    chatPresence: reads('entity.activityPresence'),\n    chatPresenceClass: reads('entity.activityPresenceClass'),\n\n    uniqueId: computed('elementId', function () {\n        return `${this.get('elementId')}-entity-image`;\n    }),\n\n    entityType: computed('entity.type', function () {\n        return `entity-${this.get('entity.type')}`;\n    }),\n\n    linkToProfileRoute: computed('entity.type', function () {\n        if (this.get('entity.type') === 'person') {\n            return 'person.detail';\n        } else if (this.get('entity.type') === 'group') {\n            return 'group.detail';\n        }\n        return 'person.detail';\n    }),\n\n    imageUrl: computed('entity', 'entity.isLoaded', 'entity.profilePicture', 'entity.profilePictureSizes', function () {\n        if (this.get('type') === 'profile') {\n            return this.getProfilePicture();\n        } else {\n            return '';\n        }\n    }),\n\n    name: computed('entity.name', function () {\n        return this.get('entity.name');\n    }),\n\n    nameInitials: computed('initialsPlaceholderSupported', 'entity.name', function () {\n        var name = $.trim(this.get('entity.name'));\n        if (this.get('initialsPlaceholderSupported') && name) {\n            const commaIndex = name.indexOf(',') > -1;\n            const spaceIndex = name.indexOf(' ') > -1;\n            const leftInitial = name[0].toUpperCase();\n            const rightInitial = name.charAt(name.indexOf(' ') + 1).toUpperCase();\n\n            if (commaIndex) {\n                return rightInitial + leftInitial;\n            } else if (!spaceIndex) {\n                return leftInitial;\n            } else {\n                return leftInitial + rightInitial;\n            }\n        }\n        return null;\n    }),\n\n    initialsPlaceholderSupported: computed('entity.name', 'entity.type', function () {\n        const name = this.get('entity.name');\n        if (name) {\n            return isNameLatin.test(name) || this.get('entity.type') === 'externalContact';\n        }\n\n        return false;\n    }),\n\n    isPlaceholderImageAndUseInitials: computed(\n        'useInitialsPlaceholder',\n        'isPlaceholderImage',\n        'nameInitials',\n        function () {\n            return this.get('useInitialsPlaceholder') && this.get('isPlaceholderImage') && !!this.get('nameInitials');\n        }\n    ),\n\n    _animationRun: null,\n    _currentPresence: null,\n    isStatusAnimating: false,\n    animateOnPresenceChange: observer('chatPresence', function () {\n        const nextPresence = this.get('chatPresence');\n        const prevPresence = this.get('_currentPresence');\n        this.set('_currentPresence', nextPresence);\n        if (nextPresence !== prevPresence) {\n            this.set('isStatusAnimating', true);\n            const animationPeriod = 1250;\n            if (this.get('_animationRun')) {\n                cancel(this.get('_animationRun'));\n            }\n            this.set(\n                '_animationRun',\n                later(() => {\n                    if (!this.isDestroying && !this.isDestroyed) {\n                        this.set('isStatusAnimating', false);\n                        this.set('_animationRun', null);\n                    }\n                }, animationPeriod)\n            );\n        }\n    }),\n\n    showPresenceAndChatEnabled: computed('isChatEnabled', 'showPresence', 'entity.type', function () {\n        return this.get('isChatEnabled') && this.get('showPresence') && this.get('entity.type') === 'person';\n    }),\n\n    entityIsContact: computed('entity.type', function () {\n        return this.get('entity.type') === 'externalContact';\n    }),\n\n    entityDeleted: computed('entity.state', function () {\n        const state = this.get('entity.state');\n        return state && state.toLowerCase() === 'deleted';\n    }),\n\n    placeholderImage,\n\n    getProfilePicture(size) {\n        const profilePicture = this.get('entity.profilePicture');\n        const deviceSize = this.sizeForDevice(size);\n\n        if (!isEmpty(profilePicture)) {\n            scheduleOnce('afterRender', this, this.modifyPlaceholderImage, false);\n            const exactMatch = profilePicture[`x${deviceSize}`];\n\n            if (exactMatch) {\n                return exactMatch;\n            }\n        }\n\n        scheduleOnce('afterRender', this, this.modifyPlaceholderImage, true);\n        return this.placeholderImage(this.get('entity'));\n    },\n\n    modifyPlaceholderImage(value) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n        this.set('isPlaceholderImage', value);\n    },\n\n    sizeForDevice(size) {\n        size = size || +this.get('size');\n\n        var profilePicture = this.get('entity.profilePicture');\n        var sizes = this.get('entity.profilePictureSizes');\n\n        if (profilePicture && sizes) {\n            // Note: window.devicePixelRatio changes based on which monitor the browser is on in a multi-monitor setup.\n            var ratio = window.devicePixelRatio > 0 ? window.devicePixelRatio : 1;\n            var deviceSize = size * ratio;\n            (sizes || []).forEach(s => {\n                if (s >= deviceSize) {\n                    size = s;\n                    return false;\n                }\n            });\n        }\n\n        return size;\n    },\n\n    _removePresenceSubscription() {\n        if (this.get('subscribeToPresence')) {\n            this.get('presenceSubscription').autoSubscribe(null, this);\n        }\n    },\n\n    _managePresenceSubscription() {\n        if (this.get('subscribeToPresence') && this.get('entity.type') === 'person' && this.get('entity.jid')) {\n            this.get('presenceSubscription').autoSubscribe([this.get('entity')], this);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"iXs764Hu\",\"block\":\"{\\\"statements\\\":[[6,[\\\"entity-hover-card-v2\\\"],null,[[\\\"entity\\\",\\\"self\\\",\\\"hoverParent\\\",\\\"showFavorite\\\",\\\"isChatEnabled\\\",\\\"phoneAvailable\\\",\\\"isWebrtcEnabled\\\",\\\"enableMiniCard\\\",\\\"isOneToOneOffline\\\",\\\"videoTooltipTitle\\\",\\\"phoneServiceEnabled\\\",\\\"isVideoButtonEnabled\\\",\\\"applicationUrlPrefix\\\",\\\"showPresenceDropdown\\\",\\\"showLogOffButton\\\",\\\"showQueueToggle\\\",\\\"callEntity\\\",\\\"toggleFavorite\\\",\\\"canViewChat\\\",\\\"canViewVideo\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"self\\\"]],[28,[\\\"elementId\\\"]],[28,[\\\"showFavorite\\\"]],[28,[\\\"isChatEnabled\\\"]],[28,[\\\"phoneAvailable\\\"]],[28,[\\\"isWebrtcEnabled\\\"]],[28,[\\\"enableMiniCard\\\"]],[28,[\\\"isOneToOneOffline\\\"]],[28,[\\\"videoTooltipTitle\\\"]],[28,[\\\"phoneServiceEnabled\\\"]],[28,[\\\"isVideoButtonEnabled\\\"]],[28,[\\\"applicationUrlPrefix\\\"]],[28,[\\\"showPresenceDropdown\\\"]],[28,[\\\"showLogOffButton\\\"]],[28,[\\\"showQueueToggle\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"callEntity\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"toggleFavorite\\\"]]],null],[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]]]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"displayStatusQuote\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[\\\"pc-moon pc-quote-right status-quote \\\",[26,[\\\"chatPresence\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isLinkable\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"enableMiniCard\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"img\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"uniqueId\\\"]]]]],[16,\\\"alt\\\",[26,[\\\"name\\\"]],null],[16,\\\"aria-label\\\",[26,[\\\"name\\\"]],null],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[16,\\\"src\\\",[26,[\\\"imageUrl\\\"]],null],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"link-to\\\"],[[28,[\\\"linkToProfileRoute\\\"]],[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"img\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"uniqueId\\\"]]]]],[16,\\\"alt\\\",[26,[\\\"name\\\"]],null],[16,\\\"aria-label\\\",[26,[\\\"name\\\"]],null],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[16,\\\"src\\\",[26,[\\\"imageUrl\\\"]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entityIsContact\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"external-contact-icon\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"top\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"center\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"bottom\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[28,[\\\"isStatusAnimating\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"animated-status\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"animated-radiate chat-presence-bg-color\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"animated-pulse chat-presence-bg-color\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"img\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"uniqueId\\\"]]]]],[16,\\\"alt\\\",[26,[\\\"name\\\"]],null],[16,\\\"aria-label\\\",[26,[\\\"name\\\"]],null],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[16,\\\"src\\\",[26,[\\\"imageUrl\\\"]],null],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"img\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"uniqueId\\\"]]]]],[16,\\\"alt\\\",[26,[\\\"name\\\"]],null],[16,\\\"aria-label\\\",[26,[\\\"name\\\"]],null],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[16,\\\"src\\\",[26,[\\\"imageUrl\\\"]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[29,\\\"default\\\"]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[18,\\\"default\\\",[[28,[\\\"elementId\\\"]]]],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-image-v2/template.hbs\"}});","define(\"connections-ui/components/entity-image/component\", [\"exports\", \"ember-purecloud-components/components/entity-image/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-location/component\", [\"exports\", \"ember-purecloud-components/components/entity-location/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { activityCounter } from 'connections-ui/utils/presence-label-util';\n\nexport default Ember.Component.extend({\n    classNames: ['entity-mini'],\n    classNameBindings: ['entityTypeClass', 'isClickable:clickable'],\n\n    intl: Ember.inject.service(),\n\n    entity: null,\n    showDepartment: true,\n    showPresence: true,\n    // fallback to `showPresence` when this is undefined\n    subscribeToPresence: undefined,\n\n    showFavorite: true,\n    showActions: true,\n    clickToProfile: true,\n    isSearchResult: false,\n\n    geolocation: Ember.inject.service(),\n    isGeolocationEnabled: Ember.computed.readOnly('geolocation.isEnabled'),\n    actions: {\n        sendToProfile: function () {\n            let person = this.get('entity');\n            this.bubbleAction({\n                action: 'transitionToEntityDetail',\n                actionContext: [person]\n            });\n        }\n    },\n\n    phoneTooltip: Ember.computed(function () {\n        return this.get('intl').lookup('tooltip.contactIcon.phone');\n    }),\n\n    entityTypeClass: Ember.computed('entity.type', function () {\n        if (!this.get('entity.type')) {\n            return 'empty-type';\n        }\n\n        return Ember.String.dasherize(this.get('entity.type'));\n    }),\n\n    entityIsPerson: Ember.computed.equal('entity.type', 'person'),\n\n    entityIsQueue: Ember.computed.equal('entity.type', 'queue'),\n\n    entityIsMe: Ember.computed('entity.id', 'session.person.id', function () {\n        return this.get('entity.id') === this.get('session.person.id');\n    }),\n\n    entityIsGroup: Ember.computed.equal('entity.type', 'group'),\n\n    entityIsContact: Ember.computed.equal('entity.type', 'externalContact'),\n\n    canContactEntity: Ember.computed('entityIsGroup', 'entityIsPerson', 'entityIsContact', function () {\n        return this.get('entityIsPerson') || this.get('entityIsGroup') || this.get('entityIsContact');\n    }),\n\n    isPresenceLabelToggleEnabled: Ember.computed.readOnly('session.features.epcDecompPresenceLabel'),\n    useInitials: Ember.computed.reads('entityIsContact'),\n\n    showOrganization: Ember.computed('entityIsContact', function () {\n        return this.get('entityIsContact') && !!this.get('entity.organization');\n    }),\n\n    entityRoutePath: Ember.computed('entity.type', function () {\n        let type = this.get('entity.type');\n        if (type === 'floor') {\n            type = 'location';\n        }\n\n        return `${type}.detail`;\n    }),\n\n    isClickable: Ember.computed('entity._entity', 'entity.type', function () {\n        const type = this.get('entity.type');\n        if (type === 'floor' || type === 'location' || type === 'externalContact') {\n            return false;\n        }\n        const entity = this.get('entity._entity');\n        return entity !== 'locations' && this.get('clickToProfile');\n    }),\n\n    _subscribePresence: Ember.computed('showPresence', 'subscribeToPresence', function () {\n        const subscribe = this.get('subscribeToPresence');\n        if (subscribe === undefined) {\n            return this.get('showPresence');\n        }\n\n        return subscribe;\n    }),\n    conversationSummary: Ember.computed.readOnly('entity.activities.conversationSummary'),\n    message: Ember.computed.readOnly('conversationSummary.message'),\n    socialExpression: Ember.computed.readOnly('conversationSummary.socialExpression'),\n    totalMessages: Ember.computed(\n        'message.{contactCenter,enterprise}',\n        'message.contactCenter.active',\n        'message.enterprise.active',\n        function () {\n            const contactCenter = this.get('message.contactCenter');\n            const enterprise = this.get('message.enterprise');\n            return activityCounter(contactCenter, enterprise);\n        }\n    ),\n    totalSocialExpression: Ember.computed(\n        'socialExpression.{contactCenter,enterprise}',\n        'socialExpression.contactCenter.active',\n        'socialExpression.enterprise.active',\n        function () {\n            const contactCenter = this.get('socialExpression.contactCenter');\n            const enterprise = this.get('socialExpression.enterprise');\n            return activityCounter(contactCenter, enterprise);\n        }\n    ),\n    click: function (event) {\n        if (!this.get('isClickable')) {\n            return;\n        }\n        const target = Ember.$(event.target);\n        if (target.is('a') || target.is('i') || target.parents().is('.entity-contact')) {\n            // Defer to link-to or primary contact icon action\n            //event.stopPropagation();\n            //event.preventDefault();\n            return;\n        }\n\n        if (this.get('isSearchResult')) {\n            // When this is a search result, only allow the link-to elements for transitioning due to the extra realestate.\n            return false;\n        }\n\n        if (!target.is('a')) {\n            this.send('sendToProfile');\n        }\n    },\n    eLocation: Ember.computed('entity.geolocation.{city,region,country}', function () {\n        if (!this.entity) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.entity, 'geolocation.city'),\n            region: Ember.get(this.entity, 'geolocation.region'),\n            country: Ember.get(this.entity, 'geolocation.country')\n        };\n    }),\n    selfLocation: Ember.computed('session.person.geolocation.{city,region,country}', function () {\n        if (!this.session || !this.session.person) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.session.person, 'geolocation.city'),\n            region: Ember.get(this.session.person, 'geolocation.region'),\n            country: Ember.get(this.session.person, 'geolocation.country')\n        };\n    }),\n    entityLocationData: Ember.computed('eLocation', 'selfLocation', 'isGeolocationEnabled', function () {\n        return {\n            isGeolocationEnabled: this.get('isGeolocationEnabled'),\n            eLocation: this.get('eLocation'),\n            selfLocation: this.get('selfLocation')\n        };\n    }),\n    presenceLabelData: Ember.computed(\n        'entity.{activityPresenceClass,presenceLabel,chatStatus,showConversationSummaryIndicator}',\n        'entity.activityValues.{calls,chats,emails}',\n        function () {\n            if (!this.get('entity')) return;\n\n            return {\n                wrap: false,\n                showStatus: true,\n                showActivity: true,\n                eActivityPresenceClass: Ember.get(this.entity, 'activityPresenceClass'),\n                totalCalls: Ember.get(this.entity, 'activityValues.calls'),\n                totalChats: Ember.get(this.entity, 'activityValues.chats'),\n                totalEmails: Ember.get(this.entity, 'activityValues.emails'),\n                totalMessages: Ember.get(this, 'totalMessages'),\n                totalSocialExpression: Ember.get(this, 'totalSocialExpression'),\n                presenceLabel: Ember.get(this.entity, 'presenceLabel'),\n                eChatStatus: Ember.get(this.entity, 'chatStatus'),\n                isShowingActivitySummary: Ember.get(this.entity, 'showConversationSummaryIndicator')\n            };\n        }\n    )\n});\n","import Ember from 'ember';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport ViewportMixin from '../../../mixins/viewport';\n\nconst { run, Component } = Ember;\n\nexport default Component.extend(ViewportMixin, {\n    classNameBindings: ['enteredViewport:in-viewport:outside-viewport', 'hasRequiredPermission::no-permission'],\n\n    session: Ember.inject.service(),\n    chat: Ember.inject.service(),\n    presenceSubscription: Ember.inject.service(),\n\n    entity: null,\n    showDepartment: true,\n    showPresence: true,\n    showFavorite: true,\n    showActions: true,\n    clickToProfile: true,\n    isSearchResult: false,\n    requiredPermission: null,\n\n    hasRequiredPermission: Ember.computed(\n        'requiredPermission.[]',\n        'entity.extends.authorization.permissions',\n        function () {\n            const requiredPermission = this.get('requiredPermission') || [];\n            const perms = this.get('entity.expands.authorization.permissions') || [];\n            if (requiredPermission.length && perms.length) {\n                const agentHasOnQueue = perms.includes(`routing:agent:onqueue`);\n                const agentHasRequiredPermission = !!requiredPermission.find(permission => {\n                    return perms.includes(permission);\n                });\n                return agentHasRequiredPermission || !agentHasOnQueue;\n            }\n            return true;\n        }\n    ),\n\n    didInsertElement() {\n        this._super(...arguments);\n        if (!isTesting) {\n            run.join(this, this._subscribeToPresence);\n        }\n    },\n\n    didEnterViewport() {\n        run(() => run.once(this, this._subscribeToPresence));\n        this._super(...arguments);\n    },\n\n    didExitViewport() {\n        // A run loop is needed here because the mixin invokes this\n        // function using request animation frame as opposed to Ember\n        // backburner.\n        run(() => run.once(this, this._unsubscribeFromPresence));\n        this._super(...arguments);\n    },\n\n    willDestroyElement() {\n        this._unsubscribeFromPresence();\n        this._super(...arguments);\n    },\n\n    _subscribeToPresence() {\n        if (this.get('entity.type') === 'person' && this.get('entity.jid')) {\n            this.get('presenceSubscription').autoSubscribe([this.get('entity')], this);\n        }\n    },\n\n    _unsubscribeFromPresence() {\n        this.get('presenceSubscription').autoSubscribe(null, this);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"gyhZ7ZGJ\",\"block\":\"{\\\"statements\\\":[[6,[\\\"entity-mini\\\"],null,[[\\\"entity\\\",\\\"showDepartment\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\",\\\"showFavorite\\\",\\\"showActions\\\",\\\"clickToProfile\\\",\\\"isSearchResult\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"showDepartment\\\"]],[28,[\\\"showPresence\\\"]],[28,[\\\"subscribeToPresence\\\"]],[28,[\\\"showFavorite\\\"]],[28,[\\\"showActions\\\"]],[28,[\\\"clickToProfile\\\"]],[28,[\\\"isSearchResult\\\"]]]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"section\\\"]],\\\"actions\\\"],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-contact\\\"],null,[[\\\"contact\\\",\\\"showChat\\\",\\\"showFavorite\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"chat\\\",\\\"enabled\\\"]],[28,[\\\"showFavorite\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"section\\\"]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-mini/default/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['entity-details'],\n\n    // Child of entity-mini display only all attributes are inherited\n    entityIsPerson: false,\n    entityIsContact: false,\n    entityIsMe: false,\n    showDepartment: true,\n    showOrganization: false,\n    showPresence: false,\n    isPresenceLabelToggleEnabled: false,\n    subscribeToPresence: false,\n    canContactEntity: false,\n    useInitials: false,\n    isClickable: false,\n    entity: null,\n    entityLocationData: null,\n    presenceLabelData: null\n});\n","export default Ember.HTMLBars.template({\"id\":\"cu2qwlzH\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[16,\\\"class\\\",[34,[\\\"image \\\",[33,[\\\"if\\\"],[[28,[\\\"entityIsContact\\\"]],\\\"external-contact-image\\\"],null],\\\" \\\",[33,[\\\"unless\\\"],[[28,[\\\"isClickable\\\"]],\\\"not-clickable\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\",\\\"useInitialsPlaceholder\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"showPresence\\\"]],[28,[\\\"_subscribePresence\\\"]],[28,[\\\"useInitials\\\"]]]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"information \\\",[33,[\\\"if\\\"],[[28,[\\\"entityIsMe\\\"]],\\\"is-me\\\"],null],\\\" \\\",[33,[\\\"unless\\\"],[[28,[\\\"showActions\\\"]],\\\"actions-hide\\\"],null]]]],[16,\\\"tabindex\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"isClickable\\\"]],\\\"-1\\\",\\\"0\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[28,[\\\"entity\\\",\\\"name\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[18,\\\"default\\\",[\\\"details\\\"]],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entityIsPerson\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showDepartment\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"department\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"entity\\\",\\\"department\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[28,[\\\"entity\\\",\\\"title\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entityIsContact\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showOrganization\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"organization\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"entity\\\",\\\"organization\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"description\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"entity\\\",\\\"description\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entityIsGroup\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[\\\"group-type \\\",[28,[\\\"entity\\\",\\\"groupType\\\"]]]]],[13],[0,\\\"\\\\n            \\\"],[1,[28,[\\\"entity\\\",\\\"groupType\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"hasGeolocation\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"geolocation-container\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"entity-location\\\"],null,[[\\\"entity\\\",\\\"class\\\"],[[28,[\\\"entity\\\"]],\\\"entity-geolocation\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"entityIsPerson\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"item\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isPresenceLabelToggleEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"presence-label\\\",{\\\"attrs\\\":[[16,\\\"presenceLabelData\\\",[26,[\\\"presenceLabelData\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"presence-label\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-mini/entity-details/template.hbs\"}});","import Ember from 'ember';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\n\nexport default Ember.Component.extend(RelateFeaturesMixin, {\n    classNames: ['external-contact'],\n\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    externalContact: null,\n    showPhones: true,\n    showEmails: false,\n    showAcceptsSMS: true,\n    acdOutboundWhatsApp: true,\n\n    _getEmailTypes: function () {\n        return Object.keys(this.externalContact.toJSON()).filter(modelKey => {\n            return /.*Email$/.test(modelKey);\n        });\n    },\n\n    _getPhoneTypes: function () {\n        return Object.keys(this.externalContact.toJSON()).filter(modelKey => {\n            return this.get('acdOutboundWhatsApp') ? /.*Phone$|whatsAppId/.test(modelKey) : /.*Phone$/.test(modelKey);\n        });\n    },\n\n    dropdownTitle: Ember.computed('phones', function () {\n        return this.get('intl').t('purecloud.acdInteraction.relate.titles.selectPhone');\n    }),\n\n    externalContactHasNoEmailAddresses: Ember.computed.not('externalContact.hasEmailAddresses'),\n\n    phones: Ember.computed(function () {\n        if (!this.get('showPhones')) {\n            return [];\n        }\n        return this._getPhoneTypes().reduce((phones, phoneType) => {\n            if (this.get(`externalContact.${phoneType}.display`)) {\n                const canUseNonE164 = phoneType === 'otherPhone';\n                const phoneTypeTranslated = this.get('intl').t(\n                    `purecloud.acdInteraction.relate.phoneTypes.${phoneType}`\n                );\n                const phoneTypeId = phoneType + '-' + this.get(`externalContact.${phoneType}.e164`); //This needs to be unique for tooltips to work.\n                return phones.concat({\n                    type: phoneTypeTranslated,\n                    phoneTypeId: phoneTypeId.replace(/\\s|\\+|#|\\./g, ''),\n                    number: this.get(`externalContact.${phoneType}.display`),\n                    e164: this.get(`externalContact.${phoneType}.e164`),\n                    acceptsSMS: this.get(`externalContact.${phoneType}.acceptsSMS`),\n                    canUseNonE164\n                });\n            } else if (\n                this.get('acdOutboundWhatsApp') &&\n                this.get(`externalContact.${phoneType}.phoneNumber.display`)\n            ) {\n                const canUseNonE164 = phoneType === 'otherPhone';\n                const typeName = phoneType.replace(/Id/, '').toLowerCase();\n                const phoneTypeTranslated = this.get('intl').t(\n                    `purecloud.acdInteraction.relate.channelTypes.${typeName}`\n                );\n                const phoneTypeId = phoneType + '-' + this.get(`externalContact.${phoneType}.phoneNumber.e164`); //This needs to be unique for tooltips to work.\n                return phones.concat({\n                    type: phoneTypeTranslated,\n                    phoneTypeId: phoneTypeId.replace(/\\s|\\+|#|\\./g, ''),\n                    number: this.get(`externalContact.${phoneType}.phoneNumber.display`),\n                    e164: this.get(`externalContact.${phoneType}.phoneNumber.e164`),\n                    acceptsSMS: this.get(`externalContact.${phoneType}.phoneNumber.acceptsSMS`),\n                    canUseNonE164\n                });\n            }\n            return phones;\n        }, []);\n    }),\n\n    externalContactHasNoPhoneNumbers: Ember.computed.empty('phones'),\n\n    emails: Ember.computed(function () {\n        if (!this.get('showEmails')) {\n            return [];\n        }\n        return this._getEmailTypes().reduce((email, emailType) => {\n            if (this.get(`externalContact.${emailType}`)) {\n                return email.concat({\n                    type: this.get('intl').t(`purecloud.acdInteraction.relate.emailTypes.${emailType}`),\n                    address: this.get(`externalContact.${emailType}`)\n                });\n            }\n            return email;\n        }, []);\n    }),\n\n    hasMultipleEmails: Ember.computed.gt('emails.length', 1),\n\n    hasMultiplePhoneRecords: Ember.computed.gt('phones.length', 1),\n\n    actions: {\n        selectEntityWithEmail(email, emailType, event) {\n            this.set('externalContact.email', email);\n            this.set('externalContact.emailType', emailType);\n            if (typeof this.get('onSelectEmail') === 'function') {\n                this.get('onSelectEmail')(email, emailType, event);\n            }\n        },\n\n        selectEntityWithPhone(phoneNumber, phoneType, event) {\n            this.set('externalContact.phoneNumber', phoneNumber);\n            this.set('externalContact.phoneType', phoneType);\n            if (typeof this.get('onSelectPhone') === 'function') {\n                this.get('onSelectPhone')(phoneNumber, phoneType, event);\n            }\n        },\n\n        onPreventClick(event) {\n            event.stopPropagation();\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"Ao/YabLy\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-mini external-contact\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"profileImage\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"defaultWrapper\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"initials\\\"],[13],[1,[28,[\\\"externalContact\\\",\\\"initials\\\"]],false],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"right row\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information contactWrapper\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"onPreventClick\\\"],null],null],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"external-contact-name-container\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[15,\\\"type\\\",\\\"button\\\"],[13],[1,[33,[\\\"full-name\\\"],[[28,[\\\"externalContact\\\"]]],null],false],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"external-contact-name\\\"],[13],[1,[33,[\\\"full-name\\\"],[[28,[\\\"externalContact\\\"]]],null],false],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"viewDetails\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[[28,[\\\"contactRoute\\\"]],[28,[\\\"externalContact\\\"]]],[[\\\"bubbles\\\"],[[28,[\\\"preventExternalContactDefault\\\"]]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"purecloud.viewExternalContactDetails\\\"],null],null],[15,\\\"class\\\",\\\"fa fa-arrow-up\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"canShowCustomFields\\\"]],[28,[\\\"externalContact\\\",\\\"schemaTitle\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"schema-title\\\"],[13],[1,[33,[\\\"await\\\"],[[28,[\\\"externalContact\\\",\\\"schemaTitle\\\"]]],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"organization\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"externalContact\\\",\\\"externalOrganization\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.entity.relateExternalContactDetails.atOrg\\\"],null],false],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"externalContact\\\",\\\"externalOrganization\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information phones phonesWrapper\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"phones\\\"]],[28,[\\\"showPhones\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"externalContactHasNoPhoneNumbers\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"noPhones\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.acdInteraction.relate.search.phoneNotProvided\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"phonesExpanded\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"phones\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"phone\\\",\\\"e164\\\"]],[28,[\\\"phone\\\",\\\"canUseNonE164\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"selectable\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectEntityWithPhone\\\",[33,[\\\"or\\\"],[[28,[\\\"phone\\\",\\\"e164\\\"]],[28,[\\\"phone\\\",\\\"number\\\"]]],null],[28,[\\\"phone\\\",\\\"type\\\"]]],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[13],[0,\\\"\\\\n                                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"phoneType\\\"],[13],[1,[28,[\\\"phone\\\",\\\"type\\\"]],false],[14],[0,\\\"\\\\n                                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"phone\\\"],[13],[0,\\\"\\\\n                                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"number-container\\\"],[13],[0,\\\"\\\\n                                                \\\"],[1,[28,[\\\"phone\\\",\\\"number\\\"]],false],[0,\\\"\\\\n                                            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"phone\\\",\\\"acceptsSMS\\\"]],[28,[\\\"showAcceptsSMS\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"tooltip-on-element\\\"],null,[[\\\"keepInWindow\\\",\\\"setPin\\\",\\\"side\\\",\\\"target\\\"],[true,true,\\\"top\\\",[33,[\\\"concat\\\"],[\\\"#list-phone-sms-\\\",[28,[\\\"phone\\\",\\\"phoneTypeId\\\"]]],null]]],{\\\"statements\\\":[[0,\\\"                                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.acdInteraction.relate.acceptsSMS\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"icon-container\\\"],[13],[0,\\\"\\\\n                                                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[\\\"list-phone-sms-\\\",[28,[\\\"phone\\\",\\\"phoneTypeId\\\"]]],null]]]],[15,\\\"class\\\",\\\"svg-icon accept-sms\\\"],[15,\\\"icon-name\\\",\\\"device-cellphone\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                        \\\"],[14],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"phoneType\\\"],[13],[1,[28,[\\\"phone\\\",\\\"type\\\"]],false],[14],[0,\\\"\\\\n                                    \\\"],[11,\\\"div\\\",[]],[13],[1,[28,[\\\"phone\\\",\\\"number\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"phone\\\"]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showPhones\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"noPhones\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.acdInteraction.relate.search.phoneNotProvided\\\"],null],false],[14],[0,\\\"\\\\n                \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information emails emailsWrapper\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emails\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showEmails\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"emailsExpanded\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"emails\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"selectable\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectEntityWithEmail\\\",[28,[\\\"email\\\",\\\"address\\\"]],[28,[\\\"email\\\",\\\"type\\\"]]],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"emailType\\\"],[13],[0,\\\"\\\\n                                        \\\"],[1,[28,[\\\"email\\\",\\\"type\\\"]],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"email ellipsis\\\"],[16,\\\"tooltip\\\",[34,[[28,[\\\"email\\\",\\\"address\\\"]]]]],[15,\\\"tooltip-popup-delay\\\",\\\"500\\\"],[15,\\\"tooltip-placement\\\",\\\"bottom\\\"],[13],[0,\\\"\\\\n                                        \\\"],[1,[28,[\\\"email\\\",\\\"address\\\"]],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"email\\\"]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showEmails\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"noEmails\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.acdInteraction.relate.search.emailNotProvided\\\"],null],false],[14],[0,\\\"\\\\n                \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-mini/external-contact/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from '../../../utils/dates';\n\nexport default Ember.Component.extend({\n    classNames: ['entity-mini-queue'],\n    session: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    queueService: Ember.inject.service('queue'),\n    permissions: Ember.inject.service(),\n\n    makingCall: false,\n    isDetailsLoaded: false,\n    isDetailsLoading: false,\n\n    queue: null,\n    clickToProfile: false,\n    showActions: false,\n\n    canViewQueueDetails: Ember.computed.bool('permissions.canViewQueueObservations'),\n\n    actions: {\n        getQueueData: function () {\n            const id = this.get('queue.id');\n\n            // Ultimately, UX wants to show the following:\n            //   - Active agents\n            //   - Waiting customers by media type\n            //   - Longest wait time (AR-1102)\n            //   - Queue description  (CW-724 is the closest JIRA that mentions this, https://projects.invisionapp.com/share/545F0JYVS#/screens/124326256)\n\n            if (id) {\n                this.set('isDetailsLoading', true);\n                let promises = {\n                    waitTimePromise: this.get('queueService').getQueueEstimatedWaitTime(id, this.get('interactionType'))\n                };\n\n                Ember.RSVP.hash(promises)\n                    .then(hash => {\n                        const joinedData = hash.joinedPromise;\n                        const waitTimeResults = hash.waitTimePromise.results;\n                        const getMetricCount = function (array, metricName) {\n                            const metricData = _.find(array, { metric: metricName });\n                            return metricData.stats.count;\n                        };\n\n                        const getOnQueueCounts = function (array, routingStatus) {\n                            const getRoutingStatusCount = function (datum, routingStatus) {\n                                if (routingStatus) {\n                                    return datum.metric === 'oOnQueueUsers' && datum.qualifier === routingStatus;\n                                }\n                                return datum.metric === 'oOnQueueUsers';\n                            };\n                            return _.chain(array)\n                                .filter(_.partial(getRoutingStatusCount, _, routingStatus))\n                                .map(_.property('stats.count'))\n                                .filter(value => typeof value === 'number')\n                                .sum()\n                                .value();\n                        };\n\n                        const getWaitTime = function (array) {\n                            const bestTime = _.find(array, { formula: 'BEST' });\n                            if (bestTime) {\n                                return bestTime.estimatedWaitTimeSeconds;\n                            }\n                        };\n\n                        const joined = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === undefined;\n                        });\n                        const callData = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === 'voice';\n                        });\n\n                        const callbackData = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === 'callback';\n                        });\n\n                        const chatData = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === 'chat';\n                        });\n\n                        const emailData = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === 'email';\n                        });\n\n                        const messageData = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === 'message';\n                        });\n\n                        let onQueueCount = 0;\n                        let idleCount = 0;\n                        if (joined) {\n                            onQueueCount = getOnQueueCounts(joined.data);\n                            idleCount = getOnQueueCounts(joined.data, 'IDLE');\n                        }\n\n                        let callWaiting;\n                        if (callData) {\n                            callWaiting = getMetricCount(callData.data, 'oWaiting');\n                        }\n\n                        let callbackWaiting;\n                        if (callbackData) {\n                            callbackWaiting = getMetricCount(callbackData.data, 'oWaiting');\n                        }\n\n                        let chatWaiting;\n                        if (chatData) {\n                            chatWaiting = getMetricCount(chatData.data, 'oWaiting');\n                        }\n\n                        let emailWaiting;\n                        if (emailData) {\n                            emailWaiting = getMetricCount(emailData.data, 'oWaiting');\n                        }\n\n                        let messageWaiting;\n                        if (messageData) {\n                            messageWaiting = getMetricCount(messageData.data, 'oWaiting');\n                        }\n\n                        let queueData = {\n                            agentData: `${idleCount}/${onQueueCount}`,\n                            callCount: callWaiting,\n                            callbackCount: callbackWaiting,\n                            chatCount: chatWaiting,\n                            emailCount: emailWaiting,\n                            messageCount: messageWaiting\n                        };\n\n                        let waitStr;\n                        const bestWaitTime = getWaitTime(waitTimeResults);\n                        if (bestWaitTime !== undefined) {\n                            // show estimated wait time\n                            const wait = moment.duration(bestWaitTime * 1000); // convert from sec to ms\n\n                            const intl = this.get('intl');\n                            let hr = wait.hours(),\n                                min = wait.minutes(),\n                                sec = wait.seconds();\n                            if (hr) {\n                                // use hours, minutes, & seconds\n                                waitStr = intl.t('purecloud.analytics.statValue.hoursMinutesSeconds', {\n                                    seconds: sec.toString(),\n                                    minutes: min.toString(),\n                                    hours: hr.toString()\n                                });\n                            } else if (min) {\n                                // use minutes & seconds\n                                waitStr = intl.t('purecloud.analytics.statValue.minutesSeconds', {\n                                    seconds: sec.toString(),\n                                    minutes: min.toString()\n                                });\n                            } else {\n                                // use seconds\n                                waitStr = intl.t('purecloud.analytics.statValue.seconds', { seconds: sec.toString() });\n                            }\n                            queueData.waitTime = waitStr;\n                        }\n\n                        this.set('queue.queueDetails', queueData);\n                        this.set('isDetailsLoaded', true);\n                    })\n                    .finally(() => this.set('isDetailsLoading', false));\n            }\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"9e9+NV5j\",\"block\":\"{\\\"statements\\\":[[6,[\\\"entity-mini\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\",\\\"showDepartment\\\",\\\"showPresence\\\",\\\"showFavorite\\\",\\\"isSearchResult\\\"],[[28,[\\\"queue\\\"]],[28,[\\\"showActions\\\"]],[28,[\\\"clickToProfile\\\"]],false,false,false,false]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"section\\\"]],\\\"details\\\"],null],[28,[\\\"canViewQueueDetails\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isDetailsLoading\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin loading-icon\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isDetailsLoaded\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-analytics\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.entity.queueDetails.agents\\\"],[[\\\"ratio\\\"],[[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"agentData\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"queue-analytics\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.entity.queueDetails.waitingCount\\\"],null],false],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-metric\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"callCount\\\"]],false],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"phone\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-metric\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"callbackCount\\\"]],false],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"phone-outbound\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-metric\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"chatCount\\\"]],false],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"roster-chat\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-metric\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"emailCount\\\"]],false],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"message-email\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-metric\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"messageCount\\\"]],false],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"sms-message-icon\\\"],null,[[\\\"subMessageType\\\"],[\\\"sms\\\"]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"waitTime\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"queue-analytics\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.entity.queueDetails.estimatedWait\\\"],[[\\\"wait\\\"],[[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"waitTime\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"get-queue-data\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"getQueueData\\\",[28,[\\\"entity\\\"]]],[[\\\"bubbles\\\"],[false]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.entity.queueDetails.view\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"section\\\"]],\\\"actions\\\"],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-contact-queue\\\"],null,[[\\\"queue\\\"],[[28,[\\\"queue\\\"]]]]],false],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"section\\\"]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-mini/queue/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"s3GYSE14\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isClickable\\\"]]],null,{\\\"statements\\\":[[6,[\\\"link-to\\\"],[[28,[\\\"entityRoutePath\\\"]],[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-mini/entity-details\\\"],null,[[\\\"entityIsPerson\\\",\\\"entityIsContact\\\",\\\"entityIsMe\\\",\\\"showDepartment\\\",\\\"showOrganization\\\",\\\"showPresence\\\",\\\"isPresenceLabelToggleEnabled\\\",\\\"subscribeToPresence\\\",\\\"canContactEntity\\\",\\\"useInitials\\\",\\\"isClickable\\\",\\\"entity\\\",\\\"entityLocationData\\\",\\\"presenceLabelData\\\"],[[28,[\\\"entityIsPerson\\\"]],[28,[\\\"entityIsContact\\\"]],[28,[\\\"entityIsMe\\\"]],[28,[\\\"showDepartment\\\"]],[28,[\\\"showOrganization\\\"]],[28,[\\\"showPresence\\\"]],[28,[\\\"isPresenceLabelToggleEnabled\\\"]],[28,[\\\"subscribeToPresence\\\"]],[28,[\\\"canContactEntity\\\"]],[28,[\\\"useInitials\\\"]],[28,[\\\"isClickable\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"entityLocationData\\\"]],[28,[\\\"presenceLabelData\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"entity-mini/entity-details\\\"],null,[[\\\"entityIsPerson\\\",\\\"entityIsContact\\\",\\\"entityIsMe\\\",\\\"showDepartment\\\",\\\"showOrganization\\\",\\\"showPresence\\\",\\\"isPresenceLabelToggleEnabled\\\",\\\"subscribeToPresence\\\",\\\"canContactEntity\\\",\\\"useInitials\\\",\\\"isClickable\\\",\\\"entity\\\",\\\"entityLocationData\\\",\\\"presenceLabelData\\\"],[[28,[\\\"entityIsPerson\\\"]],[28,[\\\"entityIsContact\\\"]],[28,[\\\"entityIsMe\\\"]],[28,[\\\"showDepartment\\\"]],[28,[\\\"showOrganization\\\"]],[28,[\\\"showPresence\\\"]],[28,[\\\"isPresenceLabelToggleEnabled\\\"]],[28,[\\\"subscribeToPresence\\\"]],[28,[\\\"canContactEntity\\\"]],[28,[\\\"useInitials\\\"]],[28,[\\\"isClickable\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"entityLocationData\\\"]],[28,[\\\"presenceLabelData\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showActions\\\"]],[28,[\\\"canContactEntity\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"actions \\\",[33,[\\\"if\\\"],[[28,[\\\"entityIsMe\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[18,\\\"default\\\",[\\\"actions\\\"]],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-mini/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed } = Ember;\n\nexport const imageMappings = {\n    person: {\n        profile: 'uploads.images',\n        profileInstructionText: 'images.profile',\n        informal: 'images.informal',\n        activeProfilePictureSection: 'images'\n    },\n\n    group: {\n        profile: 'images.profilePictures',\n        profileInstructionText: 'images.activeProfilePicture',\n        informal: 'images.gallery',\n        activeProfilePictureSection: 'images'\n    }\n};\n\nexport default Ember.Component.extend({\n    classNames: ['entity-picture-content'],\n\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    embedded: Ember.inject.service(),\n\n    attrs: {\n        open() {},\n        close() {},\n\n        entity: null,\n        askToDelete: false\n    },\n\n    type: 'profile', // or 'informal'\n\n    askToDelete: false,\n    showUploadModal: false,\n\n    actions: {\n        cancel() {\n            this.attrs.close();\n        },\n\n        uploadPicture() {\n            this.attrs.close();\n\n            this.set('showUploadModal', true);\n        },\n\n        confirmUpload() {\n            let type = this.get('type');\n            let entity = this.get('entity');\n\n            entity.notifyPropertyChange('uploadedProfilePictures');\n            entity.notifyPropertyChange('uploadedInformalPhotos');\n\n            const pictures = entity.get('uploadedProfilePictures');\n            const picture = pictures[pictures.length - 1];\n            if (!picture) {\n                return;\n            }\n\n            if (type === 'profile') {\n                this.send('selectUploadedImage', type, picture, false);\n            }\n\n            this.send('cancelUploadModal');\n        },\n\n        selectUploadedImage(type, image, active) {\n            const entity = this.get('entity');\n            const entityJid = entity.get('jid');\n            const tag = 'profile-success';\n            const edit = this.get('canEditProfilePicture');\n            let section = entity.get('fieldConfig.images');\n\n            if (!edit || active) {\n                return;\n            }\n\n            type = type || this.get('type');\n\n            if (entity.type === 'person') {\n                // When adding and remove images using the public API it updates the group.\n                // Each time it updates the group its version number increases, we go out and get the group\n                // to make sure we have the latest version.  Once venue is release we will not\n                // need to do this since it doesn't require a version like directory did.\n                entity\n                    .reload()\n                    .then(user => {\n                        section['version'] = user.version;\n                        if (type === 'profile') {\n                            entity.setProfilePicture(image);\n                            section = entity.get('fieldConfig.images');\n                        }\n                        return section;\n                    })\n                    .then(updatedSection => {\n                        entity.saveSection(updatedSection);\n                    })\n                    .then(() => {\n                        this.get('embedded').notifyUpdateProfileImage(image, entityJid);\n\n                        this.get('notification').info(\n                            this.get('intl').lookup('notification.titles.profileSave'),\n                            this.get('intl').lookup('notification.fieldSection.saved'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5,\n                                tag: tag\n                            }\n                        );\n                    })\n                    .catch(err => {\n                        if (err && (err.errors || err.payload)) {\n                            const errors = err.errors || err.payload;\n                            let error = _.head(errors);\n                            if (error && error.payload && error.payload.code === 'VERSION_MISMATCH') {\n                                return;\n                            }\n                        }\n\n                        this.get('notification').error(\n                            this.get('intl').lookup('notification.titles.profileSaveError'),\n                            this.get('intl').lookup('notification.fieldSection.error'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5\n                            }\n                        );\n                        entity.reload();\n                    })\n                    .finally(() => {\n                        this.get('notification').info(\n                            this.get('intl').lookup('notification.titles.profileSave'),\n                            this.get('intl').lookup('notification.fieldSection.saved'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5,\n                                tag: tag\n                            }\n                        );\n                    });\n            } else {\n                if (type === 'profile') {\n                    entity.setProfilePicture(image);\n                }\n                return entity\n                    .saveSection(section)\n                    .then(() => {\n                        this.get('embedded').notifyUpdateProfileImage(image, entityJid);\n                        this.get('notification').info(\n                            this.get('intl').lookup('notification.titles.profileSave'),\n                            this.get('intl').lookup('notification.fieldSection.saved'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5,\n                                tag: tag\n                            }\n                        );\n                    })\n                    .catch(err => {\n                        if (err && (err.errors || err.payload)) {\n                            const errors = err.errors || err.payload;\n                            let error = errors.firstObject;\n                            if (error && error.payload && error.payload.code === 'VERSION_MISMATCH') {\n                                return;\n                            }\n                        }\n\n                        this.get('notification').error(\n                            this.get('intl').lookup('notification.titles.profileSaveError'),\n                            this.get('intl').lookup('notification.fieldSection.error'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5\n                            }\n                        );\n                        entity.reload();\n                    })\n                    .finally(() => {\n                        this.get('notification').info(\n                            this.get('intl').lookup('notification.titles.profileSave'),\n                            this.get('intl').lookup('notification.fieldSection.saved'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5,\n                                tag: tag\n                            }\n                        );\n                    });\n            }\n        },\n\n        deleteUploadedImage(type, image, active) {\n            const entity = this.get('entity');\n            const entityType = entity.get('type');\n\n            let promise = Ember.RSVP.resolve();\n\n            if (active) {\n                const images = entity.get('uploadedImages');\n\n                if (!_.isEmpty(images)) {\n                    const newImage = images[0];\n\n                    if (newImage) {\n                        const profilePictureSection = entity.get(\n                            `fieldConfig.${imageMappings[entityType].activeProfilePictureSection}`\n                        );\n                        entity.setProfilePicture(newImage);\n                        promise = entity.saveSection(profilePictureSection);\n                    }\n                }\n            }\n\n            const fieldPath = imageMappings[entityType][type];\n            const path = `entity.${fieldPath}`;\n\n            this.get(path).removeObject(image);\n            if (entityType === 'person') {\n                return this.entity.reload();\n            }\n\n            promise\n                .then(() => {\n                    const sectionKey = fieldPath.split('.')[0];\n                    const section = entity.get(`fieldConfig.${sectionKey}`);\n                    return entity.saveSection(section);\n                })\n                .catch(() => this.get(path).addObject(image));\n        },\n\n        cancelUploadModal() {\n            this.set('showUploadModal', false);\n            this.attrs.open();\n        },\n\n        cancelDeleteModal() {\n            this.set('askToDelete', false);\n            this.set('showing', false);\n        },\n\n        changeType(type) {\n            this.set('type', type);\n        },\n\n        doneDeleting() {\n            this.set('askToDelete', false);\n            this.set('showing', true);\n        }\n    },\n\n    _showing: false,\n    showing: computed('canEditProfilePicture', {\n        get() {\n            return this._showing;\n        },\n\n        set(key, value) {\n            this._showing = value;\n            return value;\n        }\n    }),\n\n    canUploadPicture: Ember.computed(\n        'session.user.isAdmin',\n        'entity.{readWritePermissions,type}',\n        'entity.uploadedImages.[]',\n        'entity.fieldConfig.uploads.images.maxRepeat',\n        'type',\n        function () {\n            if (this.get('session.user.isAdmin')) {\n                return true;\n            }\n\n            if (this.get('entity.type') === 'group' && this.get('entity').isPersonOwner) {\n                return this.get('entity').isPersonOwner(this.get('session.person'));\n            }\n\n            return this.hasAccessToPicture('uploads.images');\n        }\n    ),\n\n    canEditProfilePicture: Ember.computed(\n        'session.{user.isAdmin,features,person}',\n        'entity.{readWritePermissions,id}',\n        'profile.canEditProfilePictures',\n        function () {\n            if (this.get('session.user.isAdmin')) {\n                return true;\n            }\n\n            if (this.get('entity.type') === 'group' && this.get('entity').isPersonOwner) {\n                return this.get('entity').isPersonOwner(this.get('session.person'));\n            }\n\n            // Profile can be null, but if its set and this call is true, then lets return true\n            if (this.get('profile.canEditProfilePictures')) {\n                return true;\n            }\n\n            return this.get('session.person.id') === this.get('entity.id');\n        }\n    ),\n\n    canEditInformalPicture: Ember.computed(\n        'session.{user.isAdmin,features}',\n        'entity.{readWritePermissions,id}',\n        'profile.canEditProfilePictures',\n        function () {\n            if (this.get('session.user.isAdmin')) {\n                return true;\n            }\n\n            if (this.get('entity.type') === 'group' && this.get('entity').isPersonOwner) {\n                return this.get('entity').isPersonOwner(this.get('session.person'));\n            }\n\n            // Profile can be null, but if its set and this call is true, then lets return true\n            if (this.get('profile.canEditProfilePictures')) {\n                return true;\n            }\n\n            return this.get('session.person.id') === this.get('entity.id');\n        }\n    ),\n\n    canEditAgentImage: Ember.computed(\n        'entity.{readWritePermissions,id}',\n        'entity.fieldConfig.agent.profileImage',\n        'permissions.hasEngageAccess',\n        function () {\n            let field = this.get('entity.fieldConfig.agent.profileImage');\n            if (_.isEmpty(field)) {\n                return false;\n            }\n\n            return this.hasAccessToPicture('agent.profileImage') && this.get('permissions.hasEngageAccess');\n        }\n    ),\n\n    hasAccessToPicture(path) {\n        let isSelf = this.get('session.person.id') === this.get('entity.id');\n        let canEditProfiles = this.get('permissions.canEditProfiles');\n        if (path === 'agent.profileImage') {\n            return canEditProfiles;\n        }\n        if (path === 'uploads.images') {\n            return isSelf || canEditProfiles;\n        }\n        return isSelf;\n    }\n});\n","import Ember from 'ember';\n\nimport { imageMappings } from '../component';\n\nconst { set, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['delete-pictures'],\n\n    type: null,\n    entity: null,\n\n    confirm: () => {},\n    disable: () => {},\n    done: () => {},\n\n    actions: {\n        selectImage(upload) {\n            const current = upload.selected;\n            set(upload, 'selected', !current);\n\n            const limit = this.get('number');\n            const total = this.get('uploads.length');\n            const currentSelection = this.get('currentSelected.length');\n\n            this.attrs.disable(currentSelection < total - limit);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.disable(true);\n        this.set('confirm', this.deleteImages.bind(this));\n    },\n\n    number: computed(function () {\n        const entity = this.get('entity');\n        const entityType = entity.get('type');\n        const imageType = this.get('type');\n        const field = entity.get(`fieldConfig.${imageMappings[entityType][imageType]}`);\n        return field.get('maxRepeat');\n    }),\n\n    uploads: computed('entity.uploadedImages.[]', function () {\n        const images = this.get('entity.uploadedImages') || [];\n        return images.map(image => {\n            return {\n                image,\n                selected: false\n            };\n        });\n    }),\n\n    currentSelected: computed('uploads.@each.selected', function () {\n        return this.get('uploads').filterBy('selected');\n    }),\n\n    imagesToSave: computed('uploads.@each.selected', function () {\n        return this.get('uploads').rejectBy('selected');\n    }),\n\n    deleteImages() {\n        const entity = this.get('entity');\n        const entityType = entity.get('type');\n        const type = this.get('type');\n        const fieldPath = imageMappings[entityType][type];\n        const images = this.get('imagesToSave').mapBy('image');\n        entity.set(fieldPath, images, { overwrite: true });\n        return entity.save().then(() => {\n            this.attrs.done();\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"Nb8kFlFf\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"explain\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[\\\"images.delete.explanation\\\"],[[\\\"number\\\"],[[28,[\\\"number\\\"]]]]],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"images\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"uploads\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"image \\\",[33,[\\\"if\\\"],[[28,[\\\"upload\\\",\\\"selected\\\"]],\\\"selected\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"uploaded-image\\\"],null,[[\\\"entity\\\",\\\"image\\\",\\\"isActive\\\",\\\"type\\\",\\\"canEdit\\\",\\\"editing\\\",\\\"size\\\",\\\"select\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"upload\\\",\\\"image\\\"]],[28,[\\\"upload\\\",\\\"selected\\\"]],[28,[\\\"type\\\"]],true,true,96,[33,[\\\"action\\\"],[[28,[null]],\\\"selectImage\\\",[28,[\\\"upload\\\"]]],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"upload\\\"]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-picture-content/delete-pictures/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"1F/33ouu\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showing\\\"]],[33,[\\\"not\\\"],[[28,[\\\"askToDelete\\\"]]],null]],null]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"cancel\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"targetAttachment\\\"],[\\\"cancel\\\",[33,[\\\"t\\\"],[\\\"person.modals.uploadPicture\\\"],null],null,[33,[\\\"t\\\"],[\\\"common.done\\\"],null],[28,[\\\"targetAttachment\\\"]]]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"edit-profile-picture\\\"],null,[[\\\"entity\\\",\\\"editing\\\",\\\"canUploadPicture\\\",\\\"canEditProfilePicture\\\",\\\"canEditInformalPicture\\\",\\\"canEditAgentImage\\\",\\\"changeType\\\",\\\"upload\\\",\\\"select\\\",\\\"delete\\\"],[[28,[\\\"entity\\\"]],true,[28,[\\\"canUploadPicture\\\"]],[28,[\\\"canEditProfilePicture\\\"]],[28,[\\\"canEditInformalPicture\\\"]],[28,[\\\"canEditAgentImage\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"changeType\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"uploadPicture\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"selectUploadedImage\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"deleteUploadedImage\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"askToDelete\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"cancel\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"enforceModality\\\"],[\\\"cancelDeleteModal\\\",[33,[\\\"t\\\"],[\\\"images.delete.title\\\"],null],[33,[\\\"t\\\"],[\\\"common.delete\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-picture-content/delete-pictures\\\"],null,[[\\\"entity\\\",\\\"type\\\",\\\"confirm\\\",\\\"disable\\\",\\\"done\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"type\\\"]],[28,[\\\"confirmAction\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"disableAction\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],\\\"doneDeleting\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"confirmAction\\\",\\\"_\\\",\\\"disableAction\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showUploadModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"confirm\\\",\\\"cancel\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"enforceModality\\\"],[[33,[\\\"action\\\"],[[28,[null]],\\\"confirmUpload\\\"],null],\\\"cancelUploadModal\\\",[33,[\\\"t\\\"],[\\\"person.modals.uploadPicture\\\"],null],null,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"upload-picture\\\"],null,[[\\\"entity\\\",\\\"uploadType\\\",\\\"confirm\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"type\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"confirmUpload\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-picture-content/template.hbs\"}});","import Ember from 'ember';\nimport { doFocus } from 'connections-ui/utils/focus-management';\n\nconst { run, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['add-section'],\n\n    addingSection: false,\n\n    attrs: {\n        sections: null,\n        emptySections: null,\n\n        addSection() {}\n    },\n\n    actions: {\n        toggleAddingSection() {\n            this.toggleProperty('addingSection');\n            if (this.get('addingSection')) {\n                const focusTarget = '.add-section .name a:first';\n                Ember.run.later(\n                    this,\n                    function () {\n                        doFocus(Ember, focusTarget);\n                    },\n                    250\n                );\n            }\n        },\n\n        addSection() {\n            this.attrs.addSection(...arguments);\n\n            this.set('addingSection', false);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        run.scheduleOnce('afterRender', this, this.attachHandler);\n    },\n\n    willDestroyElement() {\n        Ember.$(window).off(`.${this.elementId}`);\n\n        this._super(...arguments);\n    },\n\n    attachHandler() {\n        Ember.$(window).on(`click.${this.elementId}`, event => {\n            Ember.run(() => {\n                let target = Ember.$(event.target);\n                if (!target.parents('.add-section').length) {\n                    this.set('addingSection', false);\n                }\n            });\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"XG0aXktB\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[\\\"add-new-section \\\",[33,[\\\"if\\\"],[[28,[\\\"addingSection\\\"]],\\\"adding-section\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"toggleAddingSection\\\"],null],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"ic-add-bold\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.addNewSection\\\"],null],false],[0,\\\"\\\\n    \\\"]]}],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"new-sections \\\",[33,[\\\"if\\\"],[[28,[\\\"addingSection\\\"]],\\\"adding-section\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"emptySections\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"entity-profile/section-icon\\\"],null,[[\\\"sectionInfo\\\",\\\"addSection\\\"],[[28,[\\\"sectionInfo\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"addSection\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"sectionInfo\\\"]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.addNewSectionEmpty\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-profile/add-section/template.hbs\"}});","import Ember from 'ember';\nimport isEmpty from 'lodash/isEmpty';\n\nimport EntityControllerMixin from '../../mixins/entity-controller';\nimport Profile from './profiles/profile';\n\nimport { doFocus } from 'connections-ui/utils/focus-management';\nimport { deregisterLayout, registerLayout } from '../../utils/masonry';\nimport { isPurecloudSource } from '../../utils/presence-utils';\nimport ProfilePermissionsMixin from './permissions';\nimport { hasSupplementalVideoProvider } from 'connections-ui/services/media-providers';\nimport { activityCounter } from 'connections-ui/utils/presence-label-util';\n\nconst { run, inject, getOwner, computed, observer, Component } = Ember;\n\nexport default Component.extend(EntityControllerMixin, ProfilePermissionsMixin, {\n    classNames: ['entity-profile', 'person-detail', 'profile', 'entity'],\n    classNameBindings: ['isEditingSection:editing-section', 'onOwnProfile:own-profile', 'compactLayout:compact-layout'],\n\n    intl: inject.service(),\n    session: inject.service(),\n    permissions: inject.service(),\n    mediaProviders: inject.service(),\n    favorites: Ember.inject.service(),\n\n    resizeDetector: inject.service(),\n    application: inject.service(),\n    emergencyLocation: Ember.inject.service('emergency-location'),\n    emergencyLocationOn: Ember.computed.reads('session.features.emergencyLocation'),\n    editEmergencyLocation: false,\n    isPresenceLabelToggleEnabled: Ember.computed.readOnly('session.features.epcDecompPresenceLabel'),\n    eLocation: Ember.computed.reads('emergencyLocation.eLocation'),\n    geolocation: Ember.inject.service(),\n    isGeolocationEnabled: Ember.computed.readOnly('geolocation.isEnabled'),\n\n    canViewChat: computed.bool('permissions.canViewBusinessChat'),\n    canViewVideo: computed.bool('permissions.canViewCollaborateVideo'),\n    attrs: {\n        entity: null,\n\n        setEditingSection() {}\n    },\n\n    entity: null,\n    lastEntity: null,\n\n    editing: false,\n    showCardView: false,\n\n    compactLayout: false,\n\n    excludedContactFields: ['chat'],\n\n    excludedEditingFields: ['chat'],\n    conversationSummary: Ember.computed.readOnly('entity.activities.conversationSummary'),\n    message: Ember.computed.readOnly('conversationSummary.message'),\n    socialExpression: Ember.computed.readOnly('conversationSummary.socialExpression'),\n    totalMessages: Ember.computed(\n        'message.{contactCenter,enterprise}',\n        'message.contactCenter.active',\n        'message.enterprise.active',\n        function () {\n            const contactCenter = this.get('message.contactCenter');\n            const enterprise = this.get('message.enterprise');\n            return activityCounter(contactCenter, enterprise);\n        }\n    ),\n    totalSocialExpression: Ember.computed(\n        'socialExpression.{contactCenter,enterprise}',\n        'socialExpression.contactCenter.active',\n        'socialExpression.enterprise.active',\n        function () {\n            const contactCenter = this.get('socialExpression.contactCenter');\n            const enterprise = this.get('socialExpression.enterprise');\n            return activityCounter(contactCenter, enterprise);\n        }\n    ),\n    presenceLabelData: Ember.computed(\n        'entity.{activityPresenceClass,presenceLabel,chatStatus,showConversationSummaryIndicator}',\n        'entity.activityValues.{calls,chats,emails}',\n        function () {\n            return {\n                wrap: true,\n                showStatus: false,\n                showActivity: true,\n                eActivityPresenceClass: this.entity.get('activityPresenceClass'),\n                totalCalls: this.entity.get('activityValues.calls'),\n                totalChats: this.entity.get('activityValues.chats'),\n                totalEmails: this.entity.get('activityValues.emails'),\n                totalMessages: this.get('totalMessages'),\n                totalSocialExpression: this.get('totalSocialExpression'),\n                presenceLabel: this.entity.get('presenceLabel'),\n                eChatStatus: this.entity.get('chatStatus'),\n                isShowingActivitySummary: this.entity.get('showConversationSummaryIndicator')\n            };\n        }\n    ),\n    location: Ember.computed('entity.geolocation.{city,region,country}', function () {\n        if (!this.entity) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.entity, 'geolocation.city'),\n            region: Ember.get(this.entity, 'geolocation.region'),\n            country: Ember.get(this.entity, 'geolocation.country')\n        };\n    }),\n    selfLocation: Ember.computed('session.person.geolocation.{city,region,country}', function () {\n        if (!this.session || !this.session.person) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.session.person, 'geolocation.city'),\n            region: Ember.get(this.session.person, 'geolocation.region'),\n            country: Ember.get(this.session.person, 'geolocation.country')\n        };\n    }),\n    entityLocationData: Ember.computed('location', 'selfLocation', 'isGeolocationEnabled', function () {\n        return {\n            isGeolocationEnabled: this.get('isGeolocationEnabled'),\n            eLocation: this.get('location'),\n            selfLocation: this.get('selfLocation'),\n            iconHoverText: this.get('intl').t('components.navMenu.userDropdown.setViaGeolocation')\n        };\n    }),\n\n    scrollToBottom() {\n        const parentNode = this.get('element.parentNode');\n        parentNode.scrollTop = parentNode.scrollHeight; //Scroll to very bottom\n    },\n\n    actions: {\n        toggleEditProfile() {\n            const editing = this.get('editingProfile');\n\n            if (editing) {\n                if (!this.get('entity.isSaving')) {\n                    this.get('entity').reload();\n                }\n            }\n\n            this.toggleProperty('editingProfile');\n\n            if (\n                this.get('emergencyLocationOn') &&\n                !this.get('editingProfile') &&\n                this.get('emergencyLocation').cancelEditElocation\n            ) {\n                this.get('emergencyLocation').cancelEditElocation();\n            }\n            this.updateMasonry();\n        },\n\n        editProfilePicture: function (event) {\n            if (event) {\n                //action executed on click, kb Space, kb Enter\n                if (event.keyCode != 13 && event.keyCode != 32) {\n                    return;\n                }\n                event.preventDefault();\n            }\n            if (this.get('editingProfile') && this.get('canEditProfilePicture')) {\n                this.set('editingPictures', true);\n            }\n        },\n\n        editContactInfo() {\n            this.get('contactInfoSection').send('showModal');\n        },\n\n        setContactInfo(section) {\n            this.set('contactInfoSection', section);\n        },\n\n        addSection(sectionInfo) {\n            sectionInfo.set('adding', true);\n\n            run.scheduleOnce('afterRender', this, function () {\n                let key = sectionInfo.get('section.key');\n                let $section = this.$(`.${key}`);\n                let top = $section.position().top;\n                Ember.$('#orgspan').animate(\n                    {\n                        scrollTop: top\n                    },\n                    600\n                );\n                this.updateMasonry();\n                const focusTarget = this.$(`.${key}:first`);\n                run.debounce(\n                    this,\n                    function () {\n                        doFocus(Ember, focusTarget);\n                    },\n                    250\n                );\n            });\n        },\n\n        removeSection(sectionInfo) {\n            this.get('fieldSections').removeObject(sectionInfo);\n            this.updateMasonry();\n        },\n\n        toggleCardView() {\n            this.toggleProperty('showCardView');\n        },\n\n        componentUpdated() {\n            this.updateMasonry();\n        },\n\n        noop() {},\n\n        resize(data) {\n            Ember.run.once(this, this.handleResize, data);\n        },\n\n        saveElocation(updatedElocationAddress) {\n            return this.get('emergencyLocation').saveElocation(updatedElocationAddress);\n        },\n        editElocation() {\n            this.set('editEmergencyLocation', true);\n        },\n        cancelEditElocation() {\n            this.set('editEmergencyLocation', false);\n        },\n        refreshAllEmergencylocationInfo(notify) {\n            if (this.get('session.features.emergencyLocation')) {\n                return this.get('emergencyLocation').refreshAllEmergencylocationInfo(notify);\n            }\n        },\n        getEmergencyLocation(phoneNumber) {\n            if (this.get('session.features.emergencyLocation')) {\n                return this.get('emergencyLocation').getEmergencyLocation(phoneNumber);\n            }\n        }\n    },\n\n    allSections: computed.reads('profile.profileSections'),\n    canEditStatus: computed.and('onOwnProfile', 'isPurecloudSource'),\n\n    isPurecloudSource: computed(\n        'session.features.acdHybridToastNoActiveQueue',\n        'session.user.presence.source',\n        function () {\n            if (this.get('session.features.acdHybridToastNoActiveQueue')) {\n                return isPurecloudSource(this.get('session.user.presence.source'));\n            }\n            return true;\n        }\n    ),\n    editingProfile: computed('editing', 'canEditProfile', {\n        get() {\n            if (!this.get('canEditProfile')) {\n                return false;\n            }\n            return this.get('editing');\n        },\n\n        set(key, value) {\n            if (!this.get('canEditProfile')) {\n                return false;\n            }\n\n            return value;\n        }\n    }),\n\n    name: computed('entity.general.name.[]', function () {\n        return this.get('entity').getFieldValue('general.name');\n    }),\n\n    title: computed('entity.general.title.[]', function () {\n        return this.get('entity').getFieldValue('general.title');\n    }),\n\n    department: computed('entity.general.department.[]', function () {\n        return this.get('entity').getFieldValue('general.department');\n    }),\n\n    profile: computed('entity.id', function () {\n        let entity = this.get('entity');\n        return Profile.getProfileForModel(entity, getOwner(this));\n    }),\n\n    emptySections: computed('allSections.[]', 'allSections.@each.{adding,isEmpty}', function () {\n        let sections = this.get('allSections');\n        return sections.filter(sectionInfo => sectionInfo.get('isEmpty') && !sectionInfo.get('adding'));\n    }),\n\n    fieldSections: computed('allSections.[]', 'allSections.@each.{adding,isEmpty}', function () {\n        let sections = this.get('allSections');\n        return sections.filter(sectionInfo => !sectionInfo.get('isEmpty') || sectionInfo.get('adding'));\n    }),\n\n    emptyWriteableSections: computed('emptySections.[]', 'profile.writeableSections.[]', function () {\n        let sections = this.get('emptySections');\n        let sectionKeys = this.get('profile.writeableSections');\n        return sections.filter(sectionInfo => sectionKeys.includes(sectionInfo.get('section.key')));\n    }),\n\n    isEditingSection: computed('fieldSections.@each.editingSection', 'editEmergencyLocation', function () {\n        if (this.get('editEmergencyLocation')) {\n            return true;\n        }\n        return !isEmpty(this.get('fieldSections').findBy('editingSection', true));\n    }),\n\n    showStatus: computed('editingProfile', 'onOwnProfile', 'entity.hasChatStatus', 'chatService.enabled', function () {\n        if (!this.get('chatService.enabled')) {\n            return false;\n        }\n\n        return (this.get('editingProfile') && this.get('onOwnProfile')) || this.get('entity.hasChatStatus');\n    }),\n\n    videoProviders: computed('user', 'user.profile', function () {\n        return this.get('mediaProviders').getVideoProviders(this.get('user'));\n    }),\n\n    haveVideoMediaProviders: computed('videoProviders.@each.haveAccess', function () {\n        return hasSupplementalVideoProvider(this.get('videoProviders'));\n    }),\n\n    entityData: Ember.computed('entity.{id,name,isFavorite,type}', function () {\n        return {\n            id: this.get('entity.id'),\n            name: this.get('entity.name'),\n            isFavorite: this.get('entity.isFavorite'),\n            type: this.get('entity.type')\n        };\n    }),\n\n    enableFavoriteEvent: Ember.on('didInsertElement', function () {\n        this.$().on('favoriteEvent', () => {\n            this.get('favorites').toggleFavorite(this.get('entity'));\n        });\n        this.notifyPropertyChange('entityData');\n    }),\n\n    profileChanged: observer('entity.id', function () {\n        Ember.run.once(this, 'handleProfileChange');\n    }),\n\n    editingSectionChange: observer('isEditingSection', function () {\n        Ember.run.once(this, 'handleEditingSectionChange');\n    }),\n\n    handleProfileChange() {\n        let lastId = this.get('lastEntity.id');\n        if (this.get('entity.id') !== lastId) {\n            this.set('lastEntity', this.get('entity'));\n        }\n    },\n\n    handleEditingSectionChange() {\n        if (this.get('editEmergencyLocation')) {\n            Ember.run.later(() => {\n                this.scrollToBottom();\n            }, 800);\n        }\n\n        if (this.get('setEditingSection')) {\n            this.get('setEditingSection')(this.get('isEditingSection'));\n        }\n    },\n\n    // masonry configuration\n    masonryEl: null,\n\n    _useMasonry() {\n        const debug = this.get('application.debug');\n        const enableMasonry = this.get('application.debugSettings.masonry');\n        return !debug || enableMasonry;\n    },\n\n    _masonryId() {\n        return `entity-profile-${this.get('elementId')}`;\n    },\n\n    _isInDOM() {\n        return this.get('_state') === 'inDOM';\n    },\n\n    fieldSectionsUpdate: Ember.observer('fieldSections.[]', function () {\n        if (isEmpty(this.get('fieldSections'))) {\n            return;\n        }\n\n        Ember.run.scheduleOnce('afterRender', () => {\n            this.updateMasonry();\n        });\n    }),\n\n    attachMasonry() {\n        if (this._useMasonry()) {\n            const masonryEl = this.$('.masonry-container');\n            masonryEl.masonry({\n                itemSelector: '.field-section',\n                columnWidth: '.field-section',\n                fitWidth: true\n            });\n            masonryEl.on('click submit', () => Ember.run(() => this.updateMasonry()));\n            this.set('masonryEl', masonryEl);\n\n            registerLayout(this._masonryId(), this);\n        }\n    },\n\n    _updateMasonry() {\n        if (this._useMasonry()) {\n            Ember.run.scheduleOnce('afterRender', () => {\n                const masonryEl = this.get('masonryEl');\n                if (masonryEl && this._isInDOM()) {\n                    masonryEl.masonry('reloadItems').masonry();\n                }\n            });\n        }\n    },\n\n    rerun() {\n        // ^ this method is required for the utils/masonry#rerunLayouts()\n        Ember.run(() => this.updateMasonry());\n    },\n\n    updateMasonry() {\n        Ember.run.throttle(this, this._updateMasonry, 500, false);\n    },\n\n    detachMasonry() {\n        if (this._useMasonry()) {\n            const masonryEl = this.get('masonryEl');\n            this.set('masonry', null);\n            if (masonryEl) {\n                masonryEl.masonry('destroy');\n                masonryEl.off('click submit');\n            }\n\n            deregisterLayout(this._masonryId());\n        }\n    },\n\n    startMasonry: Ember.on('didInsertElement', function () {\n        this.attachMasonry();\n    }),\n\n    stopMasonry: Ember.on('willDestroyElement', function () {\n        this.detachMasonry();\n    }),\n\n    handleResize(data) {\n        if (!data.width) {\n            return;\n        }\n\n        if (data.width < 500) {\n            this.set('compactLayout', true);\n        } else {\n            this.set('compactLayout', false);\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport DS from 'ember-data';\n\nconst { Mixin, inject, computed } = Ember;\n\nexport default Mixin.create({\n    session: inject.service(),\n    permissions: inject.service(),\n\n    canEditProfile: computed.or('onOwnProfile', 'profile.canEditProfile', 'session.person.isAdmin'),\n\n    canEditName: computed(\n        'entity.readWritePermissions',\n        'editingProfile',\n        'session.features',\n        'permissions.canEditProfiles',\n        function () {\n            if (!this.get('editingProfile')) {\n                return false;\n            }\n            return this.get('permissions.canEditProfiles');\n        }\n    ),\n\n    canEditTitle: computed(\n        'entity.readWritePermissions',\n        'editingProfile',\n        'session.features',\n        'permissions.canEditProfiles',\n        function () {\n            if (!this.get('editingProfile')) {\n                return false;\n            }\n            return this.get('permissions.canEditProfiles');\n        }\n    ),\n\n    canEditDepartment: computed('editingProfile', 'permissions.canEditProfiles', function () {\n        if (!this.get('editingProfile')) {\n            return false;\n        }\n        return this.get('permissions.canEditProfiles');\n    }),\n\n    canReadHR: computed.reads('permissions.canReadProfile'),\n\n    onOwnProfile: Ember.computed('entity.id', 'session.person.id', function () {\n        return this.get('entity.id') === this.get('session.person.id');\n    }),\n\n    showGallery: Ember.computed('entity', 'entity.id', function () {\n        var gallery = this.get('entity.images.informal');\n        if (gallery) {\n            return gallery.length > 0;\n        }\n        return false;\n    }),\n\n    canReadGroups: Ember.computed('entity.groups.{social,official}', function () {\n        let groupsFieldConfig = this.get('entity.fieldConfig')\n            ? this.get('entity.fieldConfig').getSectionByKey('groups')\n            : null;\n        let groups = this.get('entity.groups');\n        if (!groupsFieldConfig || _.isEmpty(groups)) {\n            return false;\n        }\n        return Ember.get(groups, 'social.length') || Ember.get(groups, 'official.length');\n    }),\n\n    canEditProfilePicture: Ember.computed('canEditProfile', function () {\n        return this.get('canEditProfile');\n    }),\n\n    canEditGeneralInfo: Ember.computed('onOwnProfile', function () {\n        var promise = new Ember.RSVP.Promise(resolve => {\n            resolve(this.get('onOwnProfile'));\n        });\n\n        return DS.PromiseObject.create({\n            promise: promise\n        });\n    }),\n\n    canEditContactInfo: Ember.computed(\n        'session.{user.isAdmin,features}',\n        'entity.readWritePermissions',\n        'onOwnProfile',\n        function () {\n            var promise = new Ember.RSVP.Promise(resolve => {\n                resolve(this.get('onOwnProfile'));\n            });\n\n            return DS.PromiseObject.create({\n                promise: promise\n            });\n        }\n    ),\n\n    canViewLocations: Ember.computed(\n        'ownOwnProfile',\n        'entity.readWritePermissions',\n        'session.{user.isAdmin,features}',\n        'entity.fieldConfig.location.location',\n        function () {\n            var locationsField = this.get('entity.fieldConfig.location.location');\n            var promise = new Ember.RSVP.Promise(resolve => {\n                if (_.isEmpty(locationsField)) {\n                    return resolve(false);\n                }\n                if (this.get('session.user.isAdmin')) {\n                    return resolve(true);\n                }\n                resolve(this.get('onOwnProfile'));\n            });\n\n            return DS.PromiseObject.create({\n                promise: promise\n            });\n        }\n    ),\n\n    canViewInformals: Ember.computed('canEditProfilePicture', 'entity.images.informal', function () {\n        var photos = this.get('entity.images.informal');\n\n        if (photos && photos !== undefined) {\n            return photos.length > 0;\n        }\n        return false;\n    })\n});\n","import Ember from 'ember';\n\nimport Validators from '../../entity-fields/validators';\nimport { BUILTIN_SECTIONS, customSectionKeys } from './profile';\n\nconst { computed } = Ember;\n\nconst PERMISSIONED_FIELD_PATHS = [\n    'contactInfo.email_main',\n    'contactInfo.phone_work',\n    'contactInfo.voicemaileEnabled',\n    'general.title',\n    'hr.empId',\n    'hr.empType',\n    'hr.hireDate',\n    'hr.officialName',\n    'relationships.manager',\n    'relationships.administrativeAssistant',\n    'purecloud.defaultStationId',\n    'purecloud.siteId',\n    'purecloud.skills',\n    'purecloud.languages',\n    'purecloud.acdAutoAnswer',\n    'agent.name',\n    'agent.profileImage',\n    'primaryContactInfo.email'\n];\n\nconst POSSIBLE_INTEGRATION_FIELDS = ['contactInfo.phone_other'];\n\nexport default Ember.Object.extend({\n    session: null,\n    permissions: null,\n    entity: null,\n    field: null,\n    valueReference: null,\n\n    value: computed('fieldPath', 'entity.{fieldPath}.[]', 'entity.{fieldPath}.@each._id', function () {\n        const id = this.get('valueReference._id');\n        const tempId = this.get('valueReference.tempId');\n        const fieldPath = this.get('fieldPath');\n        const entity = this.get('entity');\n        const data = entity ? entity.get(fieldPath) : null;\n\n        let location = this.get('_sectionLocation');\n        let value = {};\n\n        if (Array.isArray(data) && data.length) {\n            if (location === null || location === undefined || location >= data.length || location < 0) {\n                if (tempId) {\n                    location = data.findIndex(d => d.tempId === tempId);\n                } else if (id) {\n                    location = data.findIndex(d => d._id === id);\n                } else {\n                    location = 0;\n                }\n\n                this.set('_sectionLocation', location);\n            } else if (id != null) {\n                location = data.findIndex(d => d._id === id);\n                this.set('_sectionLocation', location);\n            }\n\n            if (location != null && location >= 0) {\n                value = data[location];\n            } else {\n                // if no location found or negative index then we assume its at the top\n                value = data[0];\n            }\n        }\n\n        // if the value does not have an id or tempId then its a new addition and we need to assign a tempId for ui tracking\n        if (!value.id && !value.tempId) {\n            value.tempId = Ember.generateGuid();\n        }\n\n        return value;\n    }),\n\n    _sectionLocation: null,\n\n    // Legacy support\n    entry: computed.reads('value'),\n    fieldValue: computed.reads('value'),\n\n    sectionKey: computed('field', function () {\n        return this.get('field.section.key');\n    }),\n\n    fieldPath: computed('field', function () {\n        return this.get('field').getFieldPath();\n    }),\n\n    fieldPathClass: computed('fieldPath', function () {\n        const fieldPath = this.get('fieldPath');\n        return fieldPath.replace(/\\./gi, '-');\n    }),\n\n    fieldId: computed('value._id', 'value.tempId', function () {\n        return this.get('value._id') || this.get('value.tempId');\n    }),\n\n    writeable: computed('entity.type', 'entity.readWritePermissions', 'fieldPath', 'value', function () {\n        const type = this.get('entity.type');\n        if (type === 'group') {\n            return true;\n        }\n\n        const canEditProfiles = this.get('permissions.canEditProfiles');\n        const path = this.get('fieldPath');\n\n        // Integration fields have their own editing requirements\n        if (this.get('integrationManaged')) {\n            return false;\n        }\n\n        if (Ember.A(PERMISSIONED_FIELD_PATHS).includes(path)) {\n            // Only admins can edit core contact fields\n            return canEditProfiles;\n        }\n\n        if (Ember.A(BUILTIN_SECTIONS).includes(this.get('sectionKey'))) {\n            return true;\n        }\n\n        const myOwnProfile = this.get('session.person.id') === this.get('entity.id');\n        const customKeys = customSectionKeys(this.get('entity.fieldConfig.sections'));\n        if ((myOwnProfile || canEditProfiles) && Ember.A(customKeys).includes(this.get('sectionKey'))) {\n            return true;\n        }\n\n        return false;\n    }),\n\n    /**\n     * @deprecated\n     * This computed value is deprecated. Please use `removable` instead.\n     */\n    removeable: computed(function () {\n        Ember.Logger.warn(\n            '`components/entity-profile/profiles/field-data.js` - The use of the computed value `removeable` is deprecated. Please update to use `removable` on this class instead.'\n        );\n        return this.get('removable');\n    }),\n\n    removable: computed('integrationManaged', 'field.repeatable', function () {\n        const repeatable = this.get('field.repeatable');\n        return repeatable && !this.get('integrationManaged');\n    }),\n\n    integrationManaged: computed('entity.type', 'entity.readWritePermissions', 'fieldPath', 'value', function () {\n        const type = this.get('entity.type');\n        if (type === 'group') {\n            return false;\n        }\n\n        const path = this.get('fieldPath');\n        if (Ember.A(POSSIBLE_INTEGRATION_FIELDS).includes(path)) {\n            let value = this.get('value');\n            return value && value.value && !!value.value.integration;\n        }\n\n        return false;\n    }),\n\n    isEmpty: computed('field.type', 'value', 'value.value', 'value.value.[]', {\n        get() {\n            const type = this.get('field.type');\n            const value = this.get('value');\n\n            let validator = null;\n            if (Validators[type]) {\n                validator = Validators[type];\n            } else {\n                validator = Validators.default;\n\n                Ember.Logger.warn('Using default validator for field:', {\n                    fieldPath: this.get('fieldPath'),\n                    field: this.get('field')\n                });\n            }\n\n            if (!value || Object.keys(value).length === 0) {\n                return true;\n            }\n\n            return validator.isEmpty(value, this.get('field'));\n        },\n\n        set(path, value) {\n            return value;\n        }\n    }),\n\n    isValid: computed('value', 'value.value', 'value.value.[]', {\n        get() {\n            const type = this.get('field.type');\n            const value = this.get('value');\n\n            let validator = null;\n            if (Validators[type]) {\n                validator = Validators[type];\n            } else {\n                validator = Validators.default;\n\n                Ember.Logger.warn('Using default validator for field:', {\n                    fieldPath: this.get('fieldPath'),\n                    field: this.get('field')\n                });\n            }\n\n            if (!value || Object.keys(value).length === 0) {\n                return true;\n            }\n\n            return validator.isValid(value, this.get('field'));\n        },\n\n        set(path, value) {\n            return value;\n        }\n    }),\n\n    isPrimaryField: computed('value._id', 'entity.primaryContactInfo.email.firstObject.value.fieldId', function () {\n        const primaryFieldId = this.get('entity.primaryContactInfo.email.firstObject.value.fieldId');\n        return this.get('value._id') === primaryFieldId;\n    }),\n\n    isNewValue: computed('value._id', 'value.tempId', {\n        get() {\n            return !this.get('value._id');\n        },\n\n        set(path, value) {\n            return value;\n        }\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport SectionInfo from './section-info';\n\nconst { inject, computed } = Ember;\n\nconst PROFILE_CACHE = {};\n\nconst EXCLUDED_SECTIONS = [\n    'status',\n    'general',\n    'primaryContactInfo',\n    'images',\n    'uploads',\n    'cic',\n    'scs',\n    'custserv',\n    'device',\n    'purecloud',\n    'preferences',\n    'externalContacts'\n];\n\nexport const BUILTIN_SECTIONS = ['general', 'contactInfo', 'skills', 'location', 'bio', 'education', 'hr'];\n\nexport const ADMIN_SECTIONS = ['relationships', 'agent'];\n\nexport function customSectionKeys(sections) {\n    const builtins = [...BUILTIN_SECTIONS, ...ADMIN_SECTIONS, ...EXCLUDED_SECTIONS];\n    const keys = Ember.A(sections).mapBy('key');\n    return keys.filter(key => !Ember.A(builtins).includes(key));\n}\n\nlet Profile = Ember.Object.extend({\n    _cache: PROFILE_CACHE,\n\n    session: inject.service('session'),\n    permissions: inject.service('permissions'),\n\n    model: null,\n    readWritePermissions: null,\n\n    writeableSections: null,\n    readableSections: null,\n\n    sections: computed.reads('model.fieldConfig.sections'),\n    canEditProfiles: computed.reads('permissions.canEditProfiles'),\n    canReadProfiles: computed.reads('permissions.canReadProfiles'),\n\n    init() {\n        this._super(...arguments);\n\n        let writeableSections = [];\n        const customKeys = customSectionKeys(this.get('sections'));\n        let readableSections = [...BUILTIN_SECTIONS, 'relationships', 'groups', ...customKeys];\n\n        if (this.get('model.id') === this.get('session.person.id')) {\n            writeableSections = [...BUILTIN_SECTIONS, ...customKeys];\n        }\n\n        if (this.get('canEditProfiles')) {\n            writeableSections = [...BUILTIN_SECTIONS, ...customKeys, ...ADMIN_SECTIONS];\n        }\n        if (this.get('canReadProfiles')) {\n            readableSections = readableSections.concat(ADMIN_SECTIONS);\n        }\n\n        this.setProperties({\n            readWritePermissions: {\n                write: [],\n                read: []\n            },\n            writeableSections,\n            readableSections\n        });\n    },\n\n    profileSections: computed('session.person', 'model', 'readableSections.[]', function () {\n        let data = [];\n        let sections = this.get('sections');\n        let isSuper = this.get('session.person.isAdmin') && !this.get('session.user.personId');\n        if (isSuper) {\n            data = _.filter(sections, section => {\n                return EXCLUDED_SECTIONS.indexOf(section.key) === -1;\n            });\n        } else {\n            data = _.filter(sections, section => {\n                let readableSections = this.get('readableSections');\n                return EXCLUDED_SECTIONS.indexOf(section.key) === -1 && readableSections.indexOf(section.key) !== -1;\n            });\n        }\n\n        return _.map(data, section => {\n            return SectionInfo.create({\n                section: section,\n                entity: this.get('model')\n            });\n        });\n    }),\n\n    canEditProfile: computed('writeableSections.[]', function () {\n        return this.get('writeableSections.length') > 0;\n    }),\n\n    canEditProfilePictures: computed('model.id', 'session.person.id', 'canEditProfiles', function () {\n        if (this.get('model.id') === this.get('session.person.id')) {\n            return true;\n        }\n        return this.get('canEditProfiles');\n    }),\n\n    canEditSection(section) {\n        if (this.get('session.person.isAdmin') || this.get('canEditProfiles')) {\n            return true;\n        }\n\n        let sections = this.get('writeableSections');\n        return _.includes(sections, section.key);\n    },\n\n    canReadSection(section) {\n        if (this.get('session.person.isAdmin') || this.get('canReadProfiles')) {\n            return true;\n        }\n\n        let sections = this.get('readableSections');\n        return _.includes(sections, section.key);\n    },\n\n    getReadableFieldPathsForSection(section) {\n        return section.get('fieldList').mapBy('fieldPath');\n    },\n\n    getEditableFieldPathsForSection(section) {\n        return section.get('fieldList').mapBy('fieldPath');\n    }\n});\n\nProfile.reopenClass({\n    getProfileForModel(model, owner) {\n        let id = model.get('id');\n        if (PROFILE_CACHE[id]) {\n            return PROFILE_CACHE[id];\n        }\n        let profile = Profile.create(\n            {\n                model: model\n            },\n            owner.ownerInjection()\n        );\n        PROFILE_CACHE[id] = profile;\n        return profile;\n    }\n});\n\nexport default Profile;\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed } = Ember;\n\nlet customSections = ['groups', 'relationships', 'contactInfo', 'location', 'education'];\n\nexport default Ember.Object.extend({\n    entity: null,\n    section: null,\n\n    adding: false,\n    editingSection: false,\n\n    init() {\n        this._super(...arguments);\n\n        // consume computed...\n        this.get('groupSectionChange');\n    },\n\n    componentName: computed('section.key', function () {\n        let key = this.get('section.key');\n        if (_.includes(customSections, key)) {\n            let name = Ember.String.dasherize(key);\n            return `entity-field-section/entity-${name}`;\n        }\n\n        return 'entity-field-section';\n    }),\n\n    hasCustomComponent: computed('section.key', function () {\n        return _.includes(customSections, this.get('section.key'));\n    }),\n\n    isEmpty: computed(\n        'entity',\n        'section',\n        'adding',\n        'entity.groups.official.[]',\n        'entity.groups.social.[]',\n        'entity.directReports.content',\n        {\n            get() {\n                let entity = this.get('entity');\n                let section = this.get('section');\n\n                if (section.get('fieldList.length') === 0) {\n                    return true;\n                }\n\n                let emptyFields = _.filter(section.get('fieldList'), field => {\n                    let fieldPath = field.get('fieldPath');\n                    let values = entity.get(fieldPath);\n\n                    // Work-around weird direct reports relationship...\n                    if (section.get('key') === 'relationships' && field.get('key') === 'directReportCount') {\n                        return !entity.get('directReports.content.length');\n                    }\n\n                    if (!_.isEmpty(values)) {\n                        let emptyValues = _.filter(values, value => {\n                            if (_.isEmpty(value._id) && _.isEmpty(value.guid)) {\n                                return true;\n                            }\n\n                            return _.isEmpty(value.value);\n                        });\n\n                        return !_.isEmpty(emptyValues);\n                    }\n\n                    return true;\n                });\n\n                return !_.isEmpty(emptyFields) && emptyFields.length === section.get('fieldList.length');\n            },\n\n            set(key, value) {\n                return value;\n            }\n        }\n    )\n});\n","import Ember from 'ember';\n\nconst { computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['section-icon', 'clickable'],\n    classNameBindings: ['section.key'],\n\n    attrs: {\n        sectionInfo: null,\n        addSection() {}\n    },\n\n    section: computed.reads('sectionInfo.section'),\n\n    icon: computed('section.key', function () {}),\n\n    click() {\n        this.attrs.addSection(this.get('sectionInfo'));\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"r2fmlELA\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"icon\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-contacts\\\"],[13],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[13],[1,[28,[\\\"section\\\",\\\"sectionName\\\"]],false],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-profile/section-icon/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"D5sAqEMl\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"resize-detector\\\"],[\\\".entity-profile .banner\\\"],[[\\\"on-resize\\\"],[[33,[\\\"action\\\"],[[28,[null]],\\\"resize\\\"],null]]]],false],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"banner\\\"],[15,\\\"role\\\",\\\"banner\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"h1\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editingProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.profileHeadingEditMode\\\"],[[\\\"name\\\"],[[28,[\\\"name\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.profileHeadingViewMode\\\"],[[\\\"name\\\"],[[28,[\\\"name\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"content banner-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"edit-profile\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"toggleEditProfile\\\"],null],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-edit-profile\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"button-text-removal\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editingProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.viewPublicProfile\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.viewEditMode\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"]]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"favorite links \\\",[33,[\\\"if\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"card-detail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"card.detail\\\",[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"tooltip.person.cardView\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-card-view\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"tree-detail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"card.tree\\\",[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"tooltip.person.treeView\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-tree-view\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"onOwnProfile\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"entity-favorite\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"\\\"],[16,\\\"entityFavoriteData\\\",[26,[\\\"entityData\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"image \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editingProfile\\\"]],[28,[\\\"canEditProfilePicture\\\"]]],null],\\\"clickable\\\"],null]]]],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"editProfilePicture\\\"],[[\\\"on\\\"],[\\\"keydown\\\"]]],null],[16,\\\"aria-label\\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editingProfile\\\"]],[28,[\\\"canEditProfilePicture\\\"]]],null],[33,[\\\"t\\\"],[\\\"person.edit.profilePicture\\\"],null]],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editProfilePicture\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\"],[[28,[\\\"entity\\\"]],true,true]],{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editingProfile\\\"]],[28,[\\\"canEditProfilePicture\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-camera camera\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isPresenceLabelToggleEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"presence-label\\\",{\\\"attrs\\\":[[16,\\\"presenceLabelData\\\",[26,[\\\"presenceLabelData\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"presence-label\\\"],null,[[\\\"entity\\\",\\\"showStatus\\\",\\\"wrap\\\"],[[28,[\\\"entity\\\"]],false,true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"entity-location\\\"],null,[[\\\"class\\\",\\\"entity\\\",\\\"locationHoverText\\\"],[\\\"entity-geolocation\\\",[28,[\\\"entity\\\"]],[33,[\\\"t\\\"],[\\\"components.navMenu.userDropdown.setViaGeolocation\\\"],null]]]],false],[0,\\\"\\\\n\\\\n            \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"field\\\",\\\"entry\\\",\\\"canEdit\\\",\\\"onProfile\\\",\\\"isGeneralField\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"entity\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"name\\\"]],[28,[\\\"name\\\"]],[28,[\\\"canEditName\\\"]],true,true]]],false],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"general \\\",[33,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"editingProfile\\\"]],[28,[\\\"department\\\",\\\"value\\\"]]],null],\\\"show-divider\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"title\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"field\\\",\\\"entry\\\",\\\"canEdit\\\",\\\"onProfile\\\",\\\"isGeneralField\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"entity\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"title\\\"]],[28,[\\\"title\\\"]],[28,[\\\"canEditTitle\\\"]],true,true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"department\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"field\\\",\\\"entry\\\",\\\"canEdit\\\",\\\"onProfile\\\",\\\"isGeneralField\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"entity\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"department\\\"]],[28,[\\\"department\\\"]],[28,[\\\"canEditDepartment\\\"]],true,true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showStatus\\\"]],[33,[\\\"or\\\"],[[28,[\\\"isPurecloudSource\\\"]],[28,[\\\"entity\\\",\\\"chatStatus\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"status\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-status\\\"],null,[[\\\"entity\\\",\\\"editable\\\",\\\"onProfile\\\",\\\"showPlaceholder\\\"],[[28,[\\\"entity\\\"]],[33,[\\\"and\\\"],[[28,[\\\"canEditStatus\\\"]],[28,[\\\"editingProfile\\\"]]],null],true,true]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"entity-contact-group-v2\\\"],null,[[\\\"canViewChat\\\",\\\"canViewVideo\\\",\\\"entity\\\",\\\"user\\\",\\\"useMediaProviders\\\",\\\"showFavorite\\\",\\\"viewLightGallery\\\"],[[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"user\\\"]],[28,[\\\"haveVideoMediaProviders\\\"]],false,\\\"viewLightGallery\\\"]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"haveVideoMediaProviders\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"media-providers/video-dropdown\\\"],null,[[\\\"user\\\",\\\"attachTo\\\",\\\"attachClickHandler\\\"],[[28,[\\\"entity\\\"]],[33,[\\\"concat\\\"],[\\\"#\\\",[28,[\\\"elementId\\\"]],\\\" .contact.webrtc\\\"],null],true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"elementId\\\"]},null],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"role\\\",\\\"main\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"main-actions\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editingProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"entity-profile/add-section\\\"],null,[[\\\"entity\\\",\\\"sections\\\",\\\"emptySections\\\",\\\"addSection\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"fieldSections\\\"]],[28,[\\\"emptyWriteableSections\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"addSection\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"sections profile-sections \\\",[33,[\\\"if\\\"],[[28,[\\\"showCardView\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"masonry-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"fieldSections\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-section \\\",[28,[\\\"sectionInfo\\\",\\\"section\\\",\\\"key\\\"]],\\\"-section\\\"]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"sectionInfo\\\",\\\"componentName\\\"]],\\\"entity-field-section/entity-contact-info\\\"],null]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"sectionInfo\\\",\\\"componentName\\\"]]],[[\\\"entity\\\",\\\"sectionInfo\\\",\\\"editingProfile\\\",\\\"editingElocation\\\",\\\"emergencyLocationOn\\\",\\\"showResetButton\\\",\\\"onOwnProfile\\\",\\\"emergencyLocationData\\\",\\\"removeSection\\\",\\\"componentUpdated\\\",\\\"saveElocation\\\",\\\"cancelEditElocation\\\",\\\"editElocation\\\",\\\"refreshAllEmergencylocationInfo\\\",\\\"getEmergencyLocation\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"sectionInfo\\\"]],[28,[\\\"editingProfile\\\"]],[28,[\\\"editEmergencyLocation\\\"]],[28,[\\\"emergencyLocationOn\\\"]],false,[28,[\\\"onOwnProfile\\\"]],[28,[\\\"emergencyLocation\\\",\\\"emergencyLocationData\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSection\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"componentUpdated\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"saveElocation\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelEditElocation\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"editElocation\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"refreshAllEmergencylocationInfo\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"getEmergencyLocation\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"sectionInfo\\\",\\\"componentName\\\"]]],[[\\\"entity\\\",\\\"sectionInfo\\\",\\\"editingProfile\\\",\\\"removeSection\\\",\\\"componentUpdated\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"sectionInfo\\\"]],[28,[\\\"editingProfile\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSection\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"componentUpdated\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"sectionInfo\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showCardView\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"card-view-container \\\",[33,[\\\"unless\\\"],[[28,[\\\"showCardView\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"card-view\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[1,[33,[\\\"entity-picture-content\\\"],null,[[\\\"entity\\\",\\\"showing\\\",\\\"profile\\\",\\\"open\\\",\\\"close\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"editingPictures\\\"]],[28,[\\\"profile\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"editProfilePicture\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelEditProfilePicture\\\"],null]]]],false],[0,\\\"\\\\n\\\\n\\\"],[1,[33,[\\\"light-gallery-modal\\\"],null,[[\\\"entity\\\",\\\"showing\\\",\\\"open\\\",\\\"close\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"viewingGallery\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"viewLightGallery\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelViewLightGallery\\\"],null]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-profile/template.hbs\"}});","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport { ThenableSearchMixin } from '../../mixins/search';\nimport { pluralize } from 'ember-inflector';\n\nconst UP = 40;\nconst DOWN = 38;\nconst ESCAPE = 27;\nconst ENTER = 13;\n\nconst { computed, Component } = Ember;\n\nexport default Component.extend(ThenableSearchMixin, {\n    classNames: ['entity-search'],\n\n    currentSelected: -1,\n\n    intl: Ember.inject.service(),\n    search: Ember.inject.service(),\n\n    select: '',\n    type: 'all',\n    filterFunction: null,\n\n    searchQuery: '',\n    userInput: null,\n    searchLimit: 10,\n    debouncedScheduleQueryUpdate: null,\n    relationship: null,\n    disabled: false,\n\n    init() {\n        this._super(...arguments);\n        this.ensurePluralType();\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.attachClickListener();\n        this.debouncedScheduleQueryUpdate = _.debounce(this._scheduleSearchQueryUpdate, 250, { maxWait: 500 });\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        Ember.$(document).off(`.${this.get('elementId')}`);\n    },\n\n    keyDown(event) {\n        switch (event.keyCode) {\n            case UP:\n                return this.selectNext();\n            case DOWN:\n                return this.selectPrevious();\n            case ESCAPE:\n                return this.cancelInput();\n            case ENTER:\n                if (this.get('wrappedSearchResults')) {\n                    return this.chooseSelected();\n                }\n                break;\n            default:\n                this.debouncedScheduleQueryUpdate();\n                this.set('currentSelected', -1);\n                break;\n        }\n    },\n\n    actions: {\n        setUserInput(event) {\n            Ember.run.debounce(this, this._updateSearchQuery, event.target.value, 250);\n        },\n\n        submit() {\n            this.notifyPropertyChange('searchQuery');\n        },\n\n        selectResult(entity) {\n            this.set('searchQuery', '');\n            this.set('userInput', '');\n            this.sendAction('select', entity);\n        },\n\n        clearSearch() {\n            this.set('searchQuery', '');\n            this.set('userInput', '');\n            return this.set('currentSelected', -1);\n        }\n    },\n\n    entityFilter: computed.reads('type'),\n\n    results: computed('searchQuery', function () {\n        if (!this.get('isEmpty')) {\n            const search = this.get('search');\n            const entities = this.get('type').split(',');\n\n            return DS.PromiseArray.create({\n                promise: search.performSearch(this.get('searchQuery'), 0, entities).then(({ results }) => {\n                    return this._buildResults(results);\n                })\n            });\n        }\n        return Ember.RSVP.resolve(Ember.A([]));\n    }),\n\n    wrappedSearchResults: Ember.computed('results', function () {\n        let searchResults = this.get('results');\n        return DS.PromiseArray.create({\n            promise: searchResults.then(searchResults => {\n                return _.map(searchResults, function (entity) {\n                    Ember.set(entity, 'selected', false);\n                    return entity;\n                });\n            })\n        });\n    }),\n\n    loading: computed('wrappedSearchResults.isFulfilled', function () {\n        return !this.get('wrappedSearchResults.isFulfilled');\n    }),\n\n    haveResults: computed('results.[]', function () {\n        return !_.isEmpty(this.get('results'));\n    }),\n\n    placeholder: computed('type', function () {\n        let map = {\n            all: 'components.entitySearch.search',\n            people: 'components.personSearch.search',\n            groups: 'components.groupSearch.search',\n            locations: 'components.locationSearch.search'\n        };\n\n        let key = map[this.get('type')];\n        if (key) {\n            return this.get('intl').lookup(key).toString();\n        }\n\n        return '';\n    }),\n\n    isEmpty: computed('searchQuery', function () {\n        return _.isEmpty(this.get('searchQuery'));\n    }),\n\n    noResultsKey: computed('type', function () {\n        if (this.get('type') !== 'locations') {\n            return 'components.entitySearch.noResults';\n        }\n\n        return 'components.entitySearch.noResultsLocation';\n    }),\n\n    ensurePluralType() {\n        let type = this.get('type');\n        if (!_.isEmpty(type) && type !== 'all') {\n            let plural = pluralize(type);\n            this.set('type', plural);\n        }\n    },\n\n    attachClickListener() {\n        Ember.$(document).on(`click.${this.get('elementId')}`, event => {\n            Ember.run(() => {\n                let target = Ember.$(event.target);\n                if (!target.parents('.entity-search').length) {\n                    this.set('searchResults', []);\n                }\n            });\n        });\n    },\n\n    selectNext() {\n        const entities = this.get('wrappedSearchResults.content');\n        const nowSelected = this.get('currentSelected');\n        const nextSelected = nowSelected + 1;\n        if (nowSelected + 1 < entities.length) {\n            if (entities[nowSelected]) {\n                entities[nowSelected].set('selected', false);\n            }\n            if (entities[nextSelected]) {\n                entities[nextSelected].set('selected', true);\n            }\n            this.set('currentSelected', nextSelected);\n            this.scrolling(true);\n        }\n    },\n\n    selectPrevious() {\n        const entities = this.get('wrappedSearchResults');\n        const nowSelected = this.get('currentSelected');\n        const previousSelected = nowSelected + 1;\n        if (nowSelected - 1 >= 0) {\n            if (entities[nowSelected]) {\n                entities[nowSelected].set('selected', false);\n            }\n            if (entities[previousSelected]) {\n                entities[previousSelected].set('selected', true);\n            }\n            this.set('currentSelected', previousSelected);\n            this.scrolling(false);\n        }\n    },\n\n    scrolling(next) {\n        const areaScroll = this.$('.scrollable-area').scrollTop();\n        const entityHeight = this.$('.scroll-entity').height();\n        if (next) {\n            if (this.currentSelected !== 0) {\n                this.$('.scrollable-area').scrollTop(areaScroll + entityHeight);\n            }\n        } else {\n            this.$('.scrollable-area').scrollTop(areaScroll - entityHeight);\n        }\n    },\n\n    clearInputs() {\n        this.set('searchQuery', null);\n        this.set('currentSelected', -1);\n    },\n\n    cancelInput() {\n        if (this.get('searchQuery')) {\n            this.clearInputs();\n        } else {\n            this.sendAction('cancel');\n            this.clearInputs();\n        }\n    },\n\n    chooseSelected() {\n        const entities = this.get('wrappedSearchResults.content');\n        let chosen = entities[this.currentSelected];\n        if (entities.length === 1) {\n            chosen = entities[0];\n        }\n        if (chosen && !chosen.disabled) {\n            this.send('selectResult', chosen);\n        }\n    },\n\n    _buildResults(results) {\n        let filterFunction = this.get('filterFunction');\n        _.each(results, function (result) {\n            if (result.selected) {\n                Ember.set(result, 'selected', false);\n            }\n        });\n        if (results && filterFunction) {\n            return filterFunction(results);\n        }\n        return results;\n    },\n\n    _scheduleSearchQueryUpdate() {\n        Ember.run.join(() => {\n            this._updateSearchQuery();\n        });\n    },\n\n    _updateSearchQuery(value) {\n        if (this.isDestroying || this.isDestroyed) {\n            return;\n        }\n\n        value = value || this.get('userInput');\n        this.set('searchQuery', value);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"rMz+/qxA\",\"block\":\"{\\\"statements\\\":[[11,\\\"form\\\",[]],[15,\\\"class\\\",\\\"input-form\\\"],[15,\\\"autocomplete\\\",\\\"off\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"submit\\\"],[[\\\"on\\\"],[\\\"submit\\\"]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-entity-search\\\"]]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[1,[26,[\\\"placeholder\\\"]],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-entity-search\\\"]]],[15,\\\"class\\\",\\\"form-control purecloud-input\\\"],[16,\\\"disabled\\\",[26,[\\\"disabled\\\"]],null],[16,\\\"value\\\",[34,[[26,[\\\"userInput\\\"]]]]],[16,\\\"placeholder\\\",[34,[[26,[\\\"placeholder\\\"]]]]],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setUserInput\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"search-icon\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-spin pc-loading\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-search\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"clearSearch\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"search-results \\\",[33,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"loading\\\"]],[28,[\\\"isEmpty\\\"]]],null],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"results-container scrollable-area\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"wrappedSearchResults\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[29,\\\"default\\\"]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[18,\\\"default\\\",[[28,[\\\"result\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"selectResult\\\"],null]]],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"result-container clickable scroll-entity \\\",[33,[\\\"if\\\"],[[28,[\\\"result\\\",\\\"selected\\\"]],\\\"selected\\\"],null]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectResult\\\",[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\"],[[28,[\\\"result\\\"]],false,false]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"result\\\"]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"noResultsKey\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[[28,[\\\"noResultsKey\\\"]]],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-search/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport { eventToString } from 'connections-ui/utils/keystroke';\n\nconst { inject, computed, Component } = Ember;\n\nconst isEnter = event => eventToString(event) === 'ENTER';\n\nconst MAX_STATUS_LENGTH = 50;\nconst stripHtml = str => str.replace(/(<([^>]+)>)/gi, '');\n\nexport default Component.extend({\n    classNames: ['entity-status'],\n    classNameBindings: ['editable'],\n    layoutName: 'components/entity-status',\n\n    intl: inject.service(),\n    session: inject.service(),\n    notification: inject.service('notification-proxy'),\n    presence: inject.service(),\n\n    entity: null,\n    editable: false,\n    onProfile: false,\n    showPlaceholder: false,\n    savedStatus: null,\n    isLoading: false,\n    maxLength: MAX_STATUS_LENGTH,\n\n    debounceTime: 1000,\n\n    init() {\n        this._super(...arguments);\n        this.set('savedStatus', this.get('status'));\n    },\n\n    showStatus: computed.or('entity.hasChatStatus', 'editable', 'showPlaceholder'),\n\n    status: computed('entity.chatStatus', {\n        get() {\n            return this.get('entity.chatStatus');\n        },\n        set(key, value) {\n            return value;\n        }\n    }),\n\n    isInvalid: computed('status', function () {\n        const status = this.get('status');\n        return !_.isEmpty(status) && status.length > MAX_STATUS_LENGTH;\n    }),\n\n    actions: {\n        changeStatus(event) {\n            if (event && event.target && isEnter(event)) {\n                Ember.set(this, 'status', event.target.value);\n                event.preventDefault();\n                this.updateStatus();\n            }\n        },\n\n        changeStatusEventually(event) {\n            if (event && event.target && !isEnter(event)) {\n                Ember.set(this, 'status', event.target.value);\n                Ember.run.debounce(this, this.updateStatus, this.debounceTime);\n            }\n        }\n    },\n\n    updateStatus() {\n        if (this.get('isInvalid')) {\n            return;\n        }\n        const status = this.get('status');\n        Ember.Logger.debug(`STATUS-MSG: updateStatus(${status})`);\n        this.set('isLoading', true);\n\n        this.get('presence')\n            .setUsersStatus(this.get('session.person'), status)\n            .then(() => {\n                this.set('savedStatus', status);\n            })\n            .catch(response => {\n                const message = stripHtml(response.message || '');\n                this.showUpdateError(message);\n                this.set('status', this.get('savedStatus'));\n            })\n            .finally(() => {\n                this.set('isLoading', false);\n            });\n    },\n\n    showUpdateError(message) {\n        const title = this.get('intl').t('chat.statusError');\n        const options = { hideAfter: 5 };\n        this.get('notification').error(title, message, options);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"OEYdL51E\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showStatus\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"hr\\\",[]],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"h6\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"person.status\\\"],null],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"status-block\\\"],[13],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"icon-quote-left\\\"],[15,\\\"icon-name\\\",\\\"legacy/quote-left\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editable\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"form\\\",[]],[5,[\\\"action\\\"],[[28,[null]],\\\"changeStatus\\\"],[[\\\"on\\\"],[\\\"submit\\\"]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[15,\\\"id\\\",\\\"statusPlaceHolderLabel\\\"],[15,\\\"class\\\",\\\"sr-only\\\"],[16,\\\"for\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-change-status\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"chat.statusPlaceholder\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"textarea\\\",[]],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-change-status\\\"],null]]]],[16,\\\"class\\\",[34,[\\\"status-input form-control\\\",[33,[\\\"if\\\"],[[28,[\\\"isInvalid\\\"]],\\\" invalid\\\"],null],[33,[\\\"if\\\"],[[28,[\\\"isLoading\\\"]],\\\" loading\\\"],null]]]],[16,\\\"placeholder\\\",[34,[[33,[\\\"t\\\"],[\\\"chat.statusPlaceholder\\\"],null]]]],[16,\\\"maxlength\\\",[34,[[26,[\\\"maxLength\\\"]]]]],[16,\\\"onkeyup\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeStatusEventually\\\"],null],null],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeStatus\\\"],null],null],[16,\\\"value\\\",[34,[[26,[\\\"status\\\"]]]]],[15,\\\"aria-labelledby\\\",\\\"statusPlaceHolderLabel\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"flair-container\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"flair\\\"],[[28,[\\\"entity\\\",\\\"chatStatus\\\"]]],[[\\\"hideIfText\\\"],[true]]],true],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showPlaceholder\\\"]],[33,[\\\"not\\\"],[[28,[\\\"entity\\\",\\\"chatStatus\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"status-text placeholder\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"chat.statusPlaceholder\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"status-text\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"flair\\\"],[[28,[\\\"entity\\\",\\\"chatStatus\\\"]]],null],true],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[28,[\\\"onProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"icon-quote-right\\\"],[15,\\\"icon-name\\\",\\\"legacy/quote-right\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-status/template.hbs\"}});","define(\"connections-ui/components/entity-v2/activity-indicator/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/activity-indicator/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/contact-group/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/contact-group/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/favorite/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/favorite/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/hover-card/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/hover-card/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/image/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/image/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/location/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/location/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/presence-indicator-dot/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/presence-indicator-dot/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/presence-label/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/presence-label/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/presence-selector-dropdown/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/presence-selector-dropdown/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { rerunLayouts } from 'connections-ui/utils/masonry';\n\nvar ExpanderPluginComponent = Ember.Component.extend({\n    tagName: 'div',\n    classNames: ['expander'],\n\n    intl: Ember.inject.service(),\n\n    init: function () {\n        this._super();\n    },\n\n    addBehavior: Ember.on('didInsertElement', function () {\n        const intl = this.get('intl');\n        var expandText = intl.lookup('common.more').toString().toLowerCase();\n        var collapseText = intl.lookup('common.less').toString().toLowerCase();\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            var $el = this.$();\n            if ($el) {\n                $el.expander({\n                    expandText: expandText + ' &raquo;',\n                    userCollapseText: '&laquo; ' + collapseText,\n                    afterExpand: rerunLayouts,\n                    afterCollapse: rerunLayouts\n                });\n            }\n        });\n    }),\n\n    removeBehavior: Ember.on('willDestroyElement', function () {\n        this.$().expander('destroy');\n    })\n});\nexport default ExpanderPluginComponent;\n","export default Ember.HTMLBars.template({\"id\":\"+M2hHWWk\",\"block\":\"{\\\"statements\\\":[[18,\\\"default\\\"]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/expander-plugin/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from '../../utils/dates';\n\nconst { on, inject, computed, observer } = Ember;\n\nexport default Ember.Component.extend({\n    classNameBindings: ['field.customLabels:custom-label', 'editing', ':label-component'],\n\n    intl: inject.service(),\n\n    field: null,\n    entry: null,\n    entity: null,\n\n    editing: false,\n    isEmpty: false,\n    fallbackToEmpty: true,\n    showHistoryYearRange: true,\n    showInstructionText: true,\n\n    choices: null,\n    choicesHidden: true,\n\n    customLabelText: null,\n\n    attributeBindings: ['for'],\n\n    for: null,\n\n    actions: {\n        toggleChoicesView: function () {\n            this.toggleProperty('choicesHidden');\n        },\n\n        selectChoice: function (id) {\n            this.set('entry.labelKey', id);\n            this.set('customLabelText', null);\n            this.set('choicesHidden', true);\n        }\n    },\n\n    setupCustomLabelText: on('init', function () {\n        if (this.hasCustomLabelKey()) {\n            this.set('customLabelText', this.get('entry.labelKey'));\n        }\n    }),\n\n    canEdit: computed('editing', 'writeable', 'writeable.isFulfilled', function () {\n        const editing = this.get('editing');\n        const writeable = this.get('writeable');\n        if (writeable && typeof writeable === 'object') {\n            return editing && writeable.content;\n        }\n        return editing && writeable;\n    }),\n\n    label: computed('entry.labelKey', 'editing', 'entry.{value.startDate.year,value.endDate.year}', function () {\n        // isEmpty is set by the display-field.hbs template\n        if (this.get('isEmpty')) {\n            return this.get('field.i18nLabel');\n        }\n\n        if (!this.get('editing')) {\n            if (this.get('field.type') === 'history' && this.get('showHistoryYearRange')) {\n                return this.labelForHistoryField();\n            }\n        }\n\n        var baseKey = this.get('field').getI18nKey();\n        var labelKey = this.get('entry.labelKey');\n\n        // A custom label is not configured for this field.\n        // Or custom labels are in use, but no label key is found, then this is a label key for an empty value.\n        // Or group link field\n        if (!this.get('field.customLabels') || !labelKey || this.get('field.fieldPath') === 'general.links') {\n            return this.get('field.i18nLabel');\n        }\n\n        var key = `${baseKey}_labelKey_${labelKey}`;\n\n        // If there is a translation for the custom label key, use it.\n        if (!this.hasCustomLabelKey()) {\n            return this.get('intl').lookup(key).toString();\n        }\n\n        // Otherwise return the label key as it was typed in.\n        return labelKey;\n    }),\n\n    customLabels: computed('field.{customLabels,fieldPath}', 'isEmpty', function () {\n        return (\n            this.get('field.customLabels') && !this.get('isEmpty') && this.get('field.fieldPath') !== 'general.links'\n        );\n    }),\n\n    labelChoices: computed('entry', function () {\n        var baseKey = this.get('field').getI18nKey();\n        return _.map(this.get('field.labelKeys'), labelKey => {\n            return {\n                id: labelKey,\n                label: this.get('intl').lookup(`${baseKey}_labelKey_${labelKey}`).toString()\n            };\n        });\n    }),\n\n    instructionText: computed('field.instructionText', function () {\n        let field = this.get('field').getI18nKey();\n        let key = `${field}_instructionText`;\n\n        const intl = this.get('intl');\n\n        if (intl.query(key)) {\n            return intl.lookup(key).toString();\n        } else {\n            return this.get('field.instructionText');\n        }\n    }),\n\n    _placeholder: computed(function () {\n        return this.get('intl').lookup('common.label').toString();\n    }),\n\n    customLabelTextChanged: observer('customLabelText', function () {\n        let label = this.get('customLabelText');\n        let entry = this.get('entry');\n        if (!entry) {\n            return;\n        }\n\n        if (label) {\n            this.set('entry.labelKey', label);\n        } else if (_.isEmpty(this.get('labelChoices'))) {\n            this.set('entry.labelKey', '');\n        } else {\n            this.set('entry.labelKey', this.get('labelChoices')[0].id);\n        }\n    }),\n\n    attachClickListener: on('didInsertElement', function () {\n        var clickId = this.get('elementId');\n        Ember.$(document).on('click.' + clickId, event => {\n            Ember.run(() => {\n                var pickerParent = $(event.target).parents('.picker'),\n                    containerParent = $(event.target).parents(`#${clickId}`);\n                if (!pickerParent.length || !containerParent.length) {\n                    this.set('choicesHidden', true);\n                }\n            });\n        });\n    }),\n\n    attachTooltip: on('didInsertElement', function () {\n        if (this.get('instructionText') && this.get('showInstructionText')) {\n            this.$('.picker .btn').tooltip({\n                html: true,\n                title: () => {\n                    return this.get('instructionText');\n                },\n                placement: 'right',\n                trigger: 'hover'\n            });\n        }\n    }),\n\n    removeClickListener: on('willDestroyElement', function () {\n        Ember.$(document).off(`.${this.get('elementId')}`);\n        this.$('i.instruction-text').tooltip('destroy');\n    }),\n\n    keyPress(event) {\n        if (this.$('input').is(':focus') && event.keyCode === 13) {\n            this.set('customLabelText', this.get('customLabelText'));\n            this.send('toggleChoicesView');\n        }\n    },\n\n    // Returned from label computed above if the label is a history field. Label is not like a form label here.\n    // It's the value of the thing from entry.value\n    labelForHistoryField() {\n        moment.locale(this.get('intl.isoLocale'));\n        var startDate = this.get('entry.value.startDate');\n        var endDate = this.get('entry.value.endDate');\n\n        if (_.isEmpty(startDate) && _.isEmpty(endDate)) {\n            if (this.get('fallbackToEmpty')) {\n                return '';\n            }\n            return this.get('field.i18nLabel');\n        }\n\n        var hasStartDate = Ember.get(startDate, 'year');\n        var hasEndDate = endDate ? Ember.get(endDate, 'year') : false;\n\n        if (!hasStartDate && !hasEndDate) {\n            return this.get('field.i18nLabel');\n        }\n\n        let now = moment();\n        const regex = /DD\\W|\\WDD/g;\n        let localeFormat = now._locale._longDateFormat.L;\n        localeFormat = localeFormat.replace(/MM/, 'M');\n        let monthYearLocaleFormat = localeFormat.replace(regex, '');\n\n        var monthYearFmt = monthYearLocaleFormat; // cannot hardcode this to a particular format because then we can't adjust based on locale\n        var yearFmt = 'YYYY';\n\n        var startDateFmt = yearFmt;\n        var endDateFmt = yearFmt;\n\n        if (hasStartDate && startDate.month) {\n            startDate = _.clone(startDate);\n            startDate.month = startDate.month - 1;\n            startDateFmt = monthYearFmt;\n        } else if (hasStartDate) {\n            startDate = _.clone(startDate);\n            startDate.month = 0;\n        }\n\n        if (hasEndDate && endDate.month) {\n            endDate = _.clone(endDate);\n            endDate.month = endDate.month - 1;\n            endDateFmt = monthYearFmt;\n        } else if (hasStartDate && hasEndDate) {\n            endDate = _.clone(endDate);\n            endDate.month = new Date().getMonth();\n        }\n\n        var result;\n        if (!startDate && endDate) {\n            result = moment(endDate).format(endDateFmt);\n        } else {\n            var mStartDate = moment(startDate);\n            var mEndDate = endDate ? moment(endDate) : moment();\n            if (endDate && endDate.month) {\n                mEndDate = mEndDate.endOf('month');\n            }\n\n            var difference = mEndDate.diff(mStartDate);\n            var duration = moment.duration(difference).humanize();\n\n            let placeholder = this.get('intl').lookup('entity.fieldTypes.history.toPlaceholder');\n            let formattedStartDate = mStartDate.format(startDateFmt);\n            let formattedEndDate = hasEndDate ? mEndDate.format(endDateFmt) : placeholder.toString();\n            result = `${formattedStartDate}&ndash;${formattedEndDate}<div class=\"duration label label-default\">${duration}</div>`;\n        }\n\n        return Ember.String.htmlSafe(result);\n    },\n\n    hasCustomLabelKey() {\n        var baseKey = this.get('field').getI18nKey();\n        var labelKey = this.get('entry.labelKey');\n        return !this.get('intl').query(`${baseKey}_labelKey_${labelKey}`);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"/KPHo3IT\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"customLabels\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"writeable\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"picker custom-labels is-editing\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current-entry btn btn-default\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleChoicesView\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[13],[1,[26,[\\\"label\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-arrow-down-b\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"choicesHidden\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"choices list-unstyled\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"li\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-choice\\\"]]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.labels.customLabel\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"placeholder\\\",\\\"classNames\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-choice\\\"],null],[28,[\\\"customLabelText\\\"]],[28,[\\\"_placeholder\\\"]],\\\"form-control\\\"]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"labelChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"li\\\",[]],[16,\\\"id\\\",[28,[\\\"choice\\\",\\\"id\\\"]],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectChoice\\\",[28,[\\\"choice\\\",\\\"id\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"choice\\\",\\\"label\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"choice\\\"]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"custom-labels not-editing\\\"],[16,\\\"for\\\",[26,[\\\"for\\\"]],null],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"label\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"no-custom-labels\\\"],[16,\\\"for\\\",[26,[\\\"for\\\"]],null],[13],[0,\\\"\\\\n        \\\"],[1,[26,[\\\"label\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/field-label/template.hbs\"}});","define(\"connections-ui/components/fixtable-column-header\", [\"exports\", \"fixtable-ember/components/fixtable-column-header\"], function (_exports, _fixtableColumnHeader) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableColumnHeader.default;\n    }\n  });\n});\n","define(\"connections-ui/components/fixtable-column-label\", [\"exports\", \"fixtable-ember/components/fixtable-column-label\"], function (_exports, _fixtableColumnLabel) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableColumnLabel.default;\n    }\n  });\n});\n","define(\"connections-ui/components/fixtable-empty-state\", [\"exports\", \"fixtable-ember/components/fixtable-empty-state\"], function (_exports, _fixtableEmptyState) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableEmptyState.default;\n    }\n  });\n});\n","define(\"connections-ui/components/fixtable-footer\", [\"exports\", \"fixtable-ember/components/fixtable-footer\"], function (_exports, _fixtableFooter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableFooter.default;\n    }\n  });\n});\n","import FixtableGrid from 'fixtable-ember/components/fixtable-grid';\n\nexport default FixtableGrid.extend({\n    classNames: ['fixtable-grid']\n});\n","define(\"connections-ui/components/fixtable-row-toggle\", [\"exports\", \"fixtable-ember/components/fixtable-row-toggle\"], function (_exports, _fixtableRowToggle) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableRowToggle.default;\n    }\n  });\n});\n","define(\"connections-ui/components/fixtable-row\", [\"exports\", \"fixtable-ember/components/fixtable-row\"], function (_exports, _fixtableRow) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableRow.default;\n    }\n  });\n});\n","define(\"connections-ui/components/flashy-webrtc-troubleshooter/component\", [\"exports\", \"webrtc-troubleshoot/components/flashy-webrtc-troubleshooter/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { on, inject, computed, observer, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['floorplan-editor'],\n\n    store: inject.service('store'),\n    session: inject.service(),\n\n    entity: null,\n    fieldData: null,\n    field: null,\n\n    location: null,\n    parentLocation: null,\n\n    editing: true,\n\n    saveLocation: () => {},\n\n    coordinates: {},\n    coordinatesRatio: {},\n\n    type: 'edit',\n\n    selectFloorplan: true,\n\n    entry: computed.alias('fieldData.value'),\n\n    actions: {\n        setCurrentFloor(floor) {\n            let entry = this.get('entry');\n\n            let data = {\n                coordinates: {},\n                locationId: floor.get('id'),\n                notes: ''\n            };\n\n            let floorplans = floor.get('floorplanImages');\n            floorplans = floor.get('floorplanImage');\n            if (floorplans) {\n                data.coordinates = {\n                    x: 0,\n                    y: 0\n                };\n            }\n\n            Ember.set(entry, 'value', data);\n\n            let currentLocation = this.get('location');\n            let floors = this.get('floors');\n\n            this.set('location', floor);\n            this.send('showFloorplan');\n\n            if (currentLocation.get('isFloor')) {\n                floors.addObject(currentLocation);\n            }\n\n            floors.removeObject(floor);\n\n            floors = floors.sortBy('name');\n            this.set('floors', floors);\n        },\n\n        showFloorplan() {\n            if (this.get('floorplanImageUrl')) {\n                this.set('selectFloorplan', true);\n            }\n        },\n\n        saveFloorplan() {},\n\n        closeFloorplan: function () {\n            this.set('selectFloorplan', false);\n        }\n    },\n\n    loadInitialPinLocation: on('didRender', function () {\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            let coordinates = this.get('entry.value.coordinates');\n            let img = this.$('.floorplan-image img');\n            if (!img) {\n                return;\n            }\n\n            img.one('load', () => {\n                let coords = this.getRatioCoordinates(coordinates, img[0], function (a, b) {\n                    return a * b;\n                });\n\n                this.attachPinForXY(coords.x, coords.y);\n            });\n        });\n    }),\n\n    floorplanImageUrl: computed('location.floorplanImage', function () {\n        let images = this.get('location.floorplanImage');\n        if (images && images.length > 0) {\n            let image = images.find(image => image.resolution === 'x800');\n            if (image) {\n                return image.imageUri;\n            }\n        }\n\n        return undefined;\n    }),\n\n    showFloorplan: computed('floorplanImageUrl', 'selectFloorplan', function () {\n        return this.get('floorplanImageUrl') && this.get('selectFloorplan');\n    }),\n\n    floors: computed('location.floors.[]', 'parentLocation.floors.[]', 'location.{id,isFloor}', function () {\n        let locationFloors = this.get('location.floors');\n        let parentFloors = this.get('parentLocation.floors');\n        let floors = [];\n        if (locationFloors && locationFloors.length > 0) {\n            floors = locationFloors;\n        }\n        if (parentFloors && parentFloors.length > 0) {\n            floors = parentFloors;\n        }\n        // Remove yourself\n        if (this.get('location.isFloor') && floors.length > 0) {\n            floors = floors.filter(floor => floor.get('id') !== this.get('location.id'));\n        }\n        return floors;\n    }),\n\n    loadFloors() {\n        return;\n    },\n\n    updateCoordinatesRatio: observer('coordinates', function () {\n        let coordinates = this.get('coordinates');\n        if (!!coordinates) {\n            let img = this.$('.floorplan-image img')[0];\n            let coords = this.getRatioCoordinates(coordinates, img, function (a, b) {\n                return a / b;\n            });\n\n            if (img) {\n                this.set('coordinatesRatio', {\n                    x: coords.x,\n                    y: coords.y\n                });\n            }\n        } else {\n            this.set('coordinatesRatio', {});\n        }\n    }),\n\n    updateCoordinatesOnLocation: observer('coordinatesRatio', function () {\n        let ratio = this.get('coordinatesRatio');\n        let entry = this.get('entry');\n\n        let value = entry.value;\n        value.coordinates = ratio;\n\n        Ember.set(entry, 'value', value);\n    }),\n\n    click(event) {\n        let target = Ember.$(event.target);\n\n        if (target.parent().is('.floorplan-image') && target.is('img') && this.get('editing')) {\n            let x = event.offsetX || event.clientX - $(event.target).offset().left + window.pageXOffset;\n            let y = event.offsetY || event.clientY - $(event.target).offset().top + window.pageYOffset;\n\n            this.attachPinForXY(x, y);\n\n            this.set('coordinates', {\n                x: x,\n                y: y\n            });\n        }\n    },\n\n    getRatioCoordinates(coordinates, image, operation) {\n        if (!image) {\n            return { x: 0, y: 0 };\n        }\n\n        let naturalHeight = image.naturalHeight;\n        let naturalWidth = image.naturalWidth;\n        let heightDiff = naturalHeight - image.height;\n        let widthDiff = naturalWidth - image.width;\n\n        let x = operation(coordinates.x, naturalWidth - widthDiff);\n        let y = operation(coordinates.y, naturalHeight - heightDiff);\n\n        return { x: x, y: y };\n    },\n\n    attachPinForXY(x, y) {\n        let icon = $('<i class=\"pin pc pc-location\"></i><i class=\"pin shadow pc pc-location\"></i>').css({\n            position: 'absolute',\n            left: x - 12,\n            top: y - 12\n        });\n\n        let currentPin = this.$('i.pin');\n        if (currentPin) {\n            this.$('i.pc-location').remove();\n        }\n\n        const image = this.$('.floorplan-image');\n        if (image) {\n            image.append(icon);\n        }\n    },\n\n    floorSorter(a, b) {\n        let init = [a.get('name'), b.get('name')];\n        let sorted = init.sort();\n        if (sorted[0] === a.get('name')) {\n            return 1;\n        } else {\n            return -1;\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"xheP5PK6\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"locations\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"h3\\\",[]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"locations.floors\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"location\\\",\\\"isFloor\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location-content\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current-location\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"location-display\\\"],null,[[\\\"entity\\\",\\\"location\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"location\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"floors\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location-content clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"setCurrentFloor\\\",[28,[\\\"floor\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"location-display\\\"],null,[[\\\"entity\\\",\\\"location\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"floor\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"floor\\\"]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showFloorplan\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"floorplan-detail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"heading\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"h4\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"locations.selectOffice\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"floorplan-image\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[33,[\\\"t\\\"],[\\\"images.userSubmitted\\\"],null],null],[16,\\\"src\\\",[26,[\\\"floorplanImageUrl\\\"]],null],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"floorplan-detail\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"empty\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"locations.noFloorplan\\\"],null],false],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/floorplan-editor/template.hbs\"}});","import Ember from 'ember';\nimport Popper from 'popper.js';\n\nconst { on, Component, run } = Ember;\n\nexport default Component.extend({\n    classNames: ['floorplan-popover'],\n    classNameBindings: ['show::hide'],\n\n    show: false,\n    attachmentId: '',\n    hidePopover: () => {},\n\n    tetherConstraints: {\n        pin: ['left', 'right']\n    },\n\n    didUpdateAttrs() {\n        this._super(...arguments);\n\n        const show = this.get('show');\n        if (show) {\n            run.scheduleOnce('afterRender', this, this._createPopper);\n        } else {\n            run.scheduleOnce('afterRender', this, this._destroyPopper);\n        }\n    },\n\n    _destroyPopper() {\n        if (!this._popper) {\n            return;\n        }\n        this._popper.destroy();\n        this._popper = null;\n    },\n\n    _createPopper() {\n        if (this._popper) {\n            return;\n        }\n\n        const targetEl = document.querySelector(`#${this.get('attachmentId')}`);\n        const popoverEl = this.element;\n        if (!targetEl || !popoverEl) {\n            return;\n        }\n\n        this._popper = new Popper(targetEl, popoverEl, {\n            placement: 'bottom',\n            modifiers: {\n                flip: {\n                    behavior: ['bottom', 'top', 'left']\n                },\n                preventOverflow: {\n                    padding: 1\n                }\n            }\n        });\n\n        run.later(() => {\n            this.$('img').on(\n                'load',\n                Ember.run.bind(this, () => {\n                    if (this._popper) {\n                        this._popper.scheduleUpdate();\n                    }\n                })\n            );\n        }, 10);\n    },\n\n    attachClickHandler: on('didInsertElement', function () {\n        Ember.$(document).on(\n            `click.${this.get('elementId')}`,\n            Ember.run.bind(this, event => {\n                if (!this.get('show')) {\n                    return;\n                }\n\n                let target = Ember.$(event.target);\n\n                if (\n                    target.parents('.floorplan-action').length ||\n                    target.parents('.floorplan-popover').length ||\n                    target.parent('.location-name').length ||\n                    target.parent('.mini-card-component-wrapper').length\n                ) {\n                    return;\n                } else {\n                    this.get('hidePopover')();\n                }\n            })\n        );\n    }),\n\n    removeHandlers: on('willDestroyElement', function () {\n        Ember.$(document).off(`.${this.get('elementId')}`);\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"j0uG/gql\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"show\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"popover-content\\\"],[13],[0,\\\"\\\\n        \\\"],[18,\\\"default\\\"],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/floorplan-popover/template.hbs\"}});","define(\"connections-ui/components/font-icon/component\", [\"exports\", \"ember-purecloud-components/components/font-icon/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\n\nconst AUDIO_FORMAT = BrowserUtils.getSuggestedAudioTypeFrom(['webm', 'wav']);\n\nfunction isOggFileType(file) {\n    return new Ember.RSVP.Promise((resolve, reject) => {\n        const fileReader = new FileReader();\n        fileReader.onloadend = function (e) {\n            const arr = new window.Uint8Array(e.target.result);\n\n            const isOpus =\n                arr[28] === 0x4f &&\n                arr[29] === 0x70 &&\n                arr[30] === 0x75 &&\n                arr[31] === 0x73 &&\n                arr[32] === 0x48 &&\n                arr[33] === 0x65 &&\n                arr[34] === 0x61 &&\n                arr[35] === 0x64;\n            const isWav =\n                arr[0] === 0x52 &&\n                arr[1] === 0x49 &&\n                arr[2] === 0x46 &&\n                arr[3] === 0x46 &&\n                arr[8] === 0x57 &&\n                arr[9] === 0x41 &&\n                arr[10] === 0x56 &&\n                arr[11] === 0x45;\n            const isAiff =\n                arr[0] === 0x46 &&\n                arr[1] === 0x4f &&\n                arr[2] === 0x52 &&\n                arr[3] === 0x4d &&\n                arr[8] === 0x41 &&\n                arr[9] === 0x49 &&\n                arr[10] === 0x46 &&\n                arr[11] === 0x46;\n\n            // Only support opus encodings, not vorbis\n            // Support WAV and AIFF as well\n            // See: https://github.com/sindresorhus/file-type\n            if (isOpus || isWav || isAiff) {\n                resolve('opus');\n            } else {\n                reject(false);\n            }\n        };\n        fileReader.readAsArrayBuffer(file);\n    });\n}\n\nlet GroupContactModalComponent = Ember.Component.extend({\n    classNames: ['group-contact-form'],\n    classNameBindings: ['group-ring-voicemail'],\n\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    phone: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n\n    entity: Ember.computed.reads('model'),\n\n    attrs: {\n        close: () => {},\n        disableModal: () => {}\n    },\n\n    saveContactInfo: () => {},\n\n    number: null,\n    extension: null,\n    originalExtension: null,\n\n    voicemailFile: null,\n    showVoicemailOptions: false,\n    // ^^^ This corresponds to `toggleShowVoicemailGreetingOptions` in `group-profile/group-contact-panel/*`.\n\n    resetGreeting: false,\n\n    rotateCallSecondsError: false,\n    numberOfRotationsError: false,\n\n    actions: {\n        saveForm() {\n            this.saveContactInfo();\n        },\n\n        updateNumber(event) {\n            this.set('number', event.target.value);\n        },\n\n        updateExtension(event) {\n            this.set('extension', event.target.value);\n        },\n\n        updateRotateCalls(value) {\n            const number = parseInt(value, 10);\n            if (typeof number === 'number') {\n                this.set('rotateCallSeconds', number);\n            }\n        },\n\n        updateRotations(value) {\n            const number = parseInt(value, 10);\n            if (typeof number === 'number') {\n                this.set('numberOfRotations', number);\n            }\n        },\n\n        toggleVoicemail() {\n            this.toggleProperty('voicemailOn');\n        },\n\n        toggleEmailNotification() {\n            this.toggleProperty('emailNotificationOn');\n        },\n\n        toggleOptions() {\n            this.toggleProperty('showVoicemailOptions');\n        },\n        // ^^^ This corresponds to `toggleShowVoicemailGreetingOptions` in `group-profile/group-contact-panel/*`.\n\n        cancel() {\n            this.attrs.close();\n        },\n\n        selectVoicemailFile(file, recording) {\n            if (recording) {\n                this.set('recordingFile', file);\n                this.set('voicemailFile', null);\n            } else {\n                this.set('voicemailFile', file);\n                this.set('recordingFile', null);\n            }\n        },\n\n        triggerUpload() {\n            if (this.get('hasGreeting')) {\n                return;\n            }\n\n            this.$('input.file-upload').trigger('click');\n        },\n\n        chooseFile() {\n            const input = this.$('input.file-upload');\n            const file = Ember.get(input[0], 'files.0') || [];\n\n            if (file) {\n                isOggFileType(file)\n                    .then(format => {\n                        Ember.Logger.info('Voicemail: Correct file type', format);\n                        this.send('selectVoicemailFile', file, false);\n                    })\n                    .catch(() => {\n                        const title = this.get('intl').lookup('notification.group.fileUpload.title');\n                        const message = this.get('intl').lookup('notification.group.fileUpload.message');\n                        this.get('notification').error(title, message);\n                    });\n            } else {\n                this.set('errorSelectingFile', true);\n            }\n\n            this.set('showVoicemailOptions', false);\n        },\n\n        recordingReady(file) {\n            this.send('selectVoicemailFile', file, true);\n\n            this.set('resetGreeting', false);\n        },\n\n        resetRecording() {\n            this.set('recordingFile', null);\n        },\n\n        resetFile() {\n            this.set('voicemailFile', null);\n        },\n\n        resetCurrentGreeting() {\n            if (!this.get('hasGreeting')) {\n                this.send('resetFile');\n                this.send('resetRecording');\n            } else {\n                this.set('resetGreeting', true);\n                this.set('hasGreeting', false);\n            }\n\n            this.set('showVoicemailOptions', false);\n        },\n\n        audioPlayerError() {\n            this.set('hasGreeting', false);\n        },\n\n        disableModal(key, value) {\n            this.set(key, value);\n            this.attrs.disableModal(value);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.set('saveContactInfo', this.save.bind(this));\n\n        Ember.run.scheduleOnce('afterRender', this, this.setupInput);\n        Ember.run.scheduleOnce('afterRender', this, this.initNumber);\n    },\n\n    numberOfRotations: Ember.computed('entity.numberOfRotations', 'entity.numberOfRotations.{content,isFulfilled}', {\n        get() {\n            return this.get('entity.numberOfRotations.content');\n        }\n    }),\n\n    rotateCallSeconds: Ember.computed('entity.rotateCallSeconds', 'entity.rotateCallSeconds.{content,isFulfilled}', {\n        get() {\n            return this.get('entity.rotateCallSeconds.content');\n        }\n    }),\n\n    _voicemailOn: false,\n    voicemailOn: Ember.computed(\n        'entity.voicemailEnabled',\n        'entity.voicemailEnabled.{content,isFulfilled}',\n        'editingVoicemailDisabled',\n        {\n            get() {\n                if (this.get('entity.isSaving')) {\n                    return this._voicemailOn;\n                }\n\n                if (this.get('editingVoicemailDisabled')) {\n                    this._voicemailOn = false;\n                    return false;\n                }\n\n                const value =\n                    this.get('entity.voicemailEnabled.isFulfilled') && this.get('entity.voicemailEnabled.content');\n\n                this._voicemailOn = value;\n                return value;\n            },\n\n            set(key, value) {\n                this._voicemailOn = value;\n\n                return value;\n            }\n        }\n    ),\n\n    emailNotificationOn: Ember.computed(\n        'entity.emailNotificationEnabled',\n        'entity.emailNotificationEnabled.{content,isFulfilled}',\n        {\n            get() {\n                return this.get('entity.emailNotificationEnabled');\n            },\n\n            set(key, value) {\n                return value;\n            }\n        }\n    ),\n\n    haveExtensionError: Ember.computed('entity.number.rel.errorCode', 'extension', 'originalExtension', function () {\n        const extension = this.get('extension');\n        const originalExtension = this.get('originalExtension');\n\n        if ((originalExtension && extension !== originalExtension) || this.get('entity.isSaving')) {\n            return false;\n        }\n\n        return !!this.get('entity.number.rel.errorCode');\n    }),\n\n    isExtensionResourceInUse: Ember.computed('haveExtensionError', function () {\n        if (!this.get('haveExtensionError')) {\n            return false;\n        }\n\n        const code = this.get('entity.number.rel.errorCode');\n        return code === 'RESOURCE_ALREADY_IN_USE';\n    }),\n\n    isExtensionNotInPool: Ember.computed('haveExtensionError', function () {\n        if (!this.get('haveExtensionError')) {\n            return false;\n        }\n\n        const code = this.get('entity.number.rel.errorCode');\n        return code === 'EXTENSION_MUST_BE_ASSGINED_TO_AN_EXTENSION_POOL';\n    }),\n\n    editingVoicemailDisabled: Ember.computed('isEmpty', 'isValid', 'haveExtensionError', function () {\n        return this.get('isEmpty') || !this.get('isValid') || this.get('haveExtensionError');\n    }),\n\n    ringTimeMs: Ember.computed(\n        'rotateCallSeconds',\n        'numberOfRotations',\n        'numberOfRotationsError',\n        'rotateCallSecondsError',\n        function () {\n            const seconds = parseInt(this.get('rotateCallSeconds'), 10);\n            const rotations = parseInt(this.get('numberOfRotations'), 10);\n            const { numberOfRotationsError, rotateCallSecondsError } = this.getProperties(\n                'numberOfRotationsError',\n                'rotateCallSecondsError'\n            );\n            if (numberOfRotationsError || rotateCallSecondsError) {\n                return null;\n            }\n\n            const total = seconds * rotations;\n            return total * 1000;\n        }\n    ),\n\n    isValid: Ember.computed(\n        'invalidExtension',\n        'invalidPhoneNumber',\n        'haveNumberAndExtension',\n        'number',\n        'extension',\n        function () {\n            const number = this.get('number');\n            const ext = this.get('extension');\n\n            if (_.isEmpty(number) && _.isEmpty(ext)) {\n                return true;\n            }\n\n            if (this.get('haveNumberAndExtension')) {\n                return false;\n            }\n\n            if (!number) {\n                return !this.get('invalidExtension');\n            }\n\n            return !this.get('invalidPhoneNumber');\n        }\n    ),\n\n    isInvalid: Ember.computed.not('isValid'),\n\n    errorMessage: Ember.computed('isValid', function () {\n        if (this.get('invalidExtension')) {\n            return this.get('intl').lookup('purecloud.callForwarding.invalidExtension').toString();\n        } else if (this.get('invalidPhoneNumber')) {\n            return this.get('intl').lookup('purecloud.callForwarding.invalidPhoneNumber').toString();\n        } else if (this.get('haveNumberAndExtension')) {\n            return this.get('intl').lookup('purecloud.callForwarding.numberAndExtension').toString();\n        }\n    }),\n\n    invalidExtension: Ember.computed('extension', 'haveNumberAndExtension', function () {\n        const ext = this.get('extension');\n        const regex = /^\\d+$/; // simple regex test, not meant to be expansive\n        if (!this.get('number') && !_.isEmpty(ext)) {\n            return !regex.test(ext);\n        }\n        return false;\n    }),\n\n    invalidPhoneNumber: Ember.computed('number', function () {\n        const elem = this.$('.group-ring-phone-input');\n        if (elem) {\n            return !this.$('.group-ring-phone-input').intlTelInput('isValidNumber');\n        }\n        return false;\n    }),\n\n    isEmpty: Ember.computed('number', 'extension', function () {\n        const number = this.get('number');\n        const extension = this.get('extension');\n        return _.isEmpty(number) && _.isEmpty(extension);\n    }),\n\n    haveNumberAndExtension: Ember.computed('number', 'extension', function () {\n        const number = this.get('number');\n        const extension = this.get('extension');\n        return !_.isEmpty(number) && !_.isEmpty(extension);\n    }),\n\n    callNotice: Ember.computed(function () {\n        return this.get('intl').lookup('groups.modal.groupRingNotice').toString();\n    }),\n\n    showGroupEmail: Ember.computed(function () {\n        return false; // maybe true in the future...\n    }),\n\n    playerOptions: Ember.computed(function () {\n        return {\n            html5: true,\n            volume: 0.5,\n            format: ['ogg']\n        };\n    }),\n\n    greetingOptions: Ember.computed(function () {\n        // greetings seem to have a low volume\n        return {\n            html5: true,\n            volume: 1.0,\n            format: [AUDIO_FORMAT]\n        };\n    }),\n\n    hasGreeting: Ember.computed('entity.greeting.isFulfilled', function () {\n        const greeting = this.get('entity.greeting.content');\n        return !!greeting;\n    }),\n\n    greetingAudioSource: Ember.computed('entity.greeting.isFulfilled', function () {\n        const greeting = this.get('entity.greeting');\n        return greeting\n            .then(data => {\n                let path = data.audioFile.selfUri;\n                if (_.head(path) === '/') {\n                    path = path.substring(1);\n                }\n                const url = this.get('application').pcV2Uri(path);\n                return this.get('ajax').request(url, {\n                    data: { formatId: AUDIO_FORMAT }\n                });\n            })\n            .then(data => {\n                return data.mediaFileUri;\n            })\n            .catch(() => {\n                this.get('logger').error('Error loading media for group:', {\n                    groupId: this.get('entity.guid')\n                });\n                this.set('hasGreeting', false);\n            });\n    }),\n\n    showEmailNotification: Ember.computed.not('session.org.hasHipaaEnabled'),\n    // ^^^ This corresponds to `emailNotifications.show` in `group-profile/group-contact-panel/*`.\n\n    setConfirmDisabled: Ember.observer('isValid', function () {\n        this.attrs.disableModal(!this.get('isValid'));\n    }),\n\n    setupInput() {\n        this.$('.group-ring-phone-input').intlTelInput({\n            nationalMode: false,\n            utilsScript: `${this.get('application.urlprefix')}assets/intltelinput/utils.js`\n        });\n    },\n\n    initNumber() {\n        const info = this.get('entity.contactInfo.groupNumber.firstObject.value');\n        const inputElem = this.$('.group-ring-phone-input');\n        const extElem = this.$('.group-ring-extension-input');\n\n        if (!_.isEmpty(this.get('entity.contactInfo.groupNumber'))) {\n            if (_.isEmpty(inputElem.intlTelInput('getNumber'))) {\n                inputElem.intlTelInput('setNumber', info.number);\n            }\n\n            if (_.isEmpty(extElem.val())) {\n                extElem.val(info.extension);\n            }\n\n            this.set('number', info.number);\n            this.set('extension', info.extension);\n\n            this.set('originalExtension', info.extension);\n        }\n    },\n\n    uploadGreeting(file) {\n        if (!file) {\n            return Ember.RSVP.resolve({});\n        }\n\n        const uploadPath = `${this.get('application.purecloudAppsUri')}uploads/v2/greetings`;\n        const data = new FormData();\n        data.append('file', file);\n        data.append('ownerType', 'group');\n        data.append('ownerId', this.get('entity.guid'));\n        data.append('name', 'voicemail');\n        data.append('greetingType', 'voicemail');\n\n        return new Ember.RSVP.Promise((resolve, reject) => {\n            const xhr = new XMLHttpRequest();\n            xhr.open('POST', uploadPath, true);\n            xhr.setRequestHeader('Authorization', `bearer ${this.get('session.accessToken')}`);\n            xhr.onreadystatechange = () => {\n                // Can't use XMLHttpRequest.DONE cause Pace, so we have to use the instance property\n                if (xhr.readyState === xhr.DONE) {\n                    this.uploadComplete(xhr, resolve, reject);\n                }\n            };\n            xhr.send(data);\n        });\n    },\n\n    uploadComplete(xhr, resolve, reject) {\n        const { responseText, status } = xhr;\n        const data = JSON.parse(responseText);\n        if (status === 200) {\n            this.get('logger').info('Successful voicemail greeting upload', data.correlationId);\n            resolve(data);\n        } else {\n            this.get('logger').error('Error uploading voicemail file:', { error: responseText });\n            reject(data);\n        }\n    },\n\n    save() {\n        const entity = this.get('entity');\n        const ajax = this.get('ajax');\n        const notification = this.get('notification');\n        const application = this.get('application');\n\n        const { voicemailOn, numberOfRotations, rotateCallSeconds, emailNotificationOn } = this.getProperties(\n            'voicemailOn',\n            'numberOfRotations',\n            'rotateCallSeconds',\n            'emailNotificationOn'\n        );\n\n        this.setNumberData();\n\n        const promise = entity.save();\n        let showExtensionErrorNotification = false;\n\n        // Reset since we are saving\n        this.set('originalExtension', null);\n\n        promise\n            .then(() => {\n                const haveError = !!entity.get('number.rel.errorCode');\n\n                if (!this.get('isEmpty') && !haveError) {\n                    return entity.get('policy').then(policy => {\n                        policy.setProperties({\n                            enabled: voicemailOn,\n                            rotateCallsSecs: rotateCallSeconds,\n                            stopRingingAfterRotations: numberOfRotations,\n                            sendEmailNotifications: emailNotificationOn\n                        });\n                        return policy.save();\n                    });\n                }\n\n                showExtensionErrorNotification = haveError;\n            })\n            .then(() => {\n                const resetGreeting = this.get('resetGreeting');\n                if (resetGreeting) {\n                    return this.get('entity.greeting').then(greeting => {\n                        let path = greeting.selfUri;\n                        if (_.head(path) === '/') {\n                            path = path.substring(1);\n                        }\n                        const url = application.pcV2Uri(path);\n                        return ajax.delete(url);\n                    });\n                } else {\n                    let file = this.get('recordingFile');\n                    if (!file) {\n                        file = this.get('voicemailFile');\n                    }\n\n                    return this.uploadGreeting(file);\n                }\n            })\n            .then(() => {\n                entity.notifyPropertyChange('greeting');\n            });\n\n        return promise\n            .then(() => {\n                let title = this.get('entity.name');\n                let message = this.get('intl').lookup('notification.group.general');\n                let handler = notification.info.bind(notification);\n\n                if (showExtensionErrorNotification) {\n                    handler = notification.error.bind(notification);\n\n                    const isExtensionResourceInUse = this.get('isExtensionResourceInUse');\n                    const isExtensionNotInPool = this.get('isExtensionNotInPool');\n\n                    if (isExtensionNotInPool) {\n                        title = this.get('intl').lookup('notification.group.extensionNotInPoolError.title');\n                        message = this.get('intl').lookup('notification.group.extensionNotInPoolError.message');\n                    } else if (isExtensionResourceInUse) {\n                        title = this.get('intl').lookup('notification.group.resourceInUseError.title');\n                        message = this.get('intl').lookup('notification.group.resourceInUseError.message');\n                    } else {\n                        title = this.get('intl').lookup('notification.group.groupRingExtensionError.title');\n                        message = this.get('intl').lookup('notification.group.groupRingExtensionError.message');\n                    }\n                }\n\n                handler(title, message, {\n                    icon: '',\n                    hideAfter: 8\n                });\n            })\n            .catch(err => {\n                const title = this.get('entity.name');\n                const message = this.get('intl').lookup('notification.group.saveError');\n                notification.error(title, message, {\n                    icon: '',\n                    hideAfter: 8\n                });\n\n                Ember.Logger.error(message, err);\n            })\n            .finally(() => {\n                this.attrs.close();\n                entity.reload();\n            });\n    },\n\n    setNumberData() {\n        var number = Ember.$('.group-ring-phone-input').intlTelInput('getNumber');\n        var extension = Ember.$('.group-ring-extension-input').val();\n\n        if (_.isEmpty(this.get('entity.contactInfo.groupNumber'))) {\n            if (_.isEmpty(this.get('entity.contactInfo'))) {\n                this.set('entity.contactInfo', {});\n            }\n\n            var valueData = {\n                number: '',\n                countryCode: '',\n                extension: '',\n                acceptsSMS: false\n            };\n\n            var emptyData = [\n                {\n                    value: valueData\n                }\n            ];\n\n            this.set('entity.contactInfo.groupNumber', emptyData);\n        }\n\n        this.set('entity.contactInfo.groupNumber.firstObject.value.number', number);\n        this.set('entity.contactInfo.groupNumber.firstObject.value.extension', extension);\n    }\n});\n\nexport default GroupContactModalComponent;\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport Component from 'ember-component';\nimport computed from 'ember-computed';\n\nconst { run } = Ember;\n\nexport default Component.extend({\n    classNames: ['inline-number-input'],\n    classNameBindings: ['disabled:input-disabled'],\n\n    attrs: {\n        update: () => {},\n        disableModal: () => {}\n    },\n\n    value: null,\n    disabled: false,\n\n    isValid: computed('value', function () {\n        const regex = /^[0-9]+$/g;\n        const value = this.get('value');\n        const number = parseInt(value, 10);\n\n        if (_.isEmpty(value)) {\n            return false;\n        }\n\n        return regex.test(value) && number > 0 && number < 100;\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        run.scheduleOnce('afterRender', this, () => this.$('input').val(this.get('value')));\n        run.scheduleOnce('afterRender', this, this.attachListeners);\n        run.scheduleOnce('afterRender', this, this.disableInput);\n    },\n\n    willRender() {\n        this._super(...arguments);\n\n        const input = this.$('input');\n        if (input) {\n            input.off();\n        }\n    },\n\n    didUpdateAttrs() {\n        this._super(...arguments);\n\n        run.scheduleOnce('afterRender', this, this.attachListeners);\n        run.scheduleOnce('afterRender', this, this.disableInput);\n        run.scheduleOnce('afterRender', this, this.setValue);\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n\n        this.$('input').off();\n    },\n\n    disableInput() {\n        const disabled = this.get('disabled');\n        this.$('input').attr('disabled', disabled);\n        this.set('disabled', disabled);\n    },\n\n    attachListeners() {\n        const input = this.$('input');\n\n        if (this.get('focused')) {\n            input.focus().val(input.val());\n        }\n\n        input.on('input', event => {\n            Ember.run(() => {\n                const value = event.target.value;\n                this.set('value', value);\n\n                this.attrs.disableModal(!this.get('isValid'));\n                this.attrs.update(value);\n            });\n        });\n\n        input.on('focus', () => {\n            Ember.run(() => this.set('focused', true));\n        });\n\n        input.on('blur', () => {\n            Ember.run(() => this.set('focused', false));\n        });\n    },\n\n    setValue() {\n        const input = this.$('input');\n        const value = this.get('value');\n        if (input && value) {\n            input.val(value);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"rA8lkHhw\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"t\\\"],[[28,[\\\"key\\\"]]],null],true]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-contact-modal/inline-number-input/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"drVs9k+g\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showGroupEmail\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-email contact-info-group\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"label\\\",[]],[15,\\\"for\\\",\\\"group-email\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.email\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"type\\\",\\\"email\\\"],[15,\\\"id\\\",\\\"group-email\\\"],[15,\\\"class\\\",\\\"form-control\\\"],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"groups.email\\\"],null],null],[16,\\\"value\\\",[26,[\\\"email\\\"]],null],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"group-number contact-info-group \\\",[33,[\\\"if\\\"],[[28,[\\\"isValid\\\"]],\\\"valid\\\",\\\"error\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"label\\\",[]],[15,\\\"for\\\",\\\"group-number\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.modal.groupRing\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"number phone-field\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"type\\\",\\\"tel\\\"],[15,\\\"id\\\",\\\"group-number\\\"],[15,\\\"class\\\",\\\"group-ring-phone-input form-control\\\"],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateNumber\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"class\\\",\\\"group-ring-extension-input form-control\\\"],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null],null],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateExtension\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"errorMessage\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"call-notice\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.modal.groupRingNotice\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"rotate-calls contact-info-group \\\",[33,[\\\"if\\\"],[[28,[\\\"rotateCallSecondsError\\\"]],\\\"error\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"label\\\",[]],[15,\\\"for\\\",\\\"rotate-calls\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.rotateCalls\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"rotateCallSeconds\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"group-contact-modal/inline-number-input\\\"],null,[[\\\"disabled\\\",\\\"key\\\",\\\"value\\\",\\\"update\\\",\\\"disableModal\\\"],[[33,[\\\"or\\\"],[[28,[\\\"isEmpty\\\"]],[28,[\\\"isInvalid\\\"]],[28,[\\\"haveExtensionError\\\"]]],null],\\\"groups.groupRing.everyNumberOfSeconds\\\",[28,[\\\"rotateCallSeconds\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"updateRotateCalls\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"disableModal\\\",\\\"rotateCallSecondsError\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"rotateCallSecondsError\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.invalidNumberError\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"ringing-time contact-info-group\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"label\\\",[]],[15,\\\"for\\\",\\\"ringing-time\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.stopRinging\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"numberOfRotations\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"group-contact-modal/inline-number-input\\\"],null,[[\\\"disabled\\\",\\\"key\\\",\\\"value\\\",\\\"update\\\",\\\"disableModal\\\"],[[33,[\\\"or\\\"],[[28,[\\\"isEmpty\\\"]],[28,[\\\"isInvalid\\\"]],[28,[\\\"haveExtensionError\\\"]]],null],\\\"groups.groupRing.afterNumberOfRotations\\\",[28,[\\\"numberOfRotations\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"updateRotations\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"disableModal\\\",\\\"numberOfRotationsError\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"numberOfRotationsError\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.invalidNumberError\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"ringTimeMs\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"max-ring-time\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.maxRingTime\\\"],[[\\\"time\\\"],[[33,[\\\"time-duration\\\"],null,[[\\\"durationInMs\\\"],[[28,[\\\"ringTimeMs\\\"]]]]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-voicemail contact-info-group\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"label\\\",[]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.station.voicemail\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"voicemailEnabled\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"voicemailOn\\\"]],[28,[\\\"editingVoicemailDisabled\\\"]],\\\"toggleVoicemail\\\"]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editingVoicemailDisabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"haveExtensionError\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isExtensionResourceInUse\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-warning\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.inUseError\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isExtensionNotInPool\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-warning\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.extensionError\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-warning\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.genericError\\\"],null],false],[0,\\\"\\\\n                        \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-warning\\\"],[13],[14],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.editingVoicemailDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"voicemailOn\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"voicemail-greeting contact-info-group\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"label\\\",[]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.greeting\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"greeting\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasGreeting\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"audio-player\\\"],null,[[\\\"source\\\",\\\"options\\\",\\\"onError\\\"],[[28,[\\\"greetingAudioSource\\\"]],[28,[\\\"greetingOptions\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"audioPlayerError\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"voicemailFile\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"file-name\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"voicemailFile\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"audio-recorder\\\"],null,[[\\\"file\\\",\\\"playerOptions\\\",\\\"audioFileReady\\\",\\\"reset\\\"],[[28,[\\\"recordingFile\\\"]],[28,[\\\"playerOptions\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"recordingReady\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"resetRecording\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"options-dropdown\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"drop-down\\\"],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[28,[\\\"showVoicemailOptions\\\"]],\\\"group-contact-modal\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleOptions\\\"]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.options\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\\n                        \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"showVoicemailOptions\\\"]],\\\"show\\\",\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"upload-file\\\"],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"link\\\"],[16,\\\"disabled\\\",[26,[\\\"hasGreeting\\\"]],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"triggerUpload\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.uploadFile\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\\n                                \\\"],[11,\\\"input\\\",[]],[15,\\\"class\\\",\\\"hidden file-upload\\\"],[15,\\\"name\\\",\\\"file\\\"],[15,\\\"type\\\",\\\"file\\\"],[15,\\\"accept\\\",\\\".wav,.aiff,.opus,.ogg,audio/ogg\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.audioRecorder.uploadFile\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"chooseFile\\\"],[[\\\"on\\\"],[\\\"change\\\"]]],[13],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\\n                            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"reset\\\"],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"resetCurrentGreeting\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.resetToDefault\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showEmailNotification\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"email-notification contact-info-group\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailNotification\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"emailNotificationOn\\\"]],\\\"toggleEmailNotification\\\"]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emailNotificationOn\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailNotificationHelpText\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-contact-modal/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport debounce from 'lodash.debounce';\n\nimport DS from 'ember-data';\n\nimport EntityControllerMixin from '../../mixins/entity-controller';\nimport FieldSection from '../../field-config/field-section';\n\nimport { BASE_PERSON } from '../../models/person';\n\nconst { Component, run, inject, RSVP } = Ember;\n\nlet jobEndpoint = function (id) {\n    return `/api/v2/jobs/${id}`;\n};\n\nlet GroupProfileComponent = Component.extend(EntityControllerMixin, {\n    classNames: ['group-profile', 'entity'],\n    classNameBindings: ['chatEnabled'],\n\n    intl: inject.service(),\n    ajax: inject.service(),\n    store: inject.service(),\n    session: inject.service(),\n    favorites: inject.service(),\n    permissions: inject.service(),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n    addressformat: inject.service(),\n\n    canViewChat: Ember.computed.bool('permissions.canViewBusinessChat'),\n    canViewVideo: Ember.computed.bool('permissions.canViewCollaborateVideo'),\n    phoneEnabled: Ember.computed.bool('permissions.phoneEnabled'),\n    chatEnabled: Ember.computed.alias('chatService.enabled'),\n    model: null,\n\n    showDropdown: false,\n\n    isEditing: false,\n    showContactInfo: false,\n    saves: [],\n\n    groupRoom: null,\n    showMembers: true,\n    showLinkDropdown: false,\n    displayIndices: false,\n\n    hasLinks: false,\n    hasInformals: false,\n\n    isLoading: false,\n\n    displayWarningModal: false,\n\n    activeTab: 'members',\n\n    excludedFieldSections: ['general', 'images', 'membership', 'membershipDraft', 'privacy', 'owners'],\n\n    excludedMembershipFields: ['includeOwners', 'exclusions', 'inclusions'],\n\n    excludedEditingFields: ['compiledQuery'],\n\n    view: Ember.$('<div class=\"center-indicator\"><i class=\"pc-moon pc-loading pc-spin\"></i></div>'),\n\n    toggleLoading: Ember.observer('isLoading', function () {\n        if (this.get('_state') === 'inDOM' && this.get('isLoading')) {\n            this.$('.field-section .content').append(this.get('view'));\n        } else if (this.$()) {\n            this.$('.center-indicator').remove();\n        }\n    }),\n\n    generalExcludedEditingFields: ['groupType'],\n\n    actions: {\n        selectTab(tab) {\n            this.set('activeTab', tab);\n        },\n\n        toggleCallsEnabled() {\n            if (!this.get('callsEnabled') && this.get('hasRules')) {\n                this.set('displayWarningModal', true);\n            } else {\n                this.toggleProperty('callsEnabled');\n                this.saveCallsEnabledState();\n            }\n            this.set('isEditing', false);\n        },\n\n        toggleEditing() {\n            if (!this.get('isEditing')) {\n                this.get('model').reload();\n            }\n            this.toggleProperty('isEditing');\n        },\n\n        changeEditingMode(editing) {\n            this.set('isEditing', editing);\n        },\n\n        editGeneralInfo() {\n            this.set('isShowingGeneralModal', true);\n        },\n\n        editContactInfo() {\n            this.set('showContactInfo', true);\n        },\n\n        cancelEditContactInfo() {\n            this.set('showContactInfo', false);\n        },\n\n        editPrivacyRules() {\n            this.set('isShowingPrivacyModal', true);\n        },\n\n        toggleLinks() {\n            this.toggleProperty('showLinkDropdown');\n        },\n\n        goToLink(href) {\n            if (href.indexOf('http://') !== -1 || href.indexOf('https://') !== -1) {\n                window.open(href, '_blank');\n            } else {\n                window.open('http://' + href, '_blank');\n            }\n        },\n\n        confirmGeneral() {\n            const notification = this.get('notification');\n            const group = this.get('model');\n            group\n                .save()\n                .then(data => {\n                    Ember.Logger.debug('GROUP-PROFILE: group saved', data);\n                    this.closeAllModals();\n                    if (!_.isEmpty(data)) {\n                        if (data.job) {\n                            this.handleJob(data.job);\n                        }\n                    }\n\n                    const title = group.get('name');\n                    const message = this.get('intl').lookup('notification.group.general');\n                    notification.info(title, message, {\n                        forceBrowserNotification: true,\n                        hideAfter: 5\n                    });\n                })\n                .catch(e => {\n                    Ember.Logger.error('group save failed', { error: e });\n                    const title = group.get('name');\n                    const message = this.get('intl').lookup('notification.group.saveError');\n                    notification.error(title, message, {\n                        forceBrowserNotification: true\n                    });\n\n                    group.reload();\n                });\n\n            this.send('setHasLinks');\n        },\n\n        cancelGeneral() {\n            this.get('model').reload();\n            this.closeAllModals();\n        },\n\n        confirm() {\n            const notification = this.get('notification');\n            let model = this.get('model');\n            if (model.get('owners.owners.length') === 0) {\n                const title = this.get('model.name');\n                const message = this.get('intl').lookup('notification.group.noOwners').toString();\n                notification.info(title, message, {\n                    icon: '',\n                    hideAfter: 8\n                });\n\n                model.reload();\n            } else {\n                this.set('isLoading', true);\n\n                model.save().then(() => {\n                    const title = this.get('model.name');\n                    const message = this.get('intl').lookup('notification.group.general').toString();\n                    notification.show(title, message, {\n                        hideAfter: 8\n                    });\n\n                    var job = this.store.metadataFor('group').job;\n                    this.handleJob(job);\n                    this.set('isLoading', false);\n                });\n            }\n\n            return false;\n        },\n\n        noop() {},\n\n        deleteGroup() {\n            this.set('isShowingDeleteModal', true);\n        },\n\n        cancelDelete() {\n            this.closeAllModals();\n        },\n\n        confirmDelete() {\n            const notification = this.get('notification');\n            const model = this.get('model');\n            const id = model.get('id');\n            const groupType = model.get('groupType');\n            const person = this.get('session.person');\n\n            model.deleteRecord();\n            model\n                .save()\n                .then(group => {\n                    Ember.Logger.debug('GROUP-PROFILE: Deleted Group: ', group);\n                    const title = group.get('name');\n                    const message = this.get('intl').lookup('notification.group.deleting');\n                    notification.info(title, message, {\n                        icon: '',\n                        hideAfter: 8\n                    });\n                    this.closeAllModals();\n                    window.history.back();\n                })\n                .then(function () {\n                    if (groupType) {\n                        const type = groupType.toLowerCase();\n                        const groups = person.get(`groups.${type}`) || [];\n                        const groupData = groups.findBy('value', id);\n                        groups.removeObject(groupData);\n                    }\n                })\n                .catch(e => {\n                    Ember.Logger.error('GROUP-PROFILE: Error deleting group', {\n                        error: e\n                    });\n\n                    model.set('state', 'active');\n\n                    const title = model.get('name');\n                    const message = this.get('intl').lookup('notification.group.deleteError');\n                    notification.error(title, message, {\n                        icon: ''\n                    });\n                });\n        },\n\n        setHasLinks() {\n            let links = this.get('model.general.links');\n            if (links && links !== undefined) {\n                this.set('hasLinks', links.length > 0 && links[0].value !== '');\n            } else {\n                this.set('hasLinks', false);\n            }\n        },\n\n        makeCall: debounce(function () {\n            this.bubbleAction({\n                action: 'startCallByNumber',\n                actionContext: [this.get('phoneNumber')]\n            });\n        }, 250),\n\n        confirmWarningModal() {\n            this.set('model.membership.exclusions', []);\n            this.set('model.membership.inclusions', []);\n            this.set('displayWarningModal', false);\n            this.set('callsEnabled', true);\n            this.saveCallsEnabledState();\n        },\n\n        closeWarningModal() {\n            this.set('displayWarningModal', false);\n        },\n\n        toggleGroupProfileEditPopover(status) {\n            this.set('showDropdown', !status);\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n\n        if (this.get('model') && !this.get('model.uniqueRoleCount')) {\n            const group = this.get('model');\n            group.getGrants();\n        }\n    },\n\n    closeAllModals() {\n        this.setProperties({\n            isShowingDeleteModal: false,\n            isShowingPrivacyModal: false,\n            isShowingGeneralModal: false\n        });\n    },\n\n    ensureCorrectLinksState: Ember.on('init', function () {\n        run.scheduleOnce('afterRender', this, function () {\n            this.send('setHasLinks');\n        });\n    }),\n\n    membersTabSelected: Ember.computed.equal('tabSelected', 'members'),\n\n    settingsTabSelected: Ember.computed.equal('tabSelected', 'settings'),\n\n    generalFieldConfigSection: Ember.computed('groupRingVisible', function () {\n        let config = this.get('model.fieldConfig');\n\n        let fields = [\n            config.get('general.name'),\n            config.get('general.groupType'),\n            config.get('general.description'),\n            config.get('general.links'),\n            config.get('membership.includeOwners'),\n            config.get('contactInfo.email')\n        ];\n\n        let fieldSection = FieldSection.create({\n            key: 'general',\n            state: 'active',\n            fieldConfig: this.get('model.fieldConfig'),\n            instructionText: null,\n            fieldList: fields\n        });\n\n        // Override setting general section on non-general fields\n        fieldSection.get('includeOwners').set('section', config.get('membership'));\n        fieldSection.get('email').set('section', config.get('contactInfo'));\n\n        return fieldSection;\n    }),\n\n    privacyFieldConfigSection: Ember.computed(function () {\n        let config = this.get('model.fieldConfig');\n\n        let fields = [config.get('privacy.groupVisibility'), config.get('privacy.membershipVisible')];\n\n        return FieldSection.create({\n            key: 'privacy',\n            state: 'active',\n            fieldConfig: config,\n            instructionText: null,\n            fieldList: fields\n        });\n    }),\n\n    linksFieldSection: Ember.computed('model.general.links.@each.value', function () {\n        let config = this.get('model.fieldConfig');\n\n        let fields = [config.get('general.links')];\n\n        return FieldSection.create({\n            key: 'general',\n            state: 'active',\n            fieldConfig: config,\n            instructionText: null,\n            fieldList: fields\n        });\n    }),\n\n    callsEnabled: Ember.computed('model.contactInfo.allowCallConfiguration.firstObject.value', 'phoneEnabled', {\n        get() {\n            return this.get('phoneEnabled') && this.get('model.contactInfo.allowCallConfiguration.firstObject.value');\n        },\n        set(key, value) {\n            return value;\n        }\n    }),\n\n    hasRules: Ember.computed('model.membership.inclusions', 'model.membership.exclusions', function () {\n        return (\n            !_.isEmpty(this.get('model.membership.inclusions')) || !_.isEmpty(this.get('model.membership.exclusions'))\n        );\n    }),\n\n    phoneNumber: Ember.computed('model.contactInfo.groupNumber.@each.value', function () {\n        return this.get('model.contactInfo.groupNumber.firstObject');\n    }),\n\n    dialableNumber: Ember.computed('phoneNumber', function () {\n        return this.get('addressformat').format(this.get('phoneNumber'));\n    }),\n\n    phoneRef: Ember.computed('model.contactInfo.groupNumber.@each.value', function () {\n        var number = this.get('model.contactInfo.groupNumber.firstObject.rel.e164');\n        return `tel:#${number}`;\n    }),\n\n    name: Ember.computed('model.general.name.@each.value', function () {\n        return this.get('model').getFieldValue('general.name');\n    }),\n\n    description: Ember.computed('model.general.description.@each.value', function () {\n        return this.get('model').getFieldValue('general.description');\n    }),\n\n    groupType: Ember.computed('model.general.groupType.@each.value', function () {\n        return this.get('model').getFieldValue('general.groupType');\n    }),\n\n    groupVisibility: Ember.computed('model.privacy.groupVisibility.@each.value', function () {\n        return this.get('model').getFieldValue('privacy.groupVisibility');\n    }),\n\n    membershipVisible: Ember.computed('model.privacy.membershipVisible.@each.value', function () {\n        return this.get('model').getFieldValue('privacy.membershipVisible');\n    }),\n\n    includeOwners: Ember.computed('model.membership.includeOwners.@each.value', function () {\n        return this.get('model').getFieldValue('membership.includeOwners');\n    }),\n\n    email: Ember.computed('model.contactInfo.email.@each.value', function () {\n        return this.get('model').getFieldValue('contactInfo.email');\n    }),\n\n    groupTypeIcon: Ember.computed('model.general.groupType', function () {\n        let groupType = this.get('model').getFieldValue('general.groupType').value;\n        let icon = 'pc pc-official-group';\n\n        if (groupType === 'groups.social') {\n            icon = 'pc pc-social-group';\n        }\n\n        return icon;\n    }),\n\n    groupOwners: Ember.computed('model.owners.owners.[]', function () {\n        let owners = this.get('model').getFieldValue('owners.owners');\n        let promise = RSVP.resolve([]);\n\n        if (owners) {\n            promise = this.store.findMany('person', owners.mapBy('guid'), BASE_PERSON);\n        }\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    membershipHeader: Ember.computed('model.memberCount', function () {\n        const count = this.get('model.memberCount');\n        return this.get('intl').lookup('groups.membershipWithCount', { count }).toString();\n    }),\n\n    groupRolesHeader: Ember.computed('model.uniqueRoleCount', function () {\n        const count = this.get('model.uniqueRoleCount');\n        return this.get('intl').lookup('groups.roles.rolesWithCount', { count }).toString();\n    }),\n\n    sections: Ember.computed('fieldSections', function () {\n        return this.get('fieldSections');\n    }),\n\n    canEditLeftRailInfo: Ember.computed.alias('canEditInformation'),\n    canEditProfilePicture: Ember.computed.alias('canEditInformation'),\n    canEditInformation: Ember.computed(\n        'model.owners.owners.[]',\n        'session.person',\n        'session.person.isAdmin',\n        'permissions.canEditGroups',\n        function () {\n            let namedPermissions = this.get('session.namedPermissions') || [];\n            let isOwner = this.get('model').isPersonOwner(this.get('session.person'));\n            let canEditGroups = this.get('permissions.canEditGroups');\n\n            return (\n                isOwner ||\n                canEditGroups ||\n                this.get('session.person.isAdmin') ||\n                _.includes(namedPermissions, 'group_administration')\n            );\n        }\n    ),\n\n    canEditGroupTelephonySettings: Ember.computed.readOnly('permissions.canEditGroupTelephonySettings', function () {\n        return this.get('permissions.canEditGroupTelephonySettings');\n    }),\n    disableToggleCalls: Ember.computed.not('canEditGroupTelephonySettings'),\n    canEditRoles: Ember.computed('session.namedPermissions', function () {\n        const hasRolesView = this.get('session').hasPermissionAndDivision('authorization:role:view');\n        const hasGrantsEdit = this.get('session').hasPermissionAndDivision('authorization:grant:add');\n        return hasRolesView.hasPermission && hasGrantsEdit.hasPermission;\n    }),\n\n    canDeleteGroup: Ember.computed.reads('permissions.canDeleteGroup'),\n\n    updateLinksChange: Ember.observer('model.general.links.@each.value', function () {\n        this.send('setHasLinks');\n    }),\n\n    setHasInformals: Ember.observer('model.images.gallery', 'model.images.gallery.length', function () {\n        let informals = this.get('model.images.gallery');\n        if (informals && informals !== undefined) {\n            this.set('hasInformals', informals.length > 0);\n        } else {\n            this.set('hasInformals', false);\n        }\n    }),\n\n    checkMembers: Ember.observer('model.membership', function () {\n        let exclusions = this.get('model.membership.exclusions') !== undefined;\n        let inclusions = this.get('model.membership.inclusions') !== undefined;\n        let canEdit = this.get('canEditMembership.labelKey') === 'owners' || this.get('session.person.isAdmin');\n\n        let value = exclusions || inclusions || canEdit;\n        this.set('showMembers', value);\n    }),\n\n    canEditMembership: Ember.computed(function () {\n        let owners = this.get('model').getFieldValue('owners.owners');\n        let isOwner = _.find(owners, owner => owner.value === this.get('session.person.id'));\n\n        return isOwner || this.get('session.person.isAdmin');\n    }),\n\n    disableAction: Ember.computed({\n        get() {\n            return this.setConfirmDisabled.bind(this);\n        },\n\n        set() {\n            return this.setConfirmDisabled.bind(this);\n        }\n    }),\n\n    saveCallsEnabledState() {\n        const model = this.get('model');\n        const callsEnabled = this.get('callsEnabled');\n        if (!callsEnabled) {\n            model.set('contactInfo.groupNumber', [], { overwrite: true });\n        }\n        model.set('contactInfo.allowCallConfiguration', callsEnabled);\n        return model\n            .save()\n            .then(() => {\n                model.get('policy').then(policy => {\n                    if (!this.get('callsEnabled')) {\n                        this.get('store').unloadRecord(policy);\n                        this.get('store')\n                            .findRecord('group-policy', model.get('guid'))\n                            .then(policy => {\n                                this.set('policy', policy);\n                            });\n                    }\n                });\n            })\n            .catch(() => {\n                this.toggleProperty('callsEnabled');\n                const title = this.get('model.name');\n                const message = this.get('intl').lookup('groups.groupRing.enableCallsError');\n                this.get('notification').error(title, message, {\n                    forceBrowserNotification: true\n                });\n                return Ember.RSVP.reject();\n            });\n    },\n\n    setConfirmDisabled(value) {\n        return this.set('confirmDisabled', value);\n    },\n\n    handleJob(job) {\n        if (job) {\n            job.interval = window.setInterval(() => {\n                this.getJobData(job);\n            }, 2000);\n        }\n    },\n\n    getJobData(job) {\n        return this.get('ajax')\n            .request(jobEndpoint(job.jobId))\n            .then(data => {\n                data = data.res;\n\n                let retryJobId = data.retryJobId;\n\n                if (data.status !== 'in-progress' && data.status !== 'pending') {\n                    window.clearInterval(job.interval);\n\n                    if (data.status === 'retry') {\n                        job.jobId = retryJobId;\n                        this.handleJob(job);\n                    } else if (job.status !== 'failed') {\n                        this.get('model').reload();\n                    }\n                }\n            })\n            .catch(() => {\n                window.clearInterval(job.interval);\n\n                this.get('model').reload();\n            });\n    },\n\n    commitRevertHandler(data) {\n        let model = this.get('model');\n        model.set('version', data.res.version);\n\n        // Ember-Data is doing something weird and not marking as saved, so we do this manually\n        model.save().then(function (group) {\n            group.adapterDidCommit();\n        });\n    }\n});\nexport default GroupProfileComponent;\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed, Component, inject } = Ember;\n\nexport default Component.extend({\n    classNames: ['group-acd-expressions'],\n\n    application: inject.service(),\n    ajax: inject.service(),\n    intl: inject.service(),\n    logger: inject.service('stash-logger'),\n    notification: inject.service('notification-proxy'),\n\n    group: null,\n    showSaveModal: false,\n    showCancelModal: false,\n    loading: false,\n    previewValue: null,\n\n    expressionDisplay: computed('group.expression.@each.{display,opAnd}', function () {\n        const conditions = this.get('group.expression');\n        let display = '';\n        let valid = true;\n\n        if (!conditions || conditions.length === 0) {\n            return this.get('intl').t('groups.expressions.empty');\n        }\n\n        conditions.forEach(con => {\n            if (con.display === null || con.display === undefined) {\n                valid = false;\n                return;\n            }\n\n            display += con.display;\n            if (!con.lastCondition) {\n                if (!con.opAnd) {\n                    display += ` ${this.get('intl').t('groups.expressions.or')} `;\n                } else {\n                    //last rule\n                    display += ` ${this.get('intl').t('groups.expressions.and')} `;\n                }\n            }\n        });\n\n        const empty = display.replace(/[()]/g, '').trim().length === 0;\n        if (empty) {\n            display = this.get('intl').t('groups.expressions.empty');\n        } else if (!valid) {\n            display = this.get('intl').t('groups.expressions.invalid');\n        }\n\n        return display;\n    }),\n\n    saveDisabled: computed('group.expression.@each.display', 'loading', function () {\n        const invalid = this.get('group.expression').filterBy('display', null).length > 0;\n        const loading = this.get('loading');\n        return invalid && !loading;\n    }),\n\n    maximumExpressions: computed('group.expression.length', 'group.expression.@each.length', function () {\n        //we have a limit of 3 skills total\n        const skills = this.get('group.expression').mapBy('rules');\n        return _.flatten(skills).length >= 3;\n    }),\n\n    numberPreview: computed('previewValue', function () {\n        return isNaN(this.get('previewValue')) ? this.get('intl').t('purecloud.unknown') : this.get('previewValue');\n    }),\n\n    actions: {\n        selectTab(tab) {\n            this.selectTab(tab);\n        },\n        addCondition() {\n            if (!this.get('maximumExpressions')) {\n                if (this.get('group.expression') && this.get('group.expression').length > 0) {\n                    let exp = this.get('group.expression');\n                    exp.forEach(condition => {\n                        Ember.set(condition, 'lastCondition', false);\n                        if (condition.operation === null) {\n                            Ember.set(condition, 'operation', 'AND');\n                            Ember.set(condition, 'opAnd', true);\n                        }\n                    });\n                    exp.pushObject({\n                        lastCondition: true,\n                        operation: 'OR',\n                        opAnd: false,\n                        display: null,\n                        rules: [\n                            {\n                                skill: null,\n                                comparator: null,\n                                proficiency: null,\n                                operation: 'OR',\n                                lastRule: true,\n                                opAnd: false\n                            }\n                        ]\n                    });\n                    Ember.set(exp, 'lastObject.lastCondition', true);\n                } else {\n                    this.set('group.expression', [\n                        {\n                            lastCondition: true,\n                            operation: 'OR',\n                            opAnd: false,\n                            display: null,\n                            rules: [\n                                {\n                                    skill: null,\n                                    comparator: null,\n                                    proficiency: null,\n                                    operation: 'OR',\n                                    lastRule: true,\n                                    opAnd: false\n                                }\n                            ]\n                        }\n                    ]);\n                }\n            } else {\n                this.get('notification').error(\n                    this.get('intl').t('groups.expressions.maxConditionsTitle'),\n                    this.get('intl').t('groups.expressions.maxConditionsMessage')\n                );\n            }\n        },\n        removeCondition(index) {\n            let exp = this.get('group.expression');\n\n            if (exp.length === 1) {\n                this.set('group.expression', []);\n            } else {\n                Ember.A(exp).removeAt(index);\n                exp.forEach(condition => {\n                    Ember.set(condition, 'lastCondition', false);\n                });\n                exp.set('lastObject.lastCondition', true);\n                exp.set('lastObject.operation', 'OR');\n                exp.set('lastObject.opAnd', false);\n                this.set('group.expression', exp);\n            }\n        },\n        conditionOperation(condition, op) {\n            Ember.set(condition, 'operation', op);\n            Ember.set(condition, 'opAnd', op == 'AND');\n        },\n        save() {\n            // use new endpoints to save our changed inclusions\n            this.set('loading', true);\n            let saveData = this.prepareExpression(this.get('group.expression'));\n            let success = true;\n            const payload = {\n                data: {\n                    skillConditions: saveData\n                }\n            };\n            const groupId = this.get('group.guid');\n            const path = `api/v2/groups/${groupId}/dynamicsettings`;\n            const url = this.get('application').pcV2Uri(path);\n\n            this.get('ajax')\n                .put(url, payload)\n                .then(() => {\n                    this.get('group').reload();\n                })\n                .catch(error => {\n                    success = false;\n                    this.get('notification').error(\n                        this.get('intl').t('groups.expressions.saveErrorTitle'),\n                        this.get('intl').t('groups.expressions.saveErrorMessage')\n                    );\n                    this.get('logger').error('Error trying to save dynamic expression to group', {\n                        error\n                    });\n                    this.set('loading', false);\n                })\n                .finally(() => {\n                    if (success) {\n                        this.set('group.lastSavedExpression', saveData);\n\n                        // use the preview endpoint to show the new expected number of group members\n                        this.get('notification').info(\n                            this.get('intl').t('groups.expressions.saveTitle'),\n                            this.get('intl').t('groups.expressions.saveMessage')\n                        );\n                        const previewPath = `api/v2/groups/dynamicsettings/preview`;\n                        const previewUrl = this.get('application').pcV2Uri(previewPath);\n                        this.get('ajax')\n                            .post(previewUrl, payload)\n                            .then(preview => {\n                                this.set('previewValue', preview.userCount);\n                            })\n                            .catch(e => {\n                                this.get('logger').error('Error trying to get preview for dynamic group', {\n                                    e\n                                });\n                            })\n                            .finally(() => {\n                                this.set('loading', false);\n                                this.set('showSaveModal', true);\n                            });\n                    }\n                });\n        },\n        openCancelModal() {\n            this.set('showCancelModal', true);\n        },\n        closeCancelModal() {\n            this.set('showCancelModal', false);\n        },\n        cancel() {\n            this.set('showCancelModal', false);\n            const group = this.get('group');\n            group.reload();\n\n            if (this.get('group.lastSavedExpression')) {\n                group.set('expression', group.parseExpression(group.get('lastSavedExpression')));\n            } else {\n                group.set('expression', group.parseExpression(group.get('_expression.content.skillConditions')));\n            }\n            this.selectTab('members');\n        },\n        closeSaveModal() {\n            this.set('previewValue', null);\n            this.set('showSaveModal', false);\n            this.selectTab('members');\n        }\n    },\n\n    prepareExpression(input) {\n        let output = [];\n        input.forEach(con => {\n            let save = {\n                routingSkillConditions: [],\n                languageSkillConditions: []\n            };\n\n            let parent = null;\n            con.rules.forEach((rule, index) => {\n                const skillPropName =\n                    rule.skill.type == 'routing' ? 'routingSkillConditions' : 'languageSkillConditions';\n                const ruleType = rule.skill.type == 'routing' ? 'routingSkill' : 'languageSkill';\n\n                if (index === 0) {\n                    // we're making this rule the current parent skill\n                    let newObj = {\n                        comparator: rule.comparator.value,\n                        proficiency: rule.proficiency.value,\n                        childConditions: {\n                            operation: rule.operation,\n                            routingSkillConditions: [],\n                            languageSkillConditions: []\n                        }\n                    };\n                    newObj[ruleType] = rule.skill.name;\n\n                    parent = newObj;\n                    save[skillPropName].pushObject(newObj);\n                    save.operation = con.operation;\n                    if (input.length === 1) {\n                        save.operation = rule.operation;\n                    }\n                } else {\n                    // we're adding this skill as a childCondition\n                    let newObj = {\n                        comparator: rule.comparator.value,\n                        proficiency: rule.proficiency.value,\n                        childConditions: {\n                            operation: rule.operation,\n                            routingSkillConditions: [],\n                            languageSkillConditions: []\n                        }\n                    };\n                    newObj[ruleType] = rule.skill.name;\n\n                    parent.childConditions[skillPropName].pushObject(newObj);\n                    parent = newObj;\n                }\n            });\n\n            output.pushObject(save);\n        });\n\n        return output;\n    }\n});\n","import Ember from 'ember';\n\nconst { observer, Component, inject } = Ember;\n\nexport default Component.extend({\n    classNames: ['condition-display'],\n\n    intl: inject.service(),\n\n    comparators: null,\n    values: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('values', [\n            { name: '0', value: 0 },\n            { name: '1', value: 1 },\n            { name: '2', value: 2 },\n            { name: '3', value: 3 },\n            { name: '4', value: 4 },\n            { name: '5', value: 5 }\n        ]);\n\n        this.set('comparators', [\n            {\n                label: 'equals (==)',\n                value: 'EqualTo',\n                class: 'equalto',\n                op: '=='\n            },\n            {\n                label: 'not equals (!=)',\n                value: 'NotEqualTo',\n                class: 'notequalto',\n                op: '!='\n            },\n            {\n                label: 'greater than (>)',\n                value: 'GreaterThan',\n                class: 'greaterthan',\n                op: '>'\n            },\n            {\n                label: 'greater than or equal to (>=)',\n                value: 'GreaterThanOrEqualTo',\n                class: 'greaterthanorequalto',\n                op: '>='\n            },\n            {\n                label: 'less than (<)',\n                value: 'LessThan',\n                class: 'lessthan',\n                op: '<'\n            },\n            {\n                label: 'less than or equal to (<=)',\n                value: 'LessThanOrEqualTo',\n                class: 'lessthanorequalto',\n                op: '<='\n            }\n        ]);\n\n        this.get('condition.rules').forEach(rule => {\n            // check to see if we're starting fresh\n            if (rule.comparator === null) return;\n\n            // set comparators to proper objects\n            const compPlace = this.get('comparators').mapBy('op').indexOf(rule.comparator.op);\n            if (compPlace >= 0) {\n                Ember.set(rule, 'comparator', this.get('comparators')[compPlace]);\n            } else {\n                Ember.set(rule, 'comparator', null);\n            }\n\n            if (!isNaN(rule.proficiency.value)) {\n                Ember.set(rule, 'proficiency', this.get('values')[rule.proficiency.value]);\n            }\n        });\n\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            this.set('condition.display', this.display());\n        });\n    },\n\n    updateConditionDisplay: observer(\n        'condition',\n        'condition.rules.@each.{skill,comparator,proficiency,opAnd,lastRule}',\n        function () {\n            this.set('condition.display', this.display());\n            this.set('condition.length', this.get('condition.rules').length);\n        }\n    ),\n\n    actions: {\n        addRule() {\n            let rules = this.get('condition').rules;\n            rules.forEach(rule => {\n                Ember.set(rule, 'lastRule', false);\n            });\n            rules.set('lastObject.operation', 'OR');\n            rules.set('lastObject.opAnd', false);\n            rules.pushObject({\n                skill: null,\n                comparator: null,\n                proficiency: null,\n                operation: 'OR',\n                lastRule: true,\n                opAnd: false\n            });\n        },\n        removeRule(index) {\n            let con = this.get('condition').rules;\n            Ember.A(con).removeAt(index);\n            con.forEach(rule => {\n                Ember.set(rule, 'lastRule', false);\n            });\n            con.set('lastObject.lastRule', true);\n            con.set('lastObject.operation', 'OR');\n            con.set('lastObject.opAnd', false);\n            this.set('condition.rules', con);\n        },\n        ruleOperation(rule, op) {\n            Ember.set(rule, 'operation', op);\n            Ember.set(rule, 'opAnd', op == 'AND');\n        },\n        skillChanged(rule, skill, value) {\n            if (value) {\n                Ember.set(rule, skill, value);\n            }\n        }\n    },\n\n    /**\n     * This is the same function found in `/components/skillgroup-profile/dynamic-rules/condition-display` component.\n     * TODO: Remove these functions from component level and make reusable util.\n     */\n    display() {\n        const rules = this.get('condition.rules');\n        let display = '(';\n        let valid = true;\n        let orWrap = false;\n\n        for (const rule of rules) {\n            // if a rule is not valid then break the rest of the for-loop and set the valid to `false`\n            if (!rule.skill || !rule.comparator || !rule.proficiency) {\n                valid = false;\n                return;\n            }\n\n            display += `${rule.skill.name} ${rule.comparator.op} ${rule.proficiency.value}`;\n            if (rule.lastRule) {\n                display += ')';\n            } else if (!rule.opAnd) {\n                display += `) ${this.get('intl').t('groups.expressions.or')} (`;\n                orWrap = true;\n            } else {\n                display += ` ${this.get('intl').t('groups.expressions.and')} `;\n            }\n        }\n\n        if (orWrap) {\n            display = `(${display})`;\n        }\n\n        return valid ? display : null;\n    }\n});\n","import Ember from 'ember';\nconst { computed, Component, inject } = Ember;\nimport _ from 'lodash';\n\nexport default Component.extend({\n    classNames: ['skill-search'],\n\n    application: inject.service(),\n    ajax: inject.service(),\n    intl: inject.service(),\n    logger: inject.service('stash-logger'),\n\n    skillResults: null,\n    languageResults: null,\n    showSearchResults: false,\n    searchvalue: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('skillResults', []);\n        this.set('languageResults', []);\n    },\n\n    results: computed('skillResults', 'languageResults', function () {\n        return this.get('skillResults').concat(this.get('languageResults'));\n    }),\n\n    placeHolder: computed('skill', function () {\n        return this.get('skill') ? this.get('skill.name') : this.get('intl').t('groups.expressions.defaultSkill');\n    }),\n\n    skillSelected: computed('skill', function () {\n        return !!this.get('skill');\n    }),\n\n    actions: {\n        select(result) {\n            this.set('skill', result);\n            this.reset();\n        },\n        clearSearch() {\n            this.reset();\n        },\n        searchInputUpdated(event) {\n            this.set('searchValue', event.target.value);\n            this.updateSearchOnChange(event.target.value);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.attachOutsideHandler();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.removeOutsideHandler();\n    },\n\n    attachOutsideHandler() {\n        Ember.$(window).on(`click.${this.get('elementId')}`, event => {\n            Ember.run(() => {\n                if (this.get('dismissed')) {\n                    return;\n                }\n                const target = Ember.$(event.target);\n                if (!target.parents('.skill-search').length) {\n                    this.reset();\n                }\n            });\n        });\n    },\n\n    removeOutsideHandler() {\n        Ember.$(window).off(`.${this.get('elementId')}`);\n    },\n\n    reset() {\n        this.set('showSearchResults', false);\n        this.set('searchValue', null);\n        this.set('languageResults', []);\n        this.set('skillResults', []);\n    },\n\n    updateSearchOnChange(query) {\n        if (!_.isEmpty(query)) {\n            Ember.run.debounce(this, this.runSearch, query.toLowerCase(), 250);\n        } else {\n            this.reset();\n        }\n    },\n\n    runSearch(query) {\n        this.set('showSearchResults', true);\n        this.languageSearch(query);\n        this.skillSearch(query);\n    },\n\n    skillSearch(query) {\n        const url = this.get('application').pcV2Uri(`api/v2/routing/skills`);\n        this.get('ajax')\n            .ajaxGet(url, {\n                data: {\n                    name: query\n                },\n                retry: true\n            })\n            .then(res => {\n                let skills = res.entities;\n                skills.forEach(skl => {\n                    skl.type = 'routing';\n                    skl.class = skl.name.toLowerCase().replaceAll(' ', '_');\n                });\n                this.set('skillResults', skills);\n            })\n            .catch(error => {\n                // uhhhh\n                this.get('logger').error('Error trying to fetch routing skills', {\n                    error\n                });\n                this.set('skillResults', []);\n            });\n    },\n\n    languageSearch(query) {\n        const url = this.get('application').pcV2Uri(`api/v2/routing/languages`);\n        this.get('ajax')\n            .ajaxGet(url, {\n                data: {\n                    name: query\n                },\n                retry: true\n            })\n            .then(res => {\n                let langs = res.entities;\n                langs.forEach(lang => {\n                    lang.type = 'language';\n                    lang.class = lang.name.toLowerCase().replaceAll(' ', '_');\n                });\n                this.set('languageResults', langs);\n            })\n            .catch(error => {\n                // uhhhh\n                this.get('logger').error('Error trying to fetch routing languages', {\n                    error\n                });\n                this.set('languageResults', []);\n            });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"wU85NT0e\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"searchValue\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-close clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"clearSearch\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-search\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"hidden\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-skills-search\\\"]]],[13],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.searchSkill\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-skills-search\\\"]]],[16,\\\"class\\\",[34,[\\\"form-control purecloud-input \\\",[33,[\\\"if\\\"],[[28,[\\\"skillSelected\\\"]],\\\"selected\\\"],null]]]],[16,\\\"value\\\",[34,[[26,[\\\"searchValue\\\"]]]]],[16,\\\"placeholder\\\",[34,[[26,[\\\"placeHolder\\\"]]]]],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"searchInputUpdated\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showSearchResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"search-results show dropdown-menu\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"results-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"results\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[16,\\\"class\\\",[34,[\\\"clearfix \\\",[28,[\\\"result\\\",\\\"class\\\"]],\\\" \\\",[28,[\\\"result\\\",\\\"type\\\"]]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"select\\\",[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"result\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"result\\\"]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.noResults\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/dynamic-rules/condition-display/skill-search/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"pAm/MlNF\",\"block\":\"{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"condition\\\",\\\"rules\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"rule\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"skill-name\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"group-profile/dynamicRules/condition-display/skill-search\\\"],null,[[\\\"skill\\\"],[[28,[\\\"rule\\\",\\\"skill\\\"]]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"skill-comparator\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"x-select\\\"],null,[[\\\"value\\\",\\\"action\\\",\\\"class\\\"],[[28,[\\\"rule\\\",\\\"comparator\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"skillChanged\\\",[28,[\\\"rule\\\"]],\\\"comparator\\\"],null],\\\"form-control comparator-dropdown\\\"]],{\\\"statements\\\":[[0,\\\"                \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"class\\\"],[\\\"default\\\"]],{\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"groups.expressions.defaultComparator\\\"],null],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"comparators\\\"]]],null,{\\\"statements\\\":[[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\",\\\"class\\\"],[[28,[\\\"op\\\"]],[28,[\\\"op\\\",\\\"class\\\"]]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[28,[\\\"op\\\",\\\"label\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"op\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"skill-proficiency\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"x-select\\\"],null,[[\\\"value\\\",\\\"action\\\",\\\"class\\\"],[[28,[\\\"rule\\\",\\\"proficiency\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"skillChanged\\\",[28,[\\\"rule\\\"]],\\\"proficiency\\\"],null],\\\"form-control proficiency-dropdown\\\"]],{\\\"statements\\\":[[0,\\\"                \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"class\\\"],[\\\"default\\\"]],{\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"groups.expressions.defaultValue\\\"],null],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"values\\\"]]],null,{\\\"statements\\\":[[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\",\\\"class\\\"],[[28,[\\\"val\\\"]],[28,[\\\"val\\\",\\\"value\\\"]]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[28,[\\\"val\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"val\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"rule\\\",\\\"lastRule\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"maximumExpressions\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-rule\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"addRule\\\",[28,[\\\"cIndex\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-plus\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"rule-and-or \\\",[33,[\\\"if\\\"],[[28,[\\\"rule\\\",\\\"opAnd\\\"]],\\\"AND\\\",\\\"OR\\\"],null]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"and-button\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"ruleOperation\\\",[28,[\\\"rule\\\"]],\\\"AND\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.and\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"or-button\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"ruleOperation\\\",[28,[\\\"rule\\\"]],\\\"OR\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.or\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[6,[\\\"unless\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"condition\\\",\\\"rules\\\",\\\"length\\\"]],1],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"remove-rule\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"removeRule\\\",[28,[\\\"rIndex\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-minus\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"rule\\\",\\\"rIndex\\\"]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/dynamic-rules/condition-display/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"SdJHLOQh\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"dynamic-expression-builder\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title-section\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-arrow-left\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectTab\\\",\\\"members\\\"]],[13],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.title\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"subtitle\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.subtitle\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"expression-preview\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"expression-display\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"expressionDisplay\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition-builder\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"group\\\",\\\"expression\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition-header\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.condition\\\"],[[\\\"index\\\",\\\"display\\\"],[[33,[\\\"add\\\"],[[28,[\\\"cIndex\\\"]],1],null],[28,[\\\"condition\\\",\\\"display\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"remove-condition\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"removeCondition\\\",[28,[\\\"cIndex\\\"]]]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.removeCondition\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition-rules\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"group-profile/dynamicRules/condition-display\\\"],null,[[\\\"condition\\\",\\\"group\\\",\\\"maximumExpressions\\\"],[[28,[\\\"condition\\\"]],[28,[\\\"group\\\"]],[28,[\\\"maximumExpressions\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition-footer-line\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"spacer\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"footer-actions\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"condition\\\",\\\"lastCondition\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"maximumExpressions\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-condition\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"addCondition\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-plus\\\"],[13],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"condition-and-or \\\",[33,[\\\"if\\\"],[[28,[\\\"condition\\\",\\\"opAnd\\\"]],\\\"AND\\\",\\\"OR\\\"],null]]]],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"and-button\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"conditionOperation\\\",[28,[\\\"condition\\\"]],\\\"AND\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.and\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"or-button\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"conditionOperation\\\",[28,[\\\"condition\\\"]],\\\"OR\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.or\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"spacer\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"condition\\\",\\\"cIndex\\\"]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"first-condition-line\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"spacer\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition-action\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-condition\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"addCondition\\\"]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-plus\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"spacer\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"editing-footer\\\"],[13],[0,\\\"\\\\n        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"gux-title\\\",\\\"Primary\\\"],[15,\\\"accent\\\",\\\"primary\\\"],[15,\\\"class\\\",\\\"save-button\\\"],[16,\\\"disabled\\\",[26,[\\\"saveDisabled\\\"]],null],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"save\\\"],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"group\\\",\\\"isSaving\\\"]],[28,[\\\"saving\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"]]}],[0,\\\"\\\\n\\\\n        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"gux-title\\\",\\\"Tertiary\\\"],[15,\\\"accent\\\",\\\"tertiary\\\"],[15,\\\"class\\\",\\\"cancel-button\\\"],[16,\\\"disabled\\\",[26,[\\\"loading\\\"]],null],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"openCancelModal\\\"],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"group\\\",\\\"isReloading\\\"]],[33,[\\\"not\\\"],[[28,[\\\"saving\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"]]}],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"loading-screen\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showSaveModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"extraClassNames\\\",\\\"noCancel\\\",\\\"confirm\\\",\\\"headerText\\\"],[\\\"preview-modal\\\",true,[33,[\\\"action\\\"],[[28,[null]],\\\"closeSaveModal\\\"],null],[33,[\\\"t\\\"],[\\\"groups.expressions.previewHeader\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"preview-notice\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.previewText\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info preview-name\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"start name-start\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"entityStrings.group\\\"],null],false],[0,\\\":\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[28,[\\\"group\\\",\\\"name\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info preview-expression\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"start expression-start\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.expression\\\"],null],false],[0,\\\":\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"expressionDisplay\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info preview-number\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"start number-start\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.number\\\"],null],false],[0,\\\":\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"numberPreview\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showCancelModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"extraClassNames\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"headerText\\\"],[\\\"cancel-modal\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"closeCancelModal\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.cancelDisclaimer\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/dynamic-rules/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport request from 'ember-ajax';\n\nexport const LIST_TYPES = {\n    OWNERS: 'owners',\n    MEMBERS: 'members'\n};\n\nexport default Ember.Component.extend({\n    //---- EMBER: BINDINGS ----//\n\n    classNames: ['group-contact-panel'],\n    classNameBindings: ['slideInList'],\n\n    //---- SERVICES ----//\n\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n\n    group: null,\n    editing: false,\n    loading: false,\n    disableSave: false,\n    slideInList: true,\n    personSearch: false,\n    saves: null,\n    orgVoicemailPolicy: null,\n    canEditGroupTelephonySettings: true,\n    listType: LIST_TYPES.OWNERS,\n\n    routeSelection: Ember.computed.reads('group.policy.groupAlertType'),\n\n    ringRotations: Ember.computed.reads('group.policy.stopRingingAfterRotations'),\n\n    isSequential: Ember.computed.equal('routeSelection', 'SEQUENTIAL'),\n\n    isRotary: Ember.computed.equal('routeSelection', 'ROUND_ROBIN'),\n\n    displayIndices: Ember.computed.or('isSequential', 'isRotary'),\n\n    disabled: Ember.computed.or('disableSave', 'loading'),\n\n    reasons: Ember.computed('orgVoicemailPolicy', 'group.policy', function () {\n        return {\n            org: {\n                isMissing: _.isEmpty(this.get('orgVoicemailPolicy'))\n            },\n            group: {\n                isMissing: _.isEmpty(this.get('group.policy'))\n            }\n        };\n    }).readOnly(),\n\n    //---- EMBER: LIFECYCLE METHODS ----//\n\n    // Initialize the component.\n    init(...args) {\n        this._super(...args);\n        this.set('saves', []);\n        if (this.get('canEditGroupTelephonySettings')) {\n            this.loadOrgVoicemailPolicy();\n        }\n    },\n\n    didInsertElement(...args) {\n        this._super(...args);\n        this.scheduleRemoveAnimation();\n    },\n\n    //---- ACTIONS & OBSERVERS & METHODS ----//\n\n    actions: {\n        appendSave(func) {\n            this.get('saves').addObject(func);\n        },\n\n        removeSave(func) {\n            this.get('saves').removeObject(func);\n        },\n\n        disableSave(value) {\n            this.set('disableSave', value);\n        },\n\n        save() {\n            if (!this.get('loading')) {\n                this.save();\n            }\n        },\n\n        cancel() {\n            this.sendAction('toggleEditing');\n            this.set('personSearch', false);\n            this.get('group').rollbackAttributes();\n        },\n\n        changeListType(type) {\n            this.set('listType', type);\n        }\n    },\n\n    async loadOrgVoicemailPolicy() {\n        try {\n            //---- Try Loading Data ----//\n\n            const url = this.get('application').pcV2Uri(`api/v2/voicemail/policy`);\n            const data = await this.get('ajax').request(url);\n            this.set('orgVoicemailPolicy', data);\n\n            //------------//\n        } catch (err) {\n            //---- Handle Error ----//\n\n            // Log the error.\n            const errorPath = 'components/group-profile/group-contact-panel';\n            const errorMessage = \"Couldn't load organization's voicemail policy.\";\n            this.get('logger').error(`${errorPath}: ${errorMessage}`, {\n                error: err,\n                remoteData: {\n                    voicemailGroupId: this.get('group.id')\n                }\n            });\n\n            // Show the user a toast.\n            const toastTitle = this.get('intl').t('groups.groupRing.orgVoicemailPolicy.errorLoading.toastTitle');\n            const toastMessage = this.get('intl').t('groups.groupRing.orgVoicemailPolicy.errorLoading.toastMessage');\n            this.get('notification').error(toastTitle, toastMessage);\n\n            // Clean up.\n            this.set('orgVoicemailPolicy', null);\n\n            //------------//\n        }\n    },\n\n    scheduleRemoveAnimation() {\n        Ember.run.later(\n            this,\n            () => {\n                Ember.run.scheduleOnce('afterRender', this, () => {\n                    if (this._state !== 'destroying' && this._state !== 'destroyed') {\n                        this.set('slideInList', false);\n                    }\n                });\n            },\n            500\n        );\n    },\n\n    save() {\n        const saveData = this.get('saves').map(save => save());\n        const greetingData = _.filter(saveData, { type: 'group-ring-settings' })[0];\n        const ringSequenceData = _.filter(saveData, { type: 'ring-sequence' })[0];\n\n        this.set('loading', true);\n        const promise = new Ember.RSVP.Promise((resolve, reject) => {\n            this.saveModelData(ringSequenceData)\n                .then(() => {\n                    if (!!this.get('group.number.rel.errorCode')) {\n                        return reject({\n                            title: this.get('intl').lookup('notification.group.groupRingError.title'),\n                            message: this.get('intl').lookup('notification.group.groupRingError.message')\n                        });\n                    }\n\n                    this.get('group.policy').then(policy => {\n                        if (policy.get('languagePreference') === '' || !policy.get('languagePreference')) {\n                            // default the language preference\n                            policy.set('languagePreference', 'en-us');\n                        }\n                        this.savePolicy(policy, true)\n                            .then(() => {\n                                this.saveGreeting(greetingData)\n                                    .then(() => {\n                                        resolve({\n                                            title: this.get('group.name'),\n                                            message: this.get('intl').lookup('notification.group.groupRingSuccess')\n                                        });\n                                    })\n                                    .catch(err => {\n                                        Ember.Logger.error('Error saving greeting', { err });\n\n                                        reject({\n                                            title: this.get('intl').lookup(\n                                                'notification.group.groupRingGreetingError.title'\n                                            ),\n                                            message: this.get('intl').lookup(\n                                                'notification.group.groupRingGreetingError.message'\n                                            )\n                                        });\n                                    });\n                            })\n                            .catch(err => {\n                                Ember.Logger.error('Error saving policy', { err });\n\n                                reject({\n                                    title: this.get('intl').lookup('notification.group.groupRingError.title'),\n                                    message: this.get('intl').lookup('notification.group.groupRingError.message')\n                                });\n                            });\n                    });\n                })\n                .catch(err => {\n                    Ember.Logger.error('Error saving model data', { err });\n\n                    reject({\n                        title: this.get('group.name'),\n                        message: this.get('intl').lookup('notification.group.saveError')\n                    });\n                });\n        });\n\n        promise\n            .then(param => {\n                this.get('group').reload();\n                this.get('notification').success(param.title, param.message, {\n                    icon: '',\n                    hideAfter: 8\n                });\n                this.sendAction('toggleEditing');\n                greetingData.callback(true);\n            })\n            .catch(param => {\n                this.get('notification').error(param.title, param.message, {\n                    icon: '',\n                    hideAfter: 8\n                });\n                greetingData.callback(false);\n                return Ember.RSVP.reject();\n            })\n            .finally(() => {\n                Ember.run.scheduleOnce('afterRender', this, () => {\n                    this.set('loading', false);\n                });\n            });\n    },\n\n    savePolicy(policy, retry = false) {\n        return policy.save().catch(err => {\n            if (err && err.errors && err.errors.length > 0) {\n                let error = err.errors[0];\n                if (retry && error.status === 400 && error.title.indexOf('Referenced key') >= 0) {\n                    return new Ember.RSVP.Promise((resolve, reject) => {\n                        Ember.run.later(() => {\n                            this.savePolicy(policy, false).then(resolve).catch(reject);\n                        }, 750);\n                    });\n                }\n            }\n            return Ember.RSVP.reject(err);\n        });\n    },\n\n    saveGreeting(greetingData) {\n        return this.get('group.greeting')\n            .then(greeting => {\n                if (!greetingData.resetGreeting) {\n                    return Ember.RSVP.resolve();\n                }\n\n                let path = greeting.greetings.VOICEMAIL.selfUri;\n                if (_.head(path) === '/') {\n                    path = path.substring(1);\n                }\n                const url = this.get('application').pcV2Uri(path);\n                return this.get('ajax').delete(url, { dataType: 'text' });\n            })\n            .then(() => {\n                let file = greetingData.recordingFile;\n                if (!file) {\n                    file = greetingData.voicemailFile;\n                }\n\n                return this.uploadGreeting(file);\n            })\n            .then(() => {\n                this.get('group').notifyPropertyChange('greeting');\n            });\n    },\n\n    saveModelData(ringSequenceData) {\n        const number = Ember.$('.group-ring-phone-input').intlTelInput('getNumber');\n        const extension = Ember.$('.group-ring-extension-input').val();\n\n        if (_.isEmpty(this.get('group.contactInfo.groupNumber'))) {\n            if (_.isEmpty(this.get('group.contactInfo'))) {\n                this.set('group.contactInfo', {});\n            }\n\n            const valueData = {\n                number: '',\n                countryCode: '',\n                extension: '',\n                acceptsSMS: false\n            };\n\n            const emptyData = [\n                {\n                    value: valueData\n                }\n            ];\n\n            this.set('group.contactInfo.groupNumber', emptyData);\n        }\n\n        this.set('group.contactInfo.groupNumber.firstObject.value.number', number);\n        this.set('group.contactInfo.groupNumber.firstObject.value.extension', extension);\n\n        const group = this.get('group');\n\n        if (!group.get('individuals')) {\n            group.set('individuals', {});\n        }\n\n        if (!group.get('owners')) {\n            group.set('owners', {});\n        }\n\n        const { individuals, owners } = ringSequenceData;\n        return Ember.RSVP.all([individuals, owners]).then(([individuals, owners]) => {\n            group.set('owners.owners', [], { overwrite: true });\n            const orgIndividuals = group.get('individuals.individuals').map(i => {\n                return i.guid;\n            });\n            group.set('individuals.individuals', [], { overwrite: true });\n\n            const addedDelta = individuals.filter(i => !orgIndividuals.includes(i));\n            const removedDelta = orgIndividuals.filter(i => !individuals.includes(i));\n\n            individuals.forEach(id => {\n                group.set('individuals.individuals', id);\n            });\n            owners.forEach(id => {\n                group.set('owners.owners', id);\n            });\n\n            if (this.get('session.features.groupProileNoIndividualsSave')) {\n                return this.get('group')\n                    .save()\n                    .then(() => this.addIndividuals(group, addedDelta, this.get('application')))\n                    .then(() => this.deleteIndividuals(group, removedDelta, this.get('application')));\n            } else {\n                return this.get('group').save();\n            }\n        });\n    },\n\n    uploadGreeting(file) {\n        if (!file) {\n            return Ember.RSVP.resolve({});\n        }\n\n        const uploadPath = `${this.get('application.purecloudAppsUri')}uploads/v2/greetings`;\n        const data = new FormData();\n        data.append('file', file);\n        data.append('ownerType', 'group');\n        data.append('ownerId', this.get('group.guid'));\n        data.append('name', 'voicemail');\n        data.append('greetingType', 'voicemail');\n\n        return new Ember.RSVP.Promise((resolve, reject) => {\n            const xhr = new XMLHttpRequest();\n            xhr.open('POST', uploadPath, true);\n            xhr.setRequestHeader('Authorization', `bearer ${this.get('session.accessToken')}`);\n            xhr.onreadystatechange = () => {\n                // Can't use XMLHttpRequest.DONE cause Pace, so we have to use the instance property\n                if (xhr.readyState === xhr.DONE) {\n                    this.uploadComplete(xhr, resolve, reject);\n                }\n            };\n            xhr.send(data);\n        });\n    },\n\n    uploadComplete(xhr, resolve, reject) {\n        const { responseText, status } = xhr;\n        const data = JSON.parse(responseText);\n        if (status === 200) {\n            this.get('logger').info('Successful voicemail greeting upload', data.correlationId);\n            resolve(data);\n        } else {\n            this.get('logger').error('Error uploading voicemail file:', { error: responseText });\n            reject(data);\n        }\n    },\n\n    addIndividuals(group, individuals, application) {\n        return this.individualsOperation(group, individuals, application, 'post');\n    },\n\n    deleteIndividuals(group, individuals, application) {\n        return this.individualsOperation(group, individuals, application, 'delete');\n    },\n\n    individualsOperation(group, individuals, application, method) {\n        if (_.isEmpty(individuals)) {\n            return Ember.RSVP.resolve({});\n        }\n\n        let url;\n        if (this.get('session.features.groupProileNoIndividualsSave')) {\n            url = application.pcV2Uri(`api/v2/groups/${group.get('id')}/members`);\n            if (method.toLowerCase() === 'post') {\n                return this.get('ajax')\n                    .post(url, {\n                        dataType: 'json',\n                        data: {\n                            memberIds: individuals,\n                            version: group.get('version')\n                        }\n                    })\n                    .then(() => {\n                        return group;\n                    });\n            } else if (method.toLowerCase() === 'delete') {\n                url = url.concat('?ids=', individuals);\n                return this.get('ajax')\n                    .delete(url)\n                    .then(() => {\n                        return group;\n                    });\n            }\n        }\n\n        return request(url, {\n            data: JSON.stringify({}),\n            method: method\n        }).then(res => {\n            const version = Ember.get(res, 'rel.version');\n            group.set('version', version);\n            return group;\n        });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport DS from 'ember-data';\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\n\nconst AUDIO_FORMAT = BrowserUtils.getSuggestedAudioTypeFrom(['webm', 'wav']);\n\nfunction isOggFileType(file) {\n    return new Ember.RSVP.Promise((resolve, reject) => {\n        const fileReader = new FileReader();\n        fileReader.onloadend = function (e) {\n            const arr = new window.Uint8Array(e.target.result);\n\n            const isOpus =\n                arr[28] === 0x4f &&\n                arr[29] === 0x70 &&\n                arr[30] === 0x75 &&\n                arr[31] === 0x73 &&\n                arr[32] === 0x48 &&\n                arr[33] === 0x65 &&\n                arr[34] === 0x61 &&\n                arr[35] === 0x64;\n            const isWav =\n                arr[0] === 0x52 &&\n                arr[1] === 0x49 &&\n                arr[2] === 0x46 &&\n                arr[3] === 0x46 &&\n                arr[8] === 0x57 &&\n                arr[9] === 0x41 &&\n                arr[10] === 0x56 &&\n                arr[11] === 0x45;\n            const isAiff =\n                arr[0] === 0x46 &&\n                arr[1] === 0x4f &&\n                arr[2] === 0x52 &&\n                arr[3] === 0x4d &&\n                arr[8] === 0x41 &&\n                arr[9] === 0x49 &&\n                arr[10] === 0x46 &&\n                arr[11] === 0x46;\n\n            // Only support opus encodings, not vorbis\n            // Support WAV and AIFF as well\n            // See: https://github.com/sindresorhus/file-type\n            if (isOpus || isWav || isAiff) {\n                resolve('opus');\n            } else {\n                reject(false);\n            }\n        };\n        fileReader.readAsArrayBuffer(file);\n    });\n}\n\nconst DEFAULT_TRANSCIPTION_DROPDOWN_LANGUAGE = 'en-us';\n\nexport default Ember.Component.extend({\n    //---- EMBER: BINDINGS ----//\n\n    classNames: ['group-ring-settings'],\n\n    //---- SERVICES ----//\n\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    store: Ember.inject.service(),\n    phone: Ember.inject.service(),\n    pigeon: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    addressFormat: Ember.inject.service('addressformat'),\n\n    //---- CONTEXT & STATES ----//\n\n    entity: null,\n    number: null,\n    extension: null,\n    originalNumber: null,\n    originalExtension: null,\n    orgVoicemailPolicy: null,\n    canEditGroupTelephonySettings: true,\n    voicemailFile: null,\n    showVoicemailGreetingOptions: false,\n    resetGreeting: false,\n    rotateCallSecondsError: false,\n    numberOfRotationsError: false,\n    pigeonEventHandler: null,\n\n    disableReplaceOverflowBtn: Ember.computed.not('canEditGroupTelephonySettings'),\n\n    disableRingInputs: Ember.computed('editing', 'canEditGroupTelephonySettings', function () {\n        return !this.get('editing') || !this.get('canEditGroupTelephonySettings');\n    }),\n\n    hasExtension: Ember.computed.notEmpty('extension'),\n\n    hasNumber: Ember.computed.notEmpty('number'),\n\n    numberOfRotations: Ember.computed.alias('entity.policy.stopRingingAfterRotations'),\n\n    rotateCallSeconds: Ember.computed.alias('entity.policy.rotateCallsSecs'),\n\n    forwardingOn: Ember.computed('entity.policy.overflowGroupId', {\n        get() {\n            return DS.PromiseObject.create({\n                promise: this.get('overflowGroup').then(overflowGroup => !!overflowGroup)\n            });\n        },\n\n        set(key, value) {\n            return DS.PromiseObject.create({ promise: Ember.RSVP.resolve(value) });\n        }\n    }),\n\n    routeSelection: Ember.computed('entity.policy.groupAlertType', {\n        get() {\n            return this.get('entity.policy.groupAlertType') !== null\n                ? this.get('entity.policy.groupAlertType')\n                : 'RANDOM';\n        },\n\n        set(key, value) {\n            return this.set('entity.policy.groupAlertType', value);\n        }\n    }),\n\n    overflowGroup: Ember.computed('entity.policy.overflowGroupId', {\n        get() {\n            let promise;\n            if (!this.get('entity.policy.overflowGroupId')) {\n                promise = Ember.RSVP.resolve(null);\n            } else {\n                promise = this.get('store').findRecord('group', this.get('entity.policy.overflowGroupId'));\n            }\n            return DS.PromiseObject.create({ promise });\n        },\n\n        set(key, value) {\n            return value;\n        }\n    }),\n\n    editingVoicemailDisabled: Ember.computed('isEmpty', 'isValid', 'haveExtensionError', function () {\n        return this.get('isEmpty') || !this.get('isValid') || this.get('haveExtensionError');\n    }),\n\n    ringTimeMs: Ember.computed(\n        'rotateCallSeconds',\n        'numberOfRotations',\n        'numberOfRotationsError',\n        'rotateCallSecondsError',\n        function () {\n            const seconds = parseInt(this.get('rotateCallSeconds'), 10);\n            const rotations = parseInt(this.get('numberOfRotations'), 10);\n            const { numberOfRotationsError, rotateCallSecondsError } = this.getProperties(\n                'numberOfRotationsError',\n                'rotateCallSecondsError'\n            );\n            if (numberOfRotationsError || rotateCallSecondsError) {\n                return null;\n            }\n\n            const total = seconds * rotations;\n            return total * 1000;\n        }\n    ),\n\n    isValid: Ember.computed(\n        'invalidExtension',\n        'invalidPhoneNumber',\n        'haveNumberAndExtension',\n        'number',\n        'extension',\n        'haveExtensionError',\n        'duplicateNumberError',\n        function () {\n            if (this.get('haveNumberAndExtension')) {\n                return false;\n            }\n\n            if (this.get('isEmpty')) {\n                return false;\n            }\n\n            if (!this.get('hasNumber')) {\n                return !(this.get('invalidExtension') || this.get('haveExtensionError'));\n            }\n\n            return !this.get('invalidPhoneNumber') && !this.get('duplicateNumberError');\n        }\n    ),\n\n    errorMessage: Ember.computed('isValid', function () {\n        if (!this.get('isValid')) {\n            if (this.get('isEmpty')) {\n                return this.get('intl').t('purecloud.callForwarding.missingNumberAndExtension');\n            } else if (this.get('haveNumberAndExtension')) {\n                return this.get('intl').t('purecloud.callForwarding.numberAndExtension');\n            } else if (this.get('invalidExtension')) {\n                return this.get('intl').t('purecloud.callForwarding.invalidExtension');\n            } else if (this.get('haveExtensionError')) {\n                if (this.get('isExtensionNotInPool')) {\n                    return this.get('intl').t('groups.groupRing.extensionError');\n                }\n                return this.get('intl').t('groups.groupRing.inUseError');\n            } else if (this.get('duplicateNumberError')) {\n                return this.get('intl').t('groups.groupRing.inUseError');\n            } else if (this.get('invalidPhoneNumber')) {\n                return this.get('intl').t('purecloud.acdInteraction.sms.errors.invalidNumberFormat');\n            }\n        }\n    }),\n\n    duplicateNumberError: Ember.computed('entity.number.rel.errorCode', 'number', 'originalNumber', function () {\n        let number = this.get('number');\n        let originalNumber = this.get('originalNumber');\n\n        if (originalNumber && number !== originalNumber) {\n            return false;\n        }\n\n        return this.get('entity.number.rel.errorCode') === 'DUPLICATE_VALUE';\n    }),\n\n    haveExtensionError: Ember.computed('entity.number.rel.errorCode', 'extension', 'originalExtension', function () {\n        const extension = this.get('extension');\n        const originalExtension = this.get('originalExtension');\n\n        if (originalExtension && extension !== originalExtension) {\n            return false;\n        }\n\n        const code = this.get('entity.number.rel.errorCode');\n        return !!code && code !== 'DUPLICATE_VALUE';\n    }),\n\n    isExtensionResourceInUse: Ember.computed('haveExtensionError', function () {\n        if (!this.get('haveExtensionError')) {\n            return false;\n        }\n\n        const code = this.get('entity.number.rel.errorCode');\n        return code === 'RESOURCE_ALREADY_IN_USE';\n    }),\n\n    isExtensionNotInPool: Ember.computed('haveExtensionError', function () {\n        if (!this.get('haveExtensionError')) {\n            return false;\n        }\n\n        const code = this.get('entity.number.rel.errorCode');\n        return code === 'EXTENSION_MUST_BE_ASSGINED_TO_AN_EXTENSION_POOL';\n    }),\n\n    invalidExtension: Ember.computed('extension', 'haveNumberAndExtension', function () {\n        const ext = this.get('extension');\n        const regex = /^\\d+$/; // simple regex test, not meant to be expansive\n        if (!this.get('number') && !_.isEmpty(ext)) {\n            return !regex.test(ext);\n        }\n        return false;\n    }),\n\n    invalidPhoneNumber: Ember.computed('number', function () {\n        if (this.get('hasNumber')) {\n            const elem = this.$('.group-ring-phone-input');\n            if (!_.isEmpty(elem.val())) {\n                return !this.$('.group-ring-phone-input').intlTelInput('isValidNumber');\n            }\n        }\n        return false;\n    }),\n\n    inputErrorClass: Ember.computed('haveNumberAndExtension', 'isEmpty', 'invalidPhoneNumber', function () {\n        if (this.get('haveNumberAndExtension') || this.get('isEmpty')) {\n            return 'field-error';\n        }\n\n        if (this.get('invalidPhoneNumber')) {\n            return 'field-warning';\n        }\n\n        return '';\n    }),\n\n    isEmpty: Ember.computed('number', 'extension', function () {\n        const number = this.get('number');\n        const extension = this.get('extension');\n        return _.isEmpty(number) && _.isEmpty(extension);\n    }),\n\n    haveNumberAndExtension: Ember.computed('number', 'extension', function () {\n        const number = this.get('number');\n        const extension = this.get('extension');\n        return !_.isEmpty(number) && !_.isEmpty(extension);\n    }),\n\n    callNotice: Ember.computed(function () {\n        return this.get('intl').lookup('groups.modal.groupRingNotice').toString();\n    }),\n\n    routeTypes: Ember.computed(function () {\n        return [\n            {\n                value: 'RANDOM',\n                translation: this.get('intl').t('groups.groupRing.routeTypes.broadcast')\n            },\n            {\n                value: 'SEQUENTIAL',\n                translation: this.get('intl').t('groups.groupRing.routeTypes.sequential')\n            },\n            {\n                value: 'ROUND_ROBIN',\n                translation: this.get('intl').t('groups.groupRing.routeTypes.rotary')\n            }\n        ];\n    }),\n\n    routeSelectionType: Ember.computed('routeSelection', function () {\n        switch (this.get('routeSelection')) {\n            case 'RANDOM':\n                return 'broadcast';\n            case 'SEQUENTIAL':\n                return 'sequential';\n            case 'ROUND_ROBIN':\n                return 'rotary';\n            default:\n                return 'broadcast';\n        }\n    }),\n\n    routeDescription: Ember.computed('routeSelectionType', function () {\n        return this.get('intl').t(`groups.groupRing.routeDescriptions.${this.get('routeSelectionType').toLowerCase()}`);\n    }),\n\n    selectedRouteType: Ember.computed('routeSelectionType', function () {\n        return this.get('intl').t(`groups.groupRing.routeTypes.${this.get('routeSelectionType').toLowerCase()}`);\n    }),\n\n    rotateCallsDisplayText: Ember.computed('rotateCallSeconds', function () {\n        return this.get('intl').t('groups.groupRing.displayOnly.rotateCalls', { value: this.get('rotateCallSeconds') });\n    }),\n\n    stopRingingDisplayText: Ember.computed('numberOfRotations', function () {\n        return this.get('intl').t('groups.groupRing.displayOnly.stopRinging', { value: this.get('numberOfRotations') });\n    }),\n\n    searchText: Ember.computed(function () {\n        return this.get('intl').t('groups.groupRing.groupSearch');\n    }),\n\n    playerOptions: Ember.computed(function () {\n        return {\n            html5: true,\n            volume: 0.5,\n            format: ['ogg']\n        };\n    }),\n\n    greetingOptions: Ember.computed(function () {\n        // greetings seem to have a low volume\n        return {\n            html5: true,\n            volume: 1.0,\n            format: [AUDIO_FORMAT]\n        };\n    }),\n\n    hasGreeting: Ember.computed('entity.greeting.content', {\n        get() {\n            const greeting = this.get('entity.greeting.content');\n            return !!greeting;\n        },\n\n        set(key, value) {\n            return value;\n        }\n    }),\n\n    greetingAudioSource: Ember.computed('entity.greeting', function () {\n        const greeting = this.get('entity.greeting');\n        return greeting\n            .then(data => {\n                let path = data.greetings.VOICEMAIL.selfUri;\n                if (_.head(path) === '/') {\n                    path = path.substring(1);\n                }\n                path = path.concat('/media');\n                const url = this.get('application').pcV2Uri(path);\n                return this.get('ajax').request(url, {\n                    data: { formatId: AUDIO_FORMAT }\n                });\n            })\n            .then(data => {\n                return data.mediaFileUri;\n            })\n            .catch(() => {\n                this.get('logger').error('Error loading media for group:', {\n                    groupId: this.get('entity.guid')\n                });\n                this.set('hasGreeting', false);\n            });\n    }),\n\n    displaySpinner: Ember.computed('entity.greeting.isFulfilled', 'waitingOnGreeting', function () {\n        return !this.get('entity.greeting.isFulfilled') || this.get('waitingOnGreeting');\n    }),\n\n    reasons: Ember.computed(\n        'entity.policy.{enabled,sendEmailNotifications,disableEmailPii}',\n        'orgVoicemailPolicy',\n        'session.org',\n        ///\n        function () {\n            return {\n                org: {\n                    isMissing: _.isEmpty(this.get('orgVoicemailPolicy')),\n                    enablesHipaa: this.get('session.org.hasHipaaEnabled'),\n                    // disablesVoicemails: !this.get('orgVoicemailPolicy.enabled'),\n                    // ^^^ NOTE(as-of-writing): This will always be `true` but we ignore it.\n                    disablesEmailNotifications: !this.get('orgVoicemailPolicy.sendEmailNotifications'),\n                    disablesPiiInEmailNotifications: this.get('orgVoicemailPolicy.disableEmailPii'),\n                    disablesVMTranscription: !this.get('orgVoicemailPolicy.includeEmailTranscriptions')\n                },\n                group: {\n                    isMissing: _.isEmpty(this.get('entity.policy')),\n                    disablesVoicemails: !this.get('entity.policy.enabled'),\n                    disablesEmailNotifications:\n                        !this.get('entity.policy.sendEmailNotifications') ||\n                        !this.get('orgVoicemailPolicy.sendEmailNotifications'),\n                    disablesPiiInEmailNotifications:\n                        this.get('entity.policy.disableEmailPii') || this.get('entity.policy.disableEmailPii')\n                }\n            };\n        }\n    ),\n\n    // NOTE(as-of-writing):\n    //   The property `orgVoicemailPolicy.enabled` exists, but it is unused, uneditable,\n    //   and its default value is `false`. Unless/until the org's setting affects\n    //   group policies or permissions for voicemails, we should ignore it.\n    voicemails: Ember.computed(\n        'entity.policy.enabled',\n        'reasons',\n        ///\n        function () {\n            let show;\n            // Always show it.\n            show = true;\n\n            let disable;\n            if (this.get('reasons.org.isMissing')) {\n                // Disable it if the org's policy is missing.\n                disable = true;\n            } else if (this.get('reasons.group.isMissing')) {\n                // Disable it if the group's policy is missing.\n                disable = true;\n            } else if (!this.get('canEditGroupTelephonySettings')) {\n                // Disable it if the user cannot edit telephony settings\n                // Should not make it this far as the org policy will be missing\n                disable = true;\n            } else {\n                // Use the inverse of `show`.\n                disable = !show;\n                // (This is probably unnecessary, but let's be cautious.)\n            }\n\n            let state;\n            if (this.get('reasons.group.isMissing')) {\n                // We cannot know its state if the group's policy is missing.\n                state = null;\n            } else if (disable && this.get('canEditGroupTelephonySettings')) {\n                // Default to `false` if it is disabled.\n                // only default the state to false when disabled and user has access to telephony settings\n                // if user does not have access to telephony settings, we will want to show the actual value\n                // of the voicemail toggle while it is disabled.\n                state = false;\n            } else {\n                // Use the real value.\n                state = this.get('entity.policy.enabled');\n            }\n\n            return { show, disable, state };\n        }\n    ),\n\n    transcriptionToggle: Ember.computed(\n        'entity.policy.includeEmailTranscriptions',\n        'reasons',\n        'emailNotifications.state',\n        ///\n        function () {\n            const show = this.get('emailNotifications.state');\n            let disable = false;\n            if (\n                this.get('reasons.org.enablesHipaa') ||\n                this.get('reasons.org.disablesPiiInEmailNotifications') ||\n                this.get('reasons.group.disablesPiiInEmailNotifications') ||\n                this.get('reasons.org.disablesVMTranscription') ||\n                !this.get('canEditGroupTelephonySettings')\n            ) {\n                disable = true;\n            }\n\n            let state;\n            if (this.get('reasons.group.isMissing')) {\n                // We cannot know its state if the group's policy is missing.\n                state = null;\n            } else if (disable && this.get('canEditGroupTelephonySettings')) {\n                state = false;\n            } else {\n                // Use the real value.\n                state = this.get('entity.policy.includeEmailTranscriptions');\n            }\n            return { show, disable, state };\n        }\n    ),\n\n    transcriptionDropDown: Ember.computed(\n        'entity.policy.languagePreference',\n        'reasons',\n        'transcriptionToggle',\n        ///\n        function () {\n            const show = !this.get('transcriptionToggle.disable') && this.get('transcriptionToggle.state');\n            const disable = !this.get('canEditGroupTelephonySettings');\n\n            let state;\n            if (this.get('reasons.group.isMissing')) {\n                // We cannot know its state if the group's policy is missing.\n                state = null;\n            } else if (!this.get('entity.policy.languagePreference')) {\n                state = DEFAULT_TRANSCIPTION_DROPDOWN_LANGUAGE;\n            } else {\n                state = this._getLanguagePreference(this.get('entity.policy'));\n            }\n            return { show, disable, state };\n        }\n    ),\n\n    transcriptionLanguages: Ember.computed(\n        'intl.languages',\n        ///\n        function () {\n            const languagesObj = this.get('intl').get('languages');\n            // Populate lanaguagesArr with languages and make the selected language the transcriptionDropDown state\n            return Object.keys(languagesObj).map(key => {\n                return {\n                    key: key,\n                    value: languagesObj[key]\n                };\n            });\n        }\n    ),\n\n    emailNotifications: Ember.computed(\n        'entity.policy.sendEmailNotifications',\n        'reasons',\n        'voicemails',\n        ///\n        function () {\n            let show;\n            if (this.get('reasons.group.disablesVoicemails')) {\n                // Hide it if the group disables voicemails.\n                show = false;\n            } else if (!this.get('canEditGroupTelephonySettings')) {\n                show = false;\n            } else {\n                // Inherit `voicemails.show`.\n                show = this.get('voicemails.show');\n            }\n\n            let disable;\n            if (this.get('reasons.org.disablesEmailNotifications')) {\n                // Disable it if the org disables email notifications.\n                disable = true;\n            } else {\n                // Inherit `voicemails.disable` or use the inverse of `show`.\n                disable = this.get('voicemails.disable') || !show;\n                // (This is probably unnecessary, but let's be cautious.)\n            }\n\n            let state;\n            if (this.get('reasons.group.isMissing')) {\n                // We cannot know its state if the group's policy is missing.\n                state = null;\n            } else if (disable) {\n                // Default to `false` if it is disabled.\n                state = false;\n            } else {\n                // Use the real value.\n                state = this.get('entity.policy.sendEmailNotifications');\n            }\n\n            return { show, disable, state };\n        }\n    ),\n\n    piiInEmailNotifications: Ember.computed(\n        'emailNotifications',\n        'entity.policy.disableEmailPii',\n        'reasons',\n        ///\n        function () {\n            let show;\n            if (this.get('reasons.group.disablesEmailNotifications')) {\n                // Hide it if the group disables email notifications.\n                show = false;\n            } else {\n                // Inherit `emailNotifications.show`.\n                show = this.get('emailNotifications.show');\n            }\n\n            let disable;\n            if (this.get('reasons.org.enablesHipaa')) {\n                // Disable it if the org enables HIPAA.\n                disable = true;\n            } else if (this.get('reasons.org.disablesPiiInEmailNotifications')) {\n                // Disable it if the org disables PII in email notifications.\n                disable = true;\n            } else {\n                // Inherit `emailNotifications.disable` or use the inverse of `show`.\n                disable = this.get('emailNotifications.disable') || !show;\n                // (This is probably unnecessary, but let's be cautious.)\n            }\n\n            let state;\n            if (this.get('reasons.group.isMissing')) {\n                // We cannot know its state if the group's policy is missing.\n                state = null;\n            } else if (disable) {\n                // Default to `false` if it is disabled.\n                state = false;\n            } else {\n                // Use the real value.\n                state = !this.get('entity.policy.disableEmailPii');\n            }\n\n            return { show, disable, state };\n        }\n    ),\n\n    //---- EMBER: LIFECYCLE METHODS ----//\n\n    // Initialize the component.\n    init(...args) {\n        this._super(...args);\n        if (this.attrs.appendSave) {\n            this.saveFunction = Ember.run.bind(this, this.save);\n            this.attrs.appendSave(this.saveFunction);\n        }\n        this.get('disableSave')(!this.get('isValid'));\n        this.pigeonEventHandler = this.handlePigeonEvent.bind(this);\n        this.registerToPigeonTopic();\n        this.get('pigeon').on('greetings', this, this.pigeonEventHandler);\n    },\n\n    didInsertElement(...args) {\n        this._super(...args);\n\n        this.set('saveContactInfo', this.save.bind(this));\n\n        this._setupInputs();\n    },\n\n    didUpdateAttrs(...args) {\n        this._super(...args);\n\n        this._setupInputs();\n    },\n\n    willDestroyElement(...args) {\n        this._super(...args);\n        if (this.attrs.removeSave) {\n            this.attrs.removeSave(this.saveFunction);\n        }\n        this.get('pigeon').off('greetings', this.pigeonEventHandler);\n    },\n\n    _getLanguagePreference(policy) {\n        let value = policy.get('languagePreference');\n        if (value === 'en_US') {\n            // backend stores it as en_US but we use en-us\n            value = DEFAULT_TRANSCIPTION_DROPDOWN_LANGUAGE;\n        }\n        return value;\n    },\n\n    // `_setupInputs` is a helper method used exclusively in the lifecycle methods.\n    _setupInputs() {\n        const previousEntity = this.get('_entity');\n        const entity = this.get('entity');\n\n        if (entity !== previousEntity) {\n            Ember.run.scheduleOnce('afterRender', this, this.setupInput);\n            Ember.run.scheduleOnce('afterRender', this, this.initNumber);\n\n            this.set('_entity', entity);\n        }\n    },\n\n    //---- ACTIONS & OBSERVERS & METHODS ----//\n\n    actions: {\n        updateNumber(event) {\n            this.set('number', event.target.value);\n        },\n\n        updateExtension(event) {\n            this.set('extension', event.target.value);\n        },\n\n        updateRotateCalls(value) {\n            const number = parseInt(value, 10);\n            if (typeof number === 'number') {\n                this.set('rotateCallSeconds', number);\n            }\n        },\n\n        updateRotations(value) {\n            const number = parseInt(value, 10);\n            if (typeof number === 'number') {\n                this.set('numberOfRotations', number);\n                if (this.attrs.rotationsChanged) {\n                    this.attrs.rotationsChanged(number);\n                }\n            }\n        },\n\n        toggleCallForwarding() {\n            this.set('forwardingOn', !this.get('forwardingOn.content'));\n            if (!this.get('forwardingOn.content')) {\n                this.set('overflowGroup', null);\n            }\n        },\n\n        selectOverflowGroup(group) {\n            this.set('overflowGroup', group);\n        },\n\n        replaceOverflowGroup() {\n            this.set('overflowGroup', null);\n        },\n\n        toggleVoicemails() {\n            // Directly toggle the state in the group's policy.\n            return this.toggleProperty('entity.policy.enabled');\n        },\n\n        toggleEmailNotifications() {\n            // Directly toggle the state in the group's policy.\n            return this.toggleProperty('entity.policy.sendEmailNotifications');\n        },\n\n        togglePiiInEmailNotifications() {\n            // Directly toggle the state in the group's policy.\n            return this.toggleProperty('entity.policy.disableEmailPii');\n        },\n\n        toggleShowVoicemailGreetingOptions() {\n            return this.toggleProperty('showVoicemailGreetingOptions');\n        },\n\n        toggleTranscriptions() {\n            return this.toggleProperty('entity.policy.includeEmailTranscriptions');\n        },\n\n        selectVoicemailFile(file, recording) {\n            if (recording) {\n                this.set('recordingFile', file);\n                this.set('voicemailFile', null);\n            } else {\n                this.set('voicemailFile', file);\n                this.set('recordingFile', null);\n            }\n        },\n\n        selectTranscriptionLanguage(event) {\n            this.set('entity.policy.languagePreference', event.target.value);\n        },\n\n        triggerUpload() {\n            if (this.get('hasGreeting')) {\n                return;\n            }\n\n            this.$('input.file-upload').trigger('click');\n        },\n\n        chooseFile() {\n            const input = this.$('input.file-upload');\n            const file = Ember.get(input[0], 'files.0') || [];\n\n            if (file) {\n                isOggFileType(file)\n                    .then(format => {\n                        Ember.Logger.info('Voicemail: Correct file type', format);\n                        this.send('selectVoicemailFile', file, false);\n                    })\n                    .catch(() => {\n                        const title = this.get('intl').lookup('notification.group.fileUpload.title');\n                        const message = this.get('intl').lookup('notification.group.fileUpload.message');\n                        this.get('notification').error(title, message);\n                    });\n            } else {\n                this.set('errorSelectingFile', true);\n            }\n\n            this.set('showVoicemailGreetingOptions', false);\n        },\n\n        recordingReady(file) {\n            this.send('selectVoicemailFile', file, true);\n\n            this.set('resetGreeting', false);\n        },\n\n        resetRecording() {\n            this.set('recordingFile', null);\n        },\n\n        resetFile() {\n            this.set('voicemailFile', null);\n        },\n\n        resetCurrentGreeting() {\n            if (!this.get('hasGreeting')) {\n                this.send('resetFile');\n                this.send('resetRecording');\n            } else {\n                this.set('resetGreeting', true);\n                this.set('hasGreeting', false);\n            }\n\n            this.set('showVoicemailGreetingOptions', false);\n        },\n\n        audioPlayerError() {\n            this.set('hasGreeting', false);\n        },\n\n        disableSave(key, value) {\n            this.set(key, value);\n            this.get('disableSave')(value);\n        }\n    },\n\n    setConfirmDisabled: Ember.observer('isValid', function () {\n        if (!this.get('isValid')) {\n            let badNumber = this.get('invalidPhoneNumber') || this.get('duplicateNumberError');\n            let badExtension =\n                this.get('invalidExtension') || this.get('haveExtensionError') || this.get('haveNumberAndExtension');\n            let isEmpty = this.get('isEmpty');\n            if (badExtension || isEmpty) {\n                this.get('disableSave')(true);\n            } else if (badNumber) {\n                // Don't disable save if the only issue is a bad number\n                this.get('disableSave')(false);\n            } else {\n                // Fall through to disable save\n                this.get('disableSave')(true);\n            }\n        } else {\n            this.get('disableSave')(false);\n        }\n    }),\n\n    editingObserver: Ember.observer('editing', function () {\n        if (!this.get('editing')) {\n            this.set('voicemailFile', null);\n            this.set('recordingFile', null);\n            this.notifyPropertyChange('overflowGroup');\n            this.notifyPropertyChange('forwardingOn');\n            this.initNumber();\n        }\n    }),\n\n    registerToPigeonTopic() {\n        const groupId = this.get('entity.guid');\n        const groupTopic = `v2.groups.${groupId}.greetings`;\n        this.get('pigeon').registerPriorityTopic(groupTopic);\n    },\n\n    handlePigeonEvent() {\n        this.get('entity').notifyPropertyChange('greeting');\n        this.set('waitingOnGreeting', false);\n    },\n\n    setupInput() {\n        this.$('.group-ring-phone-input').intlTelInput({\n            nationalMode: false,\n            utilsScript: `${this.get('application.urlprefix')}assets/intltelinput/utils.js`\n        });\n    },\n\n    initNumber() {\n        const info = this.get('entity.contactInfo.groupNumber.firstObject.value');\n        const inputElem = this.$('.group-ring-phone-input');\n        const extElem = this.$('.group-ring-extension-input');\n\n        const number = info && info.number ? info.number : '';\n        const extension = info && info.extension ? info.extension : '';\n\n        inputElem.intlTelInput('setNumber', number);\n        extElem.val(extension);\n\n        this.set('number', number);\n        this.set('extension', extension);\n\n        this.set('originalNumber', number);\n        this.set('originalExtension', extension);\n    },\n\n    save() {\n        const overflowGroupId = this.get('overflowGroup') === null ? null : this.get('overflowGroup.guid');\n        this.set('entity.policy.overflowGroupId', overflowGroupId);\n\n        this.set('originalExtension', this.get('extension'));\n        if (this.get('voicemailFile') || this.get('recordingFile')) {\n            this.set('waitingOnGreeting', true);\n        }\n\n        if (overflowGroupId === null) {\n            this.set('forwardingOn', false);\n        }\n\n        return {\n            type: 'group-ring-settings',\n            isExtensionResourceInUse: this.get('isExtensionResourceInUse'),\n            isExtensionNotInPool: this.get('isExtensionNotInPool'),\n            recordingFile: this.get('recordingFile'),\n            voicemailFile: this.get('voicemailFile'),\n            resetGreeting: this.get('resetGreeting'),\n            isEmpty: this.get('isEmpty'),\n            callback: this.finishedSaving.bind(this)\n        };\n    },\n\n    finishedSaving(succeeded) {\n        if (succeeded) {\n            this.set('resetGreeting', false);\n        } else {\n            this.set('waitingOnGreeting', false);\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport Component from 'ember-component';\nimport computed from 'ember-computed';\n\nconst { run } = Ember;\n\nexport default Component.extend({\n    classNames: ['inline-number-input'],\n    classNameBindings: ['disabled:input-disabled'],\n\n    attrs: {\n        update: () => {}\n    },\n\n    value: null,\n    disabled: false,\n\n    isValid: computed('value', function () {\n        const regex = /^[0-9]+$/g;\n        const value = this.get('value');\n        const number = parseInt(value, 10);\n\n        if (_.isEmpty(value)) {\n            return false;\n        }\n\n        return regex.test(value) && number > 0 && number < 100;\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        run.scheduleOnce('afterRender', this, () => this.$('input').val(this.get('value')));\n        run.scheduleOnce('afterRender', this, this.attachListeners);\n        run.scheduleOnce('afterRender', this, this.disableInput);\n    },\n\n    willRender() {\n        this._super(...arguments);\n\n        const input = this.$('input');\n        if (input) {\n            input.off();\n        }\n    },\n\n    didUpdateAttrs() {\n        this._super(...arguments);\n\n        run.scheduleOnce('afterRender', this, this.attachListeners);\n        run.scheduleOnce('afterRender', this, this.disableInput);\n        run.scheduleOnce('afterRender', this, this.setValue);\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n\n        this.$('input').off();\n    },\n\n    disableInput() {\n        const disabled = this.get('disabled');\n        this.$('input').attr('disabled', disabled);\n        this.set('disabled', disabled);\n    },\n\n    attachListeners() {\n        const input = this.$('input');\n\n        if (this.get('focused')) {\n            input.focus().val(input.val());\n        }\n\n        input.on('input', event => {\n            Ember.run(() => {\n                const value = event.target.value;\n                this.set('value', value);\n\n                this.attrs.disableSave(!this.get('isValid'));\n                this.attrs.update(value);\n            });\n        });\n\n        input.on('focus', () => {\n            Ember.run(() => this.set('focused', true));\n        });\n\n        input.on('blur', () => {\n            Ember.run(() => this.set('focused', false));\n        });\n    },\n\n    setValue() {\n        const input = this.$('input');\n        const value = this.get('value');\n        if (input && value) {\n            input.val(value);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"MFx2gQuC\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"t\\\"],[[28,[\\\"key\\\"]]],null],true]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-contact-panel/group-ring-settings/inline-number-input/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"nuF7zZlT\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"unless\\\"],[[28,[\\\"editing\\\"]],\\\"display-only\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"group-number contact-info-group \\\",[33,[\\\"if\\\"],[[28,[\\\"isValid\\\"]],\\\"valid\\\",\\\"error\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label group-phone-label\\\"],[15,\\\"for\\\",\\\"group-number\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.modal.groupRing\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"number phone-field \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"hasNumber\\\"]]],null],[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null]],null],\\\"hide-field\\\"],null]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"input\\\",[]],[15,\\\"type\\\",\\\"tel\\\"],[15,\\\"id\\\",\\\"group-number\\\"],[16,\\\"class\\\",[34,[\\\"group-ring-phone-input form-control \\\",[26,[\\\"inputErrorClass\\\"]]]]],[16,\\\"disabled\\\",[26,[\\\"disableRingInputs\\\"]],null],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateNumber\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"extension \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"hasExtension\\\"]]],null],[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null]],null],\\\"hide-field\\\"],null]]]],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[11,\\\"input\\\",[]],[16,\\\"class\\\",[34,[\\\"group-ring-extension-input form-control\\\\n                        \\\",[33,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"invalidExtension\\\"]],[28,[\\\"haveNumberAndExtension\\\"]],[28,[\\\"isEmpty\\\"]]],null],\\\"field-error\\\"],null]]]],[16,\\\"disabled\\\",[26,[\\\"disableRingInputs\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null],null],[15,\\\"maxLength\\\",\\\"9\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null],null],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateExtension\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"error-message \\\",[26,[\\\"inputErrorClass\\\"]]]]],[13],[1,[26,[\\\"errorMessage\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"route-type contact-info-group\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label route-label\\\"],[15,\\\"for\\\",\\\"route-type\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.routeType\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"group-route-selection\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"selectedRouteType\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"x-select\\\"],null,[[\\\"class\\\",\\\"value\\\",\\\"disabled\\\",\\\"action\\\"],[\\\"form-control\\\",[28,[\\\"routeSelection\\\"]],[33,[\\\"not\\\"],[[28,[\\\"canEditGroupTelephonySettings\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],[33,[\\\"mut\\\"],[[28,[\\\"routeSelection\\\"]]],null]],null]]],{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"routeTypes\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\"],[[28,[\\\"type\\\",\\\"value\\\"]]]],{\\\"statements\\\":[[1,[28,[\\\"type\\\",\\\"translation\\\"]],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"type\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"route-notice\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"routeDescription\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"rotate-calls contact-info-group \\\",[33,[\\\"if\\\"],[[28,[\\\"rotateCallSecondsError\\\"]],\\\"error\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[26,[\\\"rotateCallsDisplayText\\\"]],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label route-label route-setting-label\\\"],[15,\\\"for\\\",\\\"rotate-calls\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.rotateCalls\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"form-container \\\",[33,[\\\"if\\\"],[[28,[\\\"rotateCallSecondsError\\\"]],\\\"input-error\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"group-profile/group-contact-panel/group-ring-settings/inline-number-input\\\"],null,[[\\\"key\\\",\\\"value\\\",\\\"disabled\\\",\\\"update\\\",\\\"disableSave\\\"],[\\\"groups.groupRing.everyNumberOfSeconds\\\",[28,[\\\"rotateCallSeconds\\\"]],[33,[\\\"not\\\"],[[28,[\\\"canEditGroupTelephonySettings\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],\\\"updateRotateCalls\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"disableSave\\\",\\\"rotateCallSecondsError\\\"],null]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"rotateCallSecondsError\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.invalidNumberError\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"ringing-time contact-info-group\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[26,[\\\"stopRingingDisplayText\\\"]],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label route-setting-label\\\"],[15,\\\"for\\\",\\\"ringing-time\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.stopRinging\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"form-container \\\",[33,[\\\"if\\\"],[[28,[\\\"numberOfRotationsError\\\"]],\\\"input-error\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"group-profile/group-contact-panel/group-ring-settings/inline-number-input\\\"],null,[[\\\"key\\\",\\\"value\\\",\\\"disabled\\\",\\\"update\\\",\\\"disableSave\\\"],[\\\"groups.groupRing.afterNumberOfRotations\\\",[28,[\\\"numberOfRotations\\\"]],[33,[\\\"not\\\"],[[28,[\\\"canEditGroupTelephonySettings\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],\\\"updateRotations\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"disableSave\\\",\\\"numberOfRotationsError\\\"],null]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"numberOfRotationsError\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.invalidNumberError\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"ringTimeMs\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"max-ring-time\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.maxRingTime\\\"],[[\\\"time\\\"],[[33,[\\\"time-duration\\\"],null,[[\\\"durationInMs\\\"],[[28,[\\\"ringTimeMs\\\"]]]]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"overflow contact-info-group\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.overflow\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container backup-container\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-container\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"overflow-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.forwardCall\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"forwardingOn\\\",\\\"content\\\"]],[33,[\\\"not\\\"],[[28,[\\\"canEditGroupTelephonySettings\\\"]]],null],\\\"toggleCallForwarding\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"forwardingOn\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"overflowGroup\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[6,[\\\"entity-search\\\"],null,[[\\\"type\\\",\\\"disabled\\\",\\\"placeholder\\\",\\\"select\\\"],[\\\"groups\\\",[33,[\\\"not\\\"],[[28,[\\\"canEditGroupTelephonySettings\\\"]]],null],[28,[\\\"searchText\\\"]],\\\"selectOverflowGroup\\\"]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"has-group-number\\\"],[[28,[\\\"result\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"result-container clickable scroll-entity \\\",[33,[\\\"if\\\"],[[28,[\\\"result\\\",\\\"selected\\\"]],\\\"selected\\\"],null]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],[28,[\\\"selectResult\\\"]],[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\"],[[28,[\\\"result\\\"]],false,false]]],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"result-container scroll-entity disabled\\\"],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\",\\\"disabled\\\"],[[28,[\\\"result\\\"]],false,false,true]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[\\\"top\\\"]],{\\\"statements\\\":[[0,\\\"                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.overflowGroupNotSelectable\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"result\\\",\\\"selectResult\\\"]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"overflow-selected\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\"],[[28,[\\\"overflowGroup\\\"]],false,false]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[16,\\\"disabled\\\",[26,[\\\"disableReplaceOverflowBtn\\\"]],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"replaceOverflowGroup\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.replace\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"overflow-notice\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.overflowNotice\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"disabled-message\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.overflowDisabled\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-voicemail contact-info-group\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-container\\\"],[15,\\\"data-t\\\",\\\"voicemails--input-container\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label overflow-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.voicemails.label\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"voicemails\\\",\\\"state\\\"]],[28,[\\\"voicemails\\\",\\\"disable\\\"]],\\\"toggleVoicemails\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[15,\\\"data-t\\\",\\\"voicemails--info-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"voicemails\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.voicemailEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.voicemailDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"disabled-message\\\"],[15,\\\"data-t\\\",\\\"voicemails--disabled-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"voicemails\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.voicemailEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.voicemailDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"voicemails\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"voicemail-greeting contact-info-group\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label overflow-label greeting-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.greeting\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"displaySpinner\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasGreeting\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"audio-player\\\"],null,[[\\\"source\\\",\\\"options\\\",\\\"onError\\\"],[[28,[\\\"greetingAudioSource\\\"]],[28,[\\\"greetingOptions\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"audioPlayerError\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"voicemailFile\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"file-name\\\"],[13],[0,\\\"\\\\n                                    \\\"],[1,[28,[\\\"voicemailFile\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"audio-recorder\\\"],null,[[\\\"file\\\",\\\"playerOptions\\\",\\\"audioFileReady\\\",\\\"reset\\\"],[[28,[\\\"recordingFile\\\"]],[28,[\\\"playerOptions\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"recordingReady\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"resetRecording\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"options-dropdown\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"drop-down\\\"],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[28,[\\\"showVoicemailGreetingOptions\\\"]],\\\"group-contact-modal\\\"]],{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleShowVoicemailGreetingOptions\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.options\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\\n                                \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"showVoicemailGreetingOptions\\\"]],\\\"show\\\",\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"upload-file\\\"],[13],[0,\\\"\\\\n                                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"link\\\"],[16,\\\"disabled\\\",[26,[\\\"hasGreeting\\\"]],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"triggerUpload\\\"]],[13],[0,\\\"\\\\n                                            \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.uploadFile\\\"],null],false],[0,\\\"\\\\n                                        \\\"],[14],[0,\\\"\\\\n\\\\n                                        \\\"],[11,\\\"input\\\",[]],[15,\\\"class\\\",\\\"hidden file-upload\\\"],[15,\\\"name\\\",\\\"file\\\"],[15,\\\"type\\\",\\\"file\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.audioRecorder.uploadFile\\\"],null],null],[15,\\\"accept\\\",\\\".wav,.aiff,.opus,.ogg,audio/ogg\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"chooseFile\\\"],[[\\\"on\\\"],[\\\"change\\\"]]],[13],[14],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n\\\\n                                    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"reset\\\"],[13],[0,\\\"\\\\n                                        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"resetCurrentGreeting\\\"]],[13],[0,\\\"\\\\n                                            \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.resetToDefault\\\"],null],false],[0,\\\"\\\\n                                        \\\"],[14],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emailNotifications\\\",\\\"show\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"email-notification contact-info-group\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-container\\\"],[15,\\\"data-t\\\",\\\"email-notifications--input-container\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label overflow-label\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailNotifications.label\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"emailNotifications\\\",\\\"state\\\"]],[28,[\\\"emailNotifications\\\",\\\"disable\\\"]],\\\"toggleEmailNotifications\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[15,\\\"data-t\\\",\\\"email-notifications--info-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emailNotifications\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"reasons\\\",\\\"org\\\",\\\"disablesEmailNotifications\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailNotifications.disabled.byOrg\\\"],null],false],[0,\\\"\\\\n                                    \\\"],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"disabled-message\\\"],[15,\\\"data-t\\\",\\\"email-notifications--disabled-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emailNotifications\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"piiInEmailNotifications\\\",\\\"show\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"email-notification-pii contact-info-group\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-container\\\"],[15,\\\"data-t\\\",\\\"pii-in-email-notifications--input-container\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label overflow-label\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.label\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"piiInEmailNotifications\\\",\\\"state\\\"]],[28,[\\\"piiInEmailNotifications\\\",\\\"disable\\\"]],\\\"togglePiiInEmailNotifications\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[15,\\\"data-t\\\",\\\"pii-in-email-notifications--info-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"piiInEmailNotifications\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.info.whenOn\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"reasons\\\",\\\"org\\\",\\\"disablesPiiInEmailNotifications\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.disabled.byOrg\\\"],null],false],[0,\\\"\\\\n                                        \\\"],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.info.whenOff\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"disabled-message\\\"],[15,\\\"data-t\\\",\\\"pii-in-email-notifications--disabled-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"piiInEmailNotifications\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.info.whenOn\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.info.whenOff\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"transcriptionToggle\\\",\\\"show\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"voicemail-transcription contact-info-group\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-container\\\"],[15,\\\"data-t\\\",\\\"transcriptions--input-container\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label overflow-label\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptions.label\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"transcriptionToggle\\\",\\\"state\\\"]],[28,[\\\"transcriptionToggle\\\",\\\"disable\\\"]],\\\"toggleTranscriptions\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[15,\\\"data-t\\\",\\\"transcriptions--info-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"transcriptionToggle\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptionsEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"reasons\\\",\\\"org\\\",\\\"disablesVMTranscription\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptions.disabled.byOrg\\\"],null],false],[0,\\\"\\\\n                                        \\\"],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptionsDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"disabled-message\\\"],[15,\\\"data-t\\\",\\\"transcriptions--disabled-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"transcriptionToggle\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptionsEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptionsDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"transcriptionDropDown\\\",\\\"show\\\"]],[28,[\\\"transcriptionLanguages\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"transcriptionDropDown\\\"],[13],[0,\\\"\\\\n\\\"],[0,\\\"                                    \\\"],[9,\\\"gux-dropdown\\\",{\\\"attrs\\\":[[16,\\\"value\\\",[28,[\\\"transcriptionDropDown\\\",\\\"state\\\"]],null],[15,\\\"filterable\\\",\\\"true\\\"],[15,\\\"slot\\\",\\\"dropdown\\\"],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectTranscriptionLanguage\\\"],null],null],[16,\\\"placeholder\\\",[34,[[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptions.dropDown.placeholder\\\"],null]]]],[16,\\\"disabled\\\",[28,[\\\"transcriptionDropDown\\\",\\\"disable\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                                        \\\"],[9,\\\"gux-listbox\\\",{\\\"attrs\\\":[],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"transcriptionLanguages\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                                \\\"],[9,\\\"gux-option\\\",{\\\"attrs\\\":[[16,\\\"value\\\",[28,[\\\"language\\\",\\\"key\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                                                    \\\"],[1,[28,[\\\"language\\\",\\\"value\\\"]],false],[0,\\\"\\\\n                                                \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"language\\\"]},null],[0,\\\"                                        \\\"]]}],[0,\\\"\\\\n                                    \\\"]]}],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-contact-panel/group-ring-settings/template.hbs\"}});","import Ember from 'ember';\nimport DS from 'ember-data';\nimport BatchDataRequestMixin from 'connections-ui/mixins/batch-data-requests';\n\nimport { LIST_TYPES } from '../component';\n\nexport default Ember.Component.extend(BatchDataRequestMixin, {\n    classNames: ['ring-sequence'],\n\n    application: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n\n    group: null,\n    searchInput: '',\n    searchQuery: '',\n    personSearch: false,\n    sequenceContainer: null,\n    resultsContainer: null,\n    resizeListener: null,\n    isSequential: false,\n    displayIndices: false,\n    editing: false,\n    listDirty: false,\n    ringRotations: null,\n    listType: null,\n\n    owners: Ember.computed.reads('group.owners.owners'),\n    individuals: Ember.computed.reads('group.individuals.individuals'),\n\n    _editing: false,\n\n    isOwners: Ember.computed.equal('listType', LIST_TYPES.OWNERS),\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.sequenceContainer = this.$('.sequence-container');\n        if (this.attrs.appendSave) {\n            this.saveFunction = Ember.run.bind(this, this.save);\n            this.attrs.appendSave(this.saveFunction);\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._removeListeners();\n        if (this.attrs.removeSave) {\n            this.attrs.removeSave(this.saveFunction);\n        }\n    },\n\n    didUpdateAttrs() {\n        const editing = this.get('editing');\n        const cachedEditing = this.get('_editing');\n        if (editing !== cachedEditing) {\n            this.set('_editing', editing);\n            this.notifyPropertyChange('owners');\n            this.notifyPropertyChange('individuals');\n        }\n    },\n\n    sequenceList: Ember.computed('isOwners', 'individualsSequenceList.[]', 'ownersSequenceList.[]', function () {\n        return this.get('isOwners') ? this.get('ownersSequenceList') : this.get('individualsSequenceList');\n    }),\n\n    individualsSequenceList: Ember.computed('individuals.[]', function () {\n        return DS.PromiseArray.create({\n            promise: this._sequenceListForPeople(this.get('individuals') || [])\n        });\n    }),\n\n    ownersSequenceList: Ember.computed('owners.[]', function () {\n        return DS.PromiseArray.create({\n            promise: this._sequenceListForPeople(this.get('owners') || [])\n        });\n    }),\n\n    renderedList: Ember.computed(\n        'sequenceList.[]',\n        'individualsSequenceList.[]',\n        'ownersSequenceList.[]',\n        'ringRotations',\n        function () {\n            return DS.PromiseArray.create({\n                promise: this._appendRotationListData()\n            });\n        }\n    ),\n\n    searchLabel: Ember.computed('listType', function () {\n        if (this.get('listType') === 'owners') {\n            return this.get('intl').t('groups.groupRing.ownersSearch');\n        } else {\n            return this.get('intl').t('groups.groupRing.membersSearch');\n        }\n    }),\n\n    searchPlaceholder: Ember.computed('listType', function () {\n        if (this.get('listType') === 'owners') {\n            return this.get('intl').t('groups.groupRing.searchPlaceholderOwners');\n        } else {\n            return this.get('intl').t('groups.groupRing.searchPlaceholder');\n        }\n    }),\n\n    addMemberPlaceholder: Ember.computed(function () {\n        return this.get('intl').t('groups.groupRing.addMemberPlaceholder');\n    }),\n\n    clearSearch: Ember.observer('editing', function () {\n        this.set('searchInput', '');\n        this.set('searchQuery', '');\n    }),\n\n    actions: {\n        inputEntered() {\n            Ember.run.throttle(this, this._updateSearchQuery, 500, false);\n        },\n\n        togglePersonSearch() {\n            this.toggleProperty('personSearch');\n            this.handleListeners();\n        },\n\n        addPerson(person) {\n            return this.get('sequenceList').then(sequenceList => {\n                const isOwner = this.get('group').isPersonOwner(person);\n                const index = sequenceList.get('length') + 1;\n                const listItem = Ember.Object.create({\n                    person: person,\n                    isOwner: isOwner,\n                    index: index\n                });\n                this.set('personSearch', false);\n                sequenceList.pushObject(listItem);\n                sequenceList.set('lastObject.scrollIntoView', true);\n                this.set('listDirty', true);\n            });\n        },\n\n        listModified() {\n            this.set('listDirty', true);\n        }\n    },\n\n    handleListeners() {\n        if (this.get('personSearch')) {\n            Ember.run.scheduleOnce('afterRender', this, () => {\n                this._attachListeners();\n                this._handleResizeEvent();\n            });\n        } else {\n            Ember.run.scheduleOnce('afterRender', this, this._removeListeners);\n        }\n    },\n\n    save() {\n        this.set('personSearch', false);\n\n        const owners = this.get('ownersSequenceList');\n        const individuals = this.get('individualsSequenceList');\n\n        return {\n            type: 'ring-sequence',\n            individuals: individuals.then(people => people.mapBy('person.id')),\n            owners: owners.then(people => people.mapBy('person.id'))\n        };\n    },\n\n    _appendRotationListData() {\n        return this.get('sequenceList').then(sequenceList => {\n            const ringRotations = this.get('ringRotations');\n            const listLength = sequenceList.get('length');\n            if (ringRotations !== null) {\n                sequenceList.forEach((listModel, index) => {\n                    listModel.setProperties({\n                        beginningOutOfRange: index === ringRotations,\n                        outOfRange: index >= ringRotations,\n                        endOutOfRange: index > ringRotations - 1 && index === listLength - 1,\n                        popupDismissed: false\n                    });\n                });\n            }\n            return sequenceList;\n        });\n    },\n\n    _sequenceListForPeople(people) {\n        const batchPromises = people.map(person => this.getUser(person.guid || person.value));\n        return Ember.RSVP.all(batchPromises).then(personArray => {\n            return personArray.map((person, index) => {\n                const isOwner = this.get('group').isPersonOwner(person);\n                return Ember.Object.create({\n                    person: person,\n                    isOwner: isOwner,\n                    index: ++index\n                });\n            });\n        });\n    },\n\n    _updateSearchQuery() {\n        this.set('searchQuery', this.get('searchInput'));\n    },\n\n    _attachListeners() {\n        this.resizeListener = Ember.$(window).on(`resize.${this.get('elementId')}`, () => {\n            Ember.run.throttle(this, this._handleResizeEvent, 100, false);\n        });\n        this.resultsContainer = this.$('.results-container');\n    },\n\n    _removeListeners() {\n        Ember.$(window).off(`.${this.get('elementId')}`);\n        this.resultsContainer = null;\n    },\n\n    _handleResizeEvent() {\n        const height = this.sequenceContainer.height();\n        this.resultsContainer.css('height', `${height - 4}px`);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"Mc0I3uIH\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"list-search \\\",[33,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null],\\\"display-only\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[\\\"btn btn-link add-person \\\",[33,[\\\"if\\\"],[[28,[\\\"personSearch\\\"]],\\\"active\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"togglePersonSearch\\\"]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-invite-user\\\"],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isOwners\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.addOwner\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.addMember\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"unless\\\"],[[28,[\\\"personSearch\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"input-wrapper\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"hidden\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-person-search\\\"]]],[13],[1,[26,[\\\"searchLabel\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"class\\\",\\\"type\\\",\\\"value\\\",\\\"key-up\\\",\\\"placeholder\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-person-search\\\"],null],\\\"search-input\\\",\\\"text\\\",[28,[\\\"searchInput\\\"]],\\\"inputEntered\\\",[28,[\\\"searchPlaceholder\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-search\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"entity-search\\\"],null,[[\\\"type\\\",\\\"placeholder\\\",\\\"select\\\"],[\\\"people\\\",[28,[\\\"addMemberPlaceholder\\\"]],\\\"addPerson\\\"]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"can-add-group-ring-member\\\"],[[28,[\\\"result\\\"]],[28,[\\\"sequenceList\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"result-container clickable scroll-entity \\\",[33,[\\\"if\\\"],[[28,[\\\"result\\\",\\\"selected\\\"]],\\\"selected\\\"],null]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],[28,[\\\"selectResult\\\"]],[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\"],[[28,[\\\"result\\\"]],false,false]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"result-container scroll-entity disabled\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\",\\\"disabled\\\"],[[28,[\\\"result\\\"]],false,false,true]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[\\\"top\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.memberNotSelectable\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"result\\\",\\\"selectResult\\\"]},null]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"sequence-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"personSearch\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"group-profile/group-list\\\"],null,[[\\\"groupList\\\",\\\"searchQuery\\\",\\\"editing\\\",\\\"isSequential\\\",\\\"displayIndices\\\",\\\"listType\\\",\\\"listModified\\\"],[[28,[\\\"renderedList\\\"]],[28,[\\\"searchQuery\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"isSequential\\\"]],[28,[\\\"displayIndices\\\"]],[28,[\\\"listType\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"listModified\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-help\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"p\\\",[]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.inviteHelp\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isOwners\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"owners-note\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.ownersAsMembers\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-contact-panel/ring-sequence/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"zpqQuLVF\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-content\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"settings\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"settings-content-wrapper\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"settings-left-rail\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"tab-container\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"nav nav-tabs\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"nav-tab-owners active\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"changeListType\\\",\\\"owners\\\"]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#owners\\\"],[15,\\\"data-toggle\\\",\\\"tab\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.owners\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"nav-tab-members\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#members\\\"],[15,\\\"data-toggle\\\",\\\"tab\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"changeListType\\\",\\\"members\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.members\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[1,[33,[\\\"group-profile/group-contact-panel/ring-sequence\\\"],null,[[\\\"group\\\",\\\"editing\\\",\\\"displayIndices\\\",\\\"isSequential\\\",\\\"ringRotations\\\",\\\"personSearch\\\",\\\"listType\\\",\\\"appendSave\\\",\\\"removeSave\\\"],[[28,[\\\"group\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"displayIndices\\\"]],[28,[\\\"isSequential\\\"]],[28,[\\\"ringRotations\\\"]],[28,[\\\"personSearch\\\"]],[28,[\\\"listType\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"appendSave\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSave\\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"settings-right-rail\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"group-profile/group-contact-panel/group-ring-settings\\\"],null,[[\\\"entity\\\",\\\"orgVoicemailPolicy\\\",\\\"canEditGroupTelephonySettings\\\",\\\"editing\\\",\\\"appendSave\\\",\\\"removeSave\\\",\\\"disableSave\\\"],[[28,[\\\"group\\\"]],[28,[\\\"orgVoicemailPolicy\\\"]],[28,[\\\"canEditGroupTelephonySettings\\\"]],[28,[\\\"editing\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"appendSave\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSave\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"disableSave\\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"button-wrapper\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-success btn-purecloud\\\"],[16,\\\"disabled\\\",[26,[\\\"disabled\\\"]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"save\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-link btn-cancel\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-contact-panel/template.hbs\"}});","import Ember from 'ember';\nimport DS from 'ember-data';\nimport Fuse from 'npm:fuse.js';\n\nimport { LIST_TYPES } from '../group-contact-panel/component';\n\nconst fuseOptions = {\n    shouldSort: false,\n    threshold: 0.4,\n    location: 0,\n    distance: 100,\n    maxPatternLength: 32,\n    minMatchCharLength: 1,\n    keys: ['person.name'],\n    getFn(obj, path) {\n        return obj.get(path);\n    }\n};\n\nexport default Ember.Component.extend({\n    classNames: ['group-list'],\n\n    groupList: null,\n    selectedIndex: null,\n    searchQuery: '',\n    editing: false,\n    displayIndices: true,\n    listType: null,\n\n    queryAvailable: Ember.computed.gt('searchQuery.length', 0),\n\n    searchResults: Ember.computed('groupList', 'searchQuery', function () {\n        if (this.get('queryAvailable')) {\n            return DS.PromiseArray.create({\n                promise: this.get('groupList').then(data => new Fuse(data, fuseOptions).search(this.get('searchQuery')))\n            });\n        }\n        return DS.PromiseArray.create({\n            promise: Ember.RSVP.resolve(Ember.A([]))\n        });\n    }),\n\n    renderedList: Ember.computed('searchResults.[]', 'groupList.[]', 'queryAvailable', function () {\n        if (this.get('queryAvailable')) {\n            return this.get('searchResults');\n        }\n        return this.get('groupList');\n    }),\n\n    canRemove: Ember.computed('renderedList.[]', 'listType', function () {\n        if (this.get('listType') !== LIST_TYPES.OWNERS) {\n            return true;\n        }\n        return this.get('renderedList.length') > 1;\n    }),\n\n    actions: {\n        removeItem(index) {\n            if (!this.get('canRemove')) {\n                return;\n            }\n\n            this.get('groupList').removeAt(index - 1);\n            this._recalculateIndices();\n            this.notifyParentOfListChange();\n        },\n\n        changePosition(from, to) {\n            Ember.run.debounce(this, this.changePosition, from, to, 100);\n        }\n    },\n\n    notifyParentOfListChange() {\n        if (this.attrs.listModified) {\n            this.attrs.listModified();\n        }\n    },\n\n    changePosition(from, to) {\n        this._changePosition(from, to);\n\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n\n        this.set('selectedIndex', null);\n        this.notifyParentOfListChange();\n    },\n\n    _recalculateIndices() {\n        this.get('groupList').map((listModel, index) => {\n            listModel.set('index', ++index);\n        });\n    },\n\n    _changePosition(from, to) {\n        if (!Number.isInteger(to)) {\n            return;\n        }\n        const groupList = this.get('groupList');\n        to = Math.min(to, groupList.get('length'));\n        to = Math.max(to, 1);\n\n        groupList.then(groupArray => {\n            const item = groupArray.get(from - 1);\n            groupArray.removeAt(from - 1);\n            groupArray.insertAt(to - 1, item);\n            this._recalculateIndices();\n        });\n    }\n});\n","import Ember from 'ember';\nimport { eventToString } from 'connections-ui/utils/keystroke';\n\nexport default Ember.Component.extend({\n    classNames: ['list-item'],\n    classNameBindings: ['editing', 'outOfRotationRange:out-of-range', 'listModel.scrollIntoView:highlight'],\n\n    intl: Ember.inject.service(),\n\n    isSequential: false,\n    displayIndices: true,\n    listModel: null,\n    input_value: null,\n    tetherConstraints: [\n        {\n            to: 'scrollParent',\n            pin: true\n        }\n    ],\n    hovercardOffset: '0px 0px',\n    hovercardArrowOffset: 24,\n\n    didInsertElement() {\n        this._super(...arguments);\n        if (this.get('listModel.scrollIntoView')) {\n            this.scrollIntoView();\n        }\n    },\n\n    index: Ember.computed.reads('listModel.index'),\n\n    outOfRotationRange: Ember.computed.and('listModel.outOfRange', 'isSequential'),\n\n    displayRotationRangePopup: Ember.computed(\n        'listModel.beginningOutOfRange',\n        'listModel.popupDismissed',\n        'isSequential',\n        'editing',\n        function () {\n            return (\n                this.get('listModel.beginningOutOfRange') &&\n                this.get('isSequential') &&\n                !this.get('listModel.popupDismissed') &&\n                this.get('editing')\n            );\n        }\n    ),\n\n    position: Ember.computed('index', function () {\n        return `${this.get('index')}.`;\n    }),\n\n    role: Ember.computed('listModel.isOwner', function () {\n        if (this.get('listModel.isOwner')) {\n            return this.get('intl').t('groups.memberTypes.owner');\n        }\n        return this.get('intl').t('groups.memberTypes.individual');\n    }),\n\n    newIndex: Ember.computed('input_value', function () {\n        return parseInt(this.get('input_value'));\n    }),\n\n    popupTarget: Ember.computed('elementId', function () {\n        return `list-item-popup-${this.elementId}`;\n    }),\n\n    actions: {\n        indexChanged() {\n            this.changeIndex();\n        },\n        dismissPopup() {\n            this.set('listModel.popupDismissed', true);\n        },\n        setIndexChanged(event) {\n            if (eventToString(event) !== 'ENTER') {\n                const value = parseInt(event.target.value, 10);\n                if (!isNaN(value)) {\n                    this.set('newIndex', value);\n                }\n            }\n        },\n        submitIndexChange(event) {\n            if (eventToString(event) === 'ENTER') {\n                this.changeIndex();\n            }\n        }\n    },\n\n    changeIndex() {\n        this.attrs.changePosition(this.get('index'), this.get('newIndex'));\n        this.set('input_value', null);\n    },\n\n    scrollIntoView() {\n        const parent = this.$().parent();\n        const scrollHeight = parent.prop('scrollHeight');\n        parent.animate(\n            {\n                scrollTop: scrollHeight\n            },\n            1000\n        );\n        Ember.run.later(\n            this,\n            () => {\n                this.set('listModel.scrollIntoView', false);\n            },\n            5000\n        );\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"ga1Db2kz\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"list-left-rail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayIndices\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"isSequential\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"input\\\",[]],[15,\\\"type\\\",\\\"text\\\"],[15,\\\"class\\\",\\\"input\\\"],[16,\\\"placeholder\\\",[26,[\\\"index\\\"]],null],[16,\\\"aria-label\\\",[26,[\\\"index\\\"]],null],[16,\\\"value\\\",[26,[\\\"input_value\\\"]],null],[16,\\\"onblur\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"indexChanged\\\"],[[\\\"on\\\"],[\\\"blur\\\"]]],null],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"submitIndexChange\\\"],[[\\\"on\\\"],[\\\"keydown\\\"]]],null],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setIndexChanged\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"index\\\"],[13],[1,[26,[\\\"position\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[6,[\\\"entity-hover-card-v2\\\"],null,[[\\\"entity\\\",\\\"enableMiniCard\\\"],[[28,[\\\"listModel\\\",\\\"person\\\"]],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[28,[\\\"listModel\\\",\\\"person\\\",\\\"name\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"list-right-rail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[\\\"btn btn-link \\\",[33,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"canRemove\\\"]]],null],\\\"disabled\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],[28,[\\\"removeItem\\\"]],[28,[\\\"index\\\"]]]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-times\\\"],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"canRemove\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[\\\"top\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.cannotRemoveAllOwners\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayRotationRangePopup\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"ember-tether\\\"],null,[[\\\"target\\\",\\\"targetAttachment\\\",\\\"attachment\\\",\\\"constraints\\\",\\\"classPrefix\\\",\\\"offset\\\"],[[33,[\\\"concat\\\"],[\\\"#\\\",[28,[\\\"elementId\\\"]]],null],\\\"top center\\\",\\\"bottom center\\\",[28,[\\\"tetherConstraints\\\"]],\\\"list-item-popup-tether\\\",[28,[\\\"hovercardOffset\\\"]]]],{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"popupTarget\\\"]]]]],[15,\\\"class\\\",\\\"list-item-popup\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"popup-triangle\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"popup-content\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"popup-description\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.popupDescription\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"dismissPopup\\\"]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-times\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-list/list-item/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"ul9Fm8yu\",\"block\":\"{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"renderedList\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"group-profile/group-list/list-item\\\"],null,[[\\\"editing\\\",\\\"listModel\\\",\\\"isSequential\\\",\\\"displayIndices\\\",\\\"canRemove\\\",\\\"removeItem\\\",\\\"changePosition\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"listModel\\\"]],[28,[\\\"isSequential\\\"]],[28,[\\\"displayIndices\\\"]],[28,[\\\"canRemove\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"removeItem\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"changePosition\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"listModel\\\"]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-list/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['group-membership-entry'],\n\n    chat: inject.service(),\n    intl: inject.service(),\n    session: inject.service(),\n    notification: inject.service('notification-proxy'),\n\n    attrs: {\n        person: null,\n        group: null,\n        individuals: [],\n        editing: false,\n        membership: [],\n        deletePerson: ''\n    },\n\n    actions: {\n        deletePerson() {\n            const group = this.get('group');\n            const person = this.get('person');\n            if (group.isPersonOwner(person) && this.get('group.owners.owners.length') === 1) {\n                const title = this.get('entity.name');\n                const message = this.get('intl').lookup('notification.group.noOwners');\n                this.get('notification').info(title, message);\n            } else {\n                this.sendAction('deletePerson', person, this.get('memberTypeList'));\n            }\n        }\n    },\n\n    showChat: computed('isLoggedInUser', 'chat.enabled', function () {\n        return !this.get('isLoggedInUser') && this.get('chat.enabled');\n    }),\n\n    isLoggedInUser: computed('person', 'session.person', function () {\n        const person = this.get('person');\n        const sessionPerson = this.get('session.person');\n        return person.get('id') === sessionPerson.get('id');\n    }),\n\n    cannotDeleteMember: computed('isLoggedInUser', 'group.owners.owners.@each.value', function () {\n        const person = this.get('person');\n        const group = this.get('group');\n        const isOwnerAndSelf = group.isPersonOwner(person) && this.get('isLoggedInUser');\n        const multipleOwners = group.get('owners.owners.length') > 1;\n        return isOwnerAndSelf && !multipleOwners;\n    }),\n\n    canViewRules: computed('group.membershipVisible', 'session.person', 'session.user.isTrustee', function () {\n        if (this.get('session.user.isTrustee')) {\n            return true;\n        }\n\n        const group = this.get('group');\n        const person = this.get('session.person');\n        const visible = this.get('group.membershipVisible');\n        const namedPermissions = person.get('namedPermissions');\n        const hasPermissions = namedPermissions.includes('admin') || namedPermissions.includes('group_administration');\n        if (!visible) {\n            return hasPermissions || group.isPersonOwner(person);\n        }\n        return true;\n    }),\n\n    memberType: computed('person', 'group', 'isCurrentMember', 'individuals.[]', 'group.isDynamicGroup', function () {\n        const intl = this.get('intl');\n        const group = this.get('group');\n        const person = this.get('person');\n        const individuals = this.get('individuals');\n        let translation = intl.lookup('common.removed');\n        if (this.get('isCurrentMember')) {\n            if (group.isPersonOwner(person)) {\n                translation = intl.lookup('groups.memberTypes.owner');\n            } else if (_.includes(individuals, person) || group.isPersonIndividual(person)) {\n                translation = intl.lookup('groups.memberTypes.individual');\n            } else if (this.get('group.isDynamicGroup')) {\n                translation = intl.lookup('groups.memberTypes.dynamic');\n            } else {\n                translation = intl.lookup('groups.memberTypes.rule');\n            }\n        }\n        return translation.toString();\n    }),\n\n    memberTypeList: computed('person', 'group', function () {\n        const group = this.get('group');\n        const person = this.get('person');\n        const paths = [];\n        if (group.isPersonOwner(person)) {\n            paths.push('owner');\n        }\n        if (group.isPersonIndividual(person)) {\n            paths.push('individual');\n        }\n        return paths;\n    }),\n\n    isRule: computed('person', 'group', 'isAddedIndividual', function () {\n        const group = this.get('group');\n        const person = this.get('person');\n        return !group.isPersonOwner(person) && !group.isPersonIndividual(person) && !this.get('isAddedIndividual');\n    }),\n\n    isLinkable: computed.not('editing'),\n    isAddedIndividual: computed('person', 'individuals.[]', 'membership.[]', function () {\n        const id = this.get('person.id');\n        const membership = this.get('membership').mapBy('guid');\n        return _.includes(membership, id);\n    }),\n\n    isCurrentMember: computed(\n        'group.owners.owners.@each.value',\n        'group.individuals.individuals.@each.value',\n        'isAddedIndividual',\n        function () {\n            const group = this.get('group');\n            const person = this.get('person');\n            return group.isPersonOwner(person) || group.isPersonIndividual(person) || this.get('isAddedIndividual');\n        }\n    ),\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.attachTooltip();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.$('.delete').tooltip('destroy');\n    },\n\n    didUpdateAttrs({ newAttrs, oldAttrs }) {\n        if (newAttrs.editing.value !== oldAttrs.editing.value) {\n            this.attachTooltip();\n        }\n    },\n\n    attachTooltip() {\n        Ember.run.scheduleOnce('afterRender', () => {\n            if (this.get('editing') && this.get('isRule')) {\n                this.$('.delete').tooltip({\n                    title: this.get('intl').lookup('groups.cannotRemoveRuleEntry').toString(),\n                    placement: 'left'\n                });\n            }\n        });\n    },\n\n    click(event) {\n        const target = Ember.$(event.target);\n        if (target.is('.person-name')) {\n            this.bubbleAction({\n                action: 'transitionToEntityDetail',\n                actionContext: [this.get('person')]\n            });\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"WnQ9thH+\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"showPresence\\\",\\\"isLinkable\\\"],[[28,[\\\"person\\\"]],true,[28,[\\\"isLinkable\\\"]]]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[28,[\\\"person\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-name\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[28,[\\\"person\\\",\\\"name\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-title\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[28,[\\\"person\\\",\\\"title\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canViewRules\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"member-type \\\",[33,[\\\"unless\\\"],[[28,[\\\"isCurrentMember\\\"]],\\\"removed\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[1,[26,[\\\"memberType\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"member-contact\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"entity-contact\\\"],null,[[\\\"contact\\\",\\\"showChat\\\",\\\"showFavorite\\\",\\\"shouldTether\\\"],[[28,[\\\"person\\\"]],[28,[\\\"showChat\\\"]],false,true]]],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"delete danger \\\",[33,[\\\"unless\\\"],[[28,[\\\"editing\\\"]],\\\"hidden\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isRule\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row disabled\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"cannotDeleteMember\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row disabled\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"deletePerson\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/membership-entry/template.hbs\"}});","import Ember from 'ember';\nimport request from 'ember-ajax';\nimport DS from 'ember-data';\nimport { singularize } from 'ember-inflector';\nimport _ from 'lodash';\nimport { task, timeout } from 'ember-concurrency';\nimport JobMixin from '../../../mixins/job';\nimport PagingMixin from '../../../mixins/paging';\nimport { BASE_PERSON } from '../../../models/person';\nimport LoggerMixin from '../../../mixins/logger';\n\nconst { set, get, inject, computed, observer, Component } = Ember;\n\nfunction equals(field, value, intl) {\n    return {\n        displayClassification: intl.lookup(field),\n        type: 'equals',\n        key: field,\n        value: value\n    };\n}\n\nfunction personQuery(rels, person) {\n    return {\n        rels: rels,\n        type: 'relationship',\n        value: person.get('_id') || person.get('id'),\n        guid: person.get('guid') || person.get('id'),\n        entity: 'people'\n    };\n}\n\nexport default Component.extend(PagingMixin, JobMixin, LoggerMixin, {\n    classNames: ['group-membership-listing', 'content'],\n    classNameBindings: ['editing', 'hunt-groups'],\n\n    intl: inject.service(),\n    store: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n    permissions: inject.service(),\n    searchService: inject.service('search'),\n\n    phoneEnabled: computed.reads('permissions.phoneEnabled'),\n    group: null,\n    entityType: 'person',\n    fieldList: BASE_PERSON.fl,\n\n    filterChoices: [\n        {\n            key: 'all',\n            string: 'groups.dropdown.all',\n            active: false,\n            path: null\n        },\n        {\n            key: 'individuals',\n            string: 'groups.dropdown.individuals',\n            active: true,\n            path: 'individuals.individuals'\n        },\n        {\n            key: 'owners',\n            string: 'groups.dropdown.owners',\n            active: false,\n            path: 'owners.owners'\n        },\n        {\n            key: 'rules',\n            string: 'groups.dropdown.rules',\n            active: false,\n            path: null\n        }\n    ],\n\n    inclusionFilter: {\n        key: 'inclusions',\n        string: 'group_membership_inclusions_labelKey_inclusions',\n        active: false,\n        path: 'membership.inclusions'\n    },\n\n    exclusionFilter: {\n        key: 'exclusions',\n        string: 'group_membership_exclusions_labelKey_exclusions',\n        active: false,\n        path: 'membership.exclusions'\n    },\n\n    filter: null,\n    search: null,\n    editing: false,\n    showRules: false,\n    saving: false,\n    loadedAll: false,\n    loading: null,\n    ignoreScroll: false,\n    rateLimited: false,\n\n    currentlySearching: false,\n    currentMembershipRequest: null,\n    membershipQuery: null,\n\n    membership: null,\n    memberListLimitSize: 20,\n    retryTimeout: null,\n    retyTimeOutDuration: 10000,\n\n    actions: {\n        toggleRules() {\n            this.toggleProperty('showRules');\n            Ember.set(this, 'membershipQuery.offset', 0);\n            Ember.set(this, 'currentPage', 0);\n            Ember.set(this, 'loadedAll', false);\n            if (this.get('showRules')) {\n                Ember.set(this, 'filter', this.inclusionFilter);\n            } else {\n                Ember.set(this, 'filter', this.filterChoices.findBy('key', 'all'));\n            }\n            this.updateContentOnChange();\n        },\n\n        selectFilter(filter) {\n            this.set('ignoreScroll', true);\n            Ember.set(this, 'search', '');\n            Ember.set(this, 'membership', []);\n            Ember.set(this, 'membershipQuery.offset', 0);\n            Ember.set(this, 'currentPage', 0);\n            this.get('editingFilterChoices').forEach(filter => set(filter, 'active', false));\n            Ember.set(this, 'filter', filter);\n            Ember.set(this, 'filter.active', true);\n            Ember.set(this, 'loadedAll', false);\n\n            this.updateContentOnChange();\n        },\n\n        updateSearch(search) {\n            Ember.set(this, 'search', search);\n            this.searchCriteriaChanged();\n        },\n\n        editMembership() {\n            Ember.set(this, 'editing', true);\n            Ember.set(this, 'showRules', false);\n            Ember.set(this, 'loadedAll', false);\n            this.get('editingFilterChoices').forEach(filter => set(filter, 'active', false));\n            Ember.set(this, 'filter', this.filterChoices.findBy('key', 'owners'));\n            Ember.set(this, 'filter.active', true);\n            Ember.set(this, 'membership', []);\n            this.updateContentOnChange();\n            Ember.run.scheduleOnce('afterRender', () => {\n                Ember.$('.add-member input').trigger('focus');\n            });\n            this.sendAction('changeEditing', true);\n        },\n\n        selectTab(tab) {\n            this.bubbleAction({\n                action: 'selectTab',\n                actionContext: tab\n            });\n        },\n\n        selectKeyword(keyword) {\n            this.addKeyword(keyword);\n        },\n\n        selectPerson(person) {\n            this.addPerson(person);\n        },\n\n        removeRule(rule) {\n            this.removeRule(rule);\n        },\n\n        removePerson(person, memberTypeList) {\n            this.removePerson(person, memberTypeList);\n        },\n\n        save() {\n            Ember.set(this, 'search', '');\n            Ember.set(this, 'saving', true);\n            const application = this.get('application');\n            const group = this.get('group');\n            const addedIndividuals = this.get('addedIndividuals');\n            const removedIndividuals = this.get('removedIndividuals');\n            this.setRulesOnGroup();\n            group\n                .save()\n                .then(res => {\n                    const job = Ember.get(res, 'meta.job');\n                    if (job && job.jobId) {\n                        this.addJob(\n                            job,\n                            () => {\n                                this.handleJobFinish();\n                            },\n                            this\n                        );\n                    } else {\n                        return this.get('loadAll').perform();\n                    }\n                })\n                .then(() => this.saveIndividuals(group, addedIndividuals, application))\n                .then(() => this.deleteIndividuals(group, removedIndividuals, application))\n                .then(() => this.reload())\n                .then(() => {\n                    const title = group.get('name');\n                    const message = this.get('intl').lookup('notification.group.membership').toString();\n                    this.get('notification').success(title, message, {\n                        forceBrowserNotification: true\n                    });\n\n                    this.sendAction('changeEditing', false);\n\n                    Ember.set(this, 'addedIndividuals', []);\n                    Ember.set(this, 'removedIndividuals', []);\n                    Ember.set(this, 'membershipQuery.offset', 0);\n\n                    Ember.set(this, 'loading', {\n                        add: false,\n                        search: false\n                    });\n\n                    this.setProperties({\n                        saving: false,\n                        editing: false,\n                        currentPage: 0,\n                        loadedAll: false\n                    });\n\n                    Ember.set(this, 'filter', this.filterChoices.findBy('key', 'all'));\n                })\n                .then(() => {\n                    // Membership count is eventually consistent...\n                    // Check for membership count after some seconds...\n                    Ember.run.later(() => {\n                        this.reload();\n                    }, 5000);\n                })\n                .catch(err => {\n                    this.logger.error('There was an error saving the group', {\n                        err\n                    });\n\n                    const title = group.get('name');\n                    const message = this.get('intl').t('notification.group.saveError');\n                    this.get('notification').error(title, message, {\n                        forceBrowserNotification: true\n                    });\n\n                    Ember.set(this, 'saving', false);\n                });\n        },\n\n        cancel() {\n            const group = this.get('group');\n\n            Ember.set(this, 'search', '');\n            Ember.set(this, 'editing', false);\n            Ember.set(this, 'loading.search', true);\n            Ember.set(this, 'filter', this.filterChoices.findBy('key', 'all'));\n\n            group.reload().then(() => {\n                group.rollbackAttributes();\n\n                Ember.set(this, 'loading.search', false);\n                Ember.set(this, 'membershipQuery.offset', 0);\n                Ember.set(this, 'currentPage', 0);\n                Ember.set(this, 'loadedAll', false);\n\n                this.initMembership();\n                this.get('loadAll').perform();\n\n                this.sendAction('changeEditing', false);\n            });\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n        this.initMembership();\n\n        this.set('filter', _.head(this.filterChoices));\n        this.set('membershipQuery', {\n            offset: 0,\n            limit: this.memberListLimitSize\n        });\n        this.set('loading', {\n            add: false,\n            search: false\n        });\n\n        this.loadMembershipList().then(() => Ember.run.scheduleOnce('afterRender', this, this.loadMoreMembersOnInit));\n        this.get('reloadPageOnGroupChange').perform();\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.$('.membership-listing').on(\n            'scroll',\n            Ember.run.bind(this, () => this.get('loadContentOnScroll').perform())\n        );\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.$('.membership-listing').off('scroll');\n\n        if (this.get('retryTimeout')) {\n            Ember.run.cancel(timeout);\n        }\n    },\n\n    inclusionQueries: computed('group.membership.inclusions.[]', 'inclusions.[]', function () {\n        const addedInclusions = _.map(this.get('inclusions'), value => ({\n            value\n        }));\n        return this.get('group').getFieldValue('membership.inclusions').concat(addedInclusions);\n    }),\n\n    exclusionQueries: computed('group.membership.exclusions.[]', 'exclusions.[]', function () {\n        const addedExclusions = _.map(this.get('exclusions'), value => ({\n            value\n        }));\n        return this.get('group').getFieldValue('membership.exclusions').concat(addedExclusions);\n    }),\n\n    membershipRules: computed('filter.key', 'inclusionQueries', 'exclusionQueries', 'shouldShowRules', function () {\n        if (!this.get('shouldShowRules')) {\n            return;\n        }\n        const key = this.get('filter.key');\n        if (key === 'inclusions') {\n            return this.get('inclusionQueries');\n        }\n        if (key === 'exclusions') {\n            return this.get('exclusionQueries');\n        }\n    }),\n\n    canEdit: computed(\n        'group.id',\n        'session.user.isTrustee',\n        'session.person.namedPermissions',\n        'permissions.canEditGroups',\n        function () {\n            if (this.get('session.user.isTrustee')) {\n                return this.get('permissions.canEditGroups');\n            }\n            const person = this.get('session.person');\n            const permissions = person.get('namedPermissions');\n            return (\n                permissions.includes('admin') ||\n                permissions.includes('group_administration') ||\n                this.isOwner(person) ||\n                this.get('permissions.canEditGroups')\n            );\n        }\n    ),\n\n    canViewRules: computed('canEdit', 'group.membershipVisible', 'group.isDynamicGroup', function () {\n        return !this.get('group.isDynamicGroup') && (this.get('canEdit') || this.get('group.membershipVisible'));\n    }),\n\n    isEditingRules: computed('filter.key', 'editing', function () {\n        const key = this.get('filter.key');\n        return (key === 'inclusions' || key === 'exclusions') && this.get('editing');\n    }),\n\n    expressionDisplay: Ember.computed('group.expression', function () {\n        let output = '';\n        let expression = this.get('group.expression');\n        let invalid = false;\n\n        if (_.isEmpty(expression)) {\n            return this.get('intl').t('groups.expressions.empty');\n        }\n\n        expression.forEach(con => {\n            let display = '(';\n            let orWrap = false;\n\n            con.rules.forEach(rule => {\n                let valid = !!rule.skill && !!rule.comparator && !isNaN(rule.proficiency.value);\n                if (valid) {\n                    display += `${rule.skill.name} ${rule.comparator.op} ${rule.proficiency.value}`;\n                    if (rule.lastRule) {\n                        display += ')';\n                    } else if (!rule.opAnd) {\n                        display += `) ${this.get('intl').t('groups.expressions.or')} (`;\n                        orWrap = true;\n                    } else {\n                        display += ` ${this.get('intl').t('groups.expressions.and')} `;\n                    }\n                } else {\n                    invalid = true;\n                }\n            });\n\n            if (orWrap) {\n                display = `(${display})`;\n            }\n\n            if (!con.lastCondition) {\n                if (!con.opAnd) {\n                    display += ` ${this.get('intl').t('groups.expressions.or')} `;\n                } else {\n                    display += ` ${this.get('intl').t('groups.expressions.and')} `;\n                }\n            }\n            output += display;\n        });\n\n        let empty = output.replaceAll('(', '').replaceAll(')', '').trim() === 0;\n\n        if (invalid) {\n            output = this.get('intl').t('groups.expressions.invalid');\n        } else if (empty) {\n            //has no valid rules\n            output = this.get('intl').t('groups.expressions.empty');\n        }\n        return output;\n    }),\n\n    displayEditingFooter: Ember.computed('group.allowPermissionGroup', 'filter.key', 'editing', function () {\n        const isEditingRules = this.get('isEditingRules');\n        const rolesEnabled = this.get('group.allowPermissionGroup');\n        const editing = this.get('editing');\n        if (!editing) {\n            return false;\n        } else {\n            return !(rolesEnabled && isEditingRules);\n        }\n    }),\n\n    isSearching: computed('search', function () {\n        return !_.isEmpty(this.get('search.length'));\n    }),\n\n    shouldShowRules: computed.or('isEditingRules', 'showRules'),\n\n    showingFilterChoices: computed('filterChoices.[]', 'shouldShowRules', 'group.isDynamicGroup', function () {\n        if (this.get('shouldShowRules') && !this.get('group.isDynamicGroup')) {\n            return [this.inclusionFilter, this.exclusionFilter];\n        } else if (this.get('group.isDynamicGroup')) {\n            return this.get('filterChoices').filter(choice => {\n                return choice && choice.key !== 'rules' && choice.key !== 'individuals';\n            });\n        }\n        return this.get('filterChoices');\n    }),\n\n    editingFilterChoices: computed('filterChoices.[]', 'group.isDynamicGroup', function () {\n        const choices = this.get('filterChoices').filter(choice => {\n            return choice && choice.key !== 'all' && choice.key !== 'rules';\n        });\n        if (this.get('group.isDynamicGroup')) {\n            return this.get('filterChoices').filter(choice => {\n                return choice && choice.key === 'owners';\n            });\n        } else {\n            return choices.concat([this.inclusionFilter, this.exclusionFilter]);\n        }\n    }),\n\n    dropdownTitle: computed('filter', function () {\n        const filter = this.get('filter');\n        return this.get('intl').lookup(filter.string).toString();\n    }),\n\n    membershipCount: computed('membership.length', 'group.memberCount', function () {\n        const memberCount = this.get('group.memberCount');\n        let promise = Ember.RSVP.resolve(memberCount);\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    membershipHeader: computed('membershipCount', 'membershipCount.isFulfilled', function () {\n        const count = this.get('membershipCount.content') || 0;\n        return this.get('intl').lookup('groups.membershipWithCount', { count }).toString();\n    }),\n\n    extraParams: computed('group.{generalSearchQuery,membershipSearchQuery}', 'search', 'filter', function () {\n        const search = this.get('search');\n        const filter = this.get('filter');\n        const generalQuery = this.get('group.generalSearchQuery');\n        const membershipQuery = this.get('group.membershipSearchQuery');\n        let queryGroup = [];\n        if (search) {\n            queryGroup.push(search);\n        }\n        if (generalQuery) {\n            queryGroup.push(generalQuery);\n        }\n        if (membershipQuery && filter && filter.key === 'rules') {\n            queryGroup.push(membershipQuery);\n        }\n\n        return { q: queryGroup.join(' AND ') };\n    }),\n\n    didReceiveAttrs({ newAttrs, oldAttrs }) {\n        if (!newAttrs || !oldAttrs) {\n            return;\n        }\n\n        if (get(newAttrs, 'group.value.id') !== get(oldAttrs, 'group.value.id')) {\n            this.cancelEditOnGroupChange();\n            this.get('reloadPageOnGroupChange').perform(true);\n        }\n    },\n\n    debouncedSearchCriteriaChanged: task(function* () {\n        yield timeout(400);\n        Ember.run(() => {\n            const search = this.get('search');\n            if (_.isEmpty(search)) {\n                this.updateContentOnChange();\n            } else {\n                this.get('loadRules').perform();\n            }\n        });\n    }).drop(),\n\n    cancelEditOnGroupChange() {\n        Ember.set(this, 'editing', false);\n        this.sendAction('changeEditing', false);\n    },\n\n    reloadPageOnGroupChange: task(function* (loadMore = false) {\n        if (!this.get('group.id')) {\n            return;\n        }\n\n        this.initMembership();\n\n        Ember.set(this, 'membershipQuery', {\n            offset: 0,\n            limit: this.memberListLimitSize\n        });\n        Ember.set(this, 'filter', this.get('filterChoices.0'));\n        Ember.set(this, 'search', '');\n        Ember.set(this, 'currentPage', 0);\n        Ember.set(this, 'loadedAll', false);\n\n        yield this.updateContentOnChange();\n\n        if (loadMore) {\n            Ember.run.scheduleOnce('afterRender', this, this.loadMoreMembersOnInit);\n        }\n    }),\n\n    updateContentOnChange() {\n        const filter = this.get('filter');\n        Ember.set(this, 'membershipQuery', {\n            offset: 0,\n            limit: this.memberListLimitSize\n        });\n        switch (filter.key) {\n            case 'owners':\n                return this.get('loadOwners').perform();\n            case 'individuals':\n                return this.get('loadIndividuals').perform();\n            case 'rules':\n                return this.get('loadRules').perform();\n            case 'inclusions':\n            case 'exclusions':\n                return function () {};\n            default:\n                return this.get('loadAll').perform();\n        }\n    },\n\n    searchCriteriaChanged() {\n        this.get('debouncedSearchCriteriaChanged').perform();\n    },\n\n    reload() {\n        this.get('group')\n            .reload()\n            .then(() => this.reloadPageOnGroupReload());\n    },\n\n    reloadPageOnGroupReload() {\n        if (this.get('group.isReloading')) {\n            return;\n        }\n        Ember.set(this, 'loading.search', false);\n\n        Ember.set(this, 'membershipQuery', {\n            offset: 0,\n            limit: this.memberListLimitSize\n        });\n        this.updateContentOnChange();\n    },\n\n    pageChanged: observer('page', function () {\n        this.get('page').then(() => {\n            Ember.set(this, 'loading.search', false);\n        });\n    }),\n\n    initMembership() {\n        Ember.set(this, 'addedIndividuals', []);\n        Ember.set(this, 'removedIndividuals', []);\n        Ember.set(this, 'inclusions', []);\n        Ember.set(this, 'exclusions', []);\n        Ember.set(this, 'membership', []);\n    },\n\n    _individualsOperation(group, individuals, application, method) {\n        if (_.isEmpty(individuals)) {\n            return Ember.RSVP.resolve({});\n        }\n\n        const ids = [];\n        individuals.map(i => ids.push(`${i.id}`));\n\n        let url = application.pcV2Uri(`api/v2/groups/${group.get('id')}/members`);\n        if (method.toLowerCase() === 'post') {\n            return request(url, {\n                data: {\n                    memberIds: ids,\n                    version: group.get('version')\n                },\n                method: method,\n                headers: {\n                    'Content-Type': 'application/json'\n                }\n            }).then(() => {\n                return group;\n            });\n        } else if (method.toLowerCase() === 'delete') {\n            url = url.concat('?ids=', ids);\n            return request(url, {\n                method: method,\n                headers: {\n                    'Content-Type': 'application/json'\n                }\n            }).then(() => {\n                return group;\n            });\n        }\n\n        return request(url, {\n            data: JSON.stringify({}),\n            method: method\n        }).then(res => {\n            const version = get(res, 'rel.version');\n            group.set('version', version);\n            return group;\n        });\n    },\n\n    saveIndividuals(group, individuals, application) {\n        return this._individualsOperation(group, individuals, application, 'post');\n    },\n\n    deleteIndividuals(group, individuals, application) {\n        return this._individualsOperation(group, individuals, application, 'delete');\n    },\n\n    loadOwners: task(function* () {\n        yield this.loadPathFieldMembers('owners.owners');\n    }).drop(),\n\n    loadIndividuals: task(function* () {\n        yield this.loadPathFieldMembers('individuals.individuals');\n        const addedIndividuals = this.get('addedIndividuals');\n        const membership = this.get('membership');\n\n        if (membership) {\n            membership.addObjects(addedIndividuals);\n        }\n    }).drop(),\n\n    addKeyword(keyword) {\n        const key = this.get('filter.key');\n        const group = this.get('group');\n        const query = equals(keyword.field, keyword.value, this.get('intl'));\n        const data = {\n            q: [query],\n            entity: ['people']\n        };\n        const path = `membership.${key}`;\n        group.set(path, data);\n    },\n\n    addPerson(person) {\n        const key = this.get('filter.key');\n        const group = this.get('group');\n        const data = person.get('id');\n        if (key === 'owners' && !this.isOwner(person)) {\n            group.set('owners.owners', data);\n            const latestAdded = group.get('owners.owners').findBy('value', data);\n            if (latestAdded) {\n                Ember.set(latestAdded, 'guid', data);\n            }\n            this.get('loadOwners').perform();\n        } else if (key === 'individuals' && !this.isIndividual(person)) {\n            const addedIndividuals = this.get('addedIndividuals');\n            if (addedIndividuals) {\n                addedIndividuals.addObject(person);\n            }\n            const removedIndividuals = this.get('removedIndividuals');\n            if (removedIndividuals) {\n                removedIndividuals.removeObject(person);\n            }\n            const membership = this.get('membership');\n            if (membership) {\n                membership.addObject(person);\n            }\n\n            this.get('loadIndividuals').perform();\n        } else if (key === 'inclusions' || key === 'exclusions') {\n            const addedRules = this.get(key);\n            const query = personQuery(['self'], person);\n            const data = {\n                q: [query],\n                entity: ['people']\n            };\n            addedRules.addObject(data);\n        }\n    },\n\n    removePerson(person, memberTypeList) {\n        if (_.isEmpty(memberTypeList)) {\n            memberTypeList = [singularize(this.get('filter.key'))];\n        }\n        memberTypeList.forEach(type => {\n            let path = null;\n            const currentFilter = this.get('filter').path;\n\n            if (type === 'owner') {\n                path = 'owners.owners';\n            }\n\n            if (currentFilter === 'individuals.individuals') {\n                // it is possible that an owner can also be an individual\n                path = 'individuals.individuals';\n                const removedIndividuals = this.get('removedIndividuals');\n                if (removedIndividuals) {\n                    removedIndividuals.addObject(person);\n                }\n                const addedIndividuals = this.get('addedIndividuals');\n                if (addedIndividuals) {\n                    addedIndividuals.removeObject(person);\n                }\n            }\n\n            if (!path) {\n                return;\n            }\n\n            const group = this.get('group');\n            const id = person.get('id');\n            const values = group.getFieldValue(path);\n            const index = _.findIndex(values, value => {\n                if (value.value.q) {\n                    const q = _.head(value.value.q);\n                    return q.value === id || q.guid === id;\n                }\n                return value.value === id || value.guid === id;\n            });\n            if (index > -1) {\n                values.removeAt(index);\n                group.notifyPropertyChange(path);\n            }\n        });\n\n        const membership = this.get('membership');\n        if (membership) {\n            membership.removeObject(person);\n        }\n    },\n\n    removeRule(rule) {\n        const key = this.get('filter.key');\n        const group = this.get('group');\n        const keypath = `membership.${key}`;\n        const values = group.getFieldValue(keypath);\n        const index = _.findIndex(values, value => {\n            if (value._id && rule._id) {\n                return value._id === rule._id;\n            } else {\n                const groupData = _.head(value.value.q);\n                const ruleData = _.head(rule.value.q);\n                return groupData.value === ruleData.value && groupData.key === ruleData.key;\n            }\n        });\n        this.get(key).removeObject(rule.value);\n        if (index > -1) {\n            return values.removeAt(index);\n        }\n    },\n\n    loadContentOnScroll: task(function* () {\n        if (this.get('rateLimited')) return;\n\n        if (this.get('ignoreScroll')) {\n            this.set('ignoreScroll', false);\n        } else {\n            yield timeout(200);\n            if (this.get('loading.search')) {\n                return;\n            }\n            const listing = this.$('.membership-listing');\n            const scroll = listing.scrollTop();\n            const height = listing.prop('scrollHeight') - listing.height();\n\n            if (height - scroll > 500) {\n                return;\n            }\n\n            const filterKey = this.get('filter.key');\n            const isSearching = this.get('isSearching') || filterKey === 'rules';\n            const isEditing = this.get('editing') && ['owners', 'individuals'].indexOf(filterKey) > -1;\n\n            let promise;\n            if (isSearching) {\n                promise = this.loadSearchMembers();\n            } else if (isEditing || filterKey === 'individuals' || filterKey === 'owners') {\n                const path = filterKey === 'owners' ? 'owners.owners' : 'individuals.individuals';\n                promise = this.loadPathFieldMembers(path);\n            } else {\n                promise = this.loadMembershipList();\n            }\n\n            return promise.then(newMembership => {\n                Ember.set(this, 'loadedAll', _.isEmpty(newMembership));\n            });\n        }\n    }).drop(),\n\n    loadSearchMembers() {\n        const loading = this.get('loading.search');\n        const loadedAll = this.get('loadedAll');\n        if (loading || loadedAll) {\n            return Ember.RSVP.resolve([]);\n        }\n        this.set('currentlySearching', true);\n        this.set('loading.search', true);\n        return this.searchMembership(this.get('search')).then(content => {\n            if (this.isDestroying || this.isDestroyed) {\n                return;\n            }\n            if (Array.isArray(content.content)) {\n                content = content.content.map(x => x.getRecord());\n            }\n            this.set('loading.search', false);\n            const key = this.get('filter.key');\n            if (key !== 'all' && key !== 'rules') {\n                const filter = this.get(`group.${key}.${key}`);\n                if (filter) {\n                    const peopleIds = filter.mapBy('guid');\n                    content = _.filter(content, person => {\n                        return _.includes(peopleIds, person.get('id'));\n                    });\n                }\n            } else if (key === 'rules' && _.isEmpty(this.get('inclusionQueries'))) {\n                content = [];\n            }\n            if (this.get('currentPage')) {\n                this.get('membership').pushObjects(content || []);\n            } else {\n                Ember.set(this, 'membership', content);\n            }\n            this.incrementProperty('currentPage');\n            return content;\n        });\n    },\n\n    loadMembershipList() {\n        const loadedAll = this.get('loadedAll');\n        const loading = this.get('loading.search');\n        const editing = this.get('editing');\n        if (loading || loadedAll || editing) {\n            return Ember.RSVP.resolve([]);\n        }\n        const query = this.get('membershipQuery');\n        if (this.get('currentlySearching')) {\n            Ember.set(query, 'offset', 0);\n        }\n        Ember.set(this, 'loading.search', true);\n        const promise = this.get('store')\n            .findGroupMembership(this.get('group.id'), query)\n            .then(membership => {\n                if (this.get('currentlySearching')) {\n                    Ember.set(this, 'membership', []);\n                    Ember.set(this, 'currentlySearching', false);\n                }\n\n                Ember.set(this, 'membershipQuery.offset', query.offset + query.limit);\n\n                if (membership) {\n                    const promises = membership.map(member => {\n                        if (member.get('type') === 'user') {\n                            return member.get('profile').then(person => person);\n                        } else {\n                            return member\n                                .reload()\n                                .then(res => {\n                                    return res;\n                                })\n                                .catch(err => {\n                                    if (!this.isDestroying && !this.isDestroyed) {\n                                        if (err.errors[0].status === 429) {\n                                            if (!this.get('rateLimited')) {\n                                                this.set('membershipQuery.offset', query.offset - query.limit);\n                                                this.set('rateLimited', true);\n                                                this.get('notification').error(\n                                                    this.get('intl').t('notification.group.errors.rateLimit.title'),\n                                                    this.get('intl').t('notification.group.errors.rateLimit.message')\n                                                );\n\n                                                this.set(\n                                                    'retryTimeout',\n                                                    Ember.run.later(() => {\n                                                        this.set('rateLimited', false);\n                                                    }, this.get('retyTimeOutDuration'))\n                                                );\n                                            }\n                                        }\n                                    }\n                                });\n                        }\n                    });\n\n                    Ember.RSVP.allSettled(promises).then(results => {\n                        const filteredResults = results\n                            .map(r => r.value)\n                            .filter(r => {\n                                return r && r.isError !== true;\n                            });\n                        const allMemberships = _.uniqBy([...this.get('membership'), ...filteredResults], 'id');\n\n                        this.get('membership').setObjects(allMemberships);\n                    });\n                } else {\n                    this.get('membership').addObjects(membership);\n                }\n                Ember.set(this, 'loading.search', false);\n                return membership;\n            });\n        Ember.set(this, 'currentMembershipRequest', DS.PromiseArray.create({ promise }));\n\n        return promise;\n    },\n\n    setRulesOnGroup() {\n        const group = this.get('group');\n        _.forEach(this.get('inclusions'), rule => group.set('membership.inclusions', rule));\n        Ember.set(this, 'inclusions', []);\n\n        _.forEach(this.get('exclusions'), rule => group.set('membership.exclusions', rule));\n        Ember.set(this, 'exclusions', []);\n    },\n\n    isOwner(person) {\n        return this.get('group').isPersonOwner(person);\n    },\n\n    isIndividual(person) {\n        return this.get('group').isPersonIndividual(person);\n    },\n\n    loadPathFieldMembers(path) {\n        const loadedAll = this.get('loadedAll');\n        const loading = this.get('loading.search');\n\n        if (loading || loadedAll) {\n            return Ember.RSVP.resolve([]);\n        }\n        let ids;\n        let fieldData = this.get(`group.${path}`);\n        if (fieldData) {\n            ids = fieldData.mapBy('guid');\n        }\n\n        const query = this.get('membershipQuery');\n        if (this.get('currentlySearching')) {\n            Ember.set(query, 'offset', 0);\n        }\n\n        if (_.isEmpty(ids)) {\n            Ember.set(this, 'loading.search', false);\n            Ember.set(this, 'membership', []);\n            return Ember.RSVP.resolve([]);\n        }\n        if (!Array.isArray(ids)) {\n            ids = [ids];\n        }\n\n        const updateOffset = ids.length > this.memberListLimitSize;\n\n        ids = ids.slice(query.offset, query.offset + query.limit);\n\n        if (updateOffset) {\n            Ember.set(this, 'membershipQuery.offset', query.offset + query.limit);\n        }\n        Ember.set(this, 'loading.search', true);\n\n        return this.get('store')\n            .findMany('person', ids, BASE_PERSON)\n            .then(content => {\n                if (this.isDestroying || this.isDestroyed) {\n                    return;\n                }\n\n                if (this.get('currentlySearching')) {\n                    Ember.set(this, 'membership', []);\n                    Ember.set(this, 'currentlySearching', false);\n                }\n\n                if (!Array.isArray(content)) {\n                    content = [content];\n                }\n\n                content = this.sort(content);\n\n                Ember.set(this, 'loading.search', false);\n                this.get('membership').addObjects(content);\n                return content;\n            });\n    },\n\n    sort(content) {\n        return content.sort((a, b) => {\n            const aName = a.get('name');\n            const bName = b.get('name');\n            if (aName > bName) {\n                return 1;\n            }\n            if (aName < bName) {\n                return -1;\n            }\n            return 0;\n        });\n    },\n\n    loadRules: task(function* () {\n        const isPending = this.get('page.isPending');\n        if (isPending) {\n            return;\n        }\n        Ember.set(this, 'currentPage', 0);\n        yield this.loadSearchMembers();\n    }),\n\n    loadAll: task(function* () {\n        yield this.loadMembershipList();\n    }),\n\n    handleJobFinish() {\n        this.get('loadAll').perform();\n        this.get('group').reload();\n    },\n\n    searchMembership(search) {\n        if (search && search.length < 2) {\n            return Ember.RSVP.resolve([]);\n        }\n        const builder = this.get('searchService').requestBuilder();\n        const group = this.get('group');\n        const fieldPath = `${group.getFieldValue('general.groupType').value}.guid`;\n        builder.addQuery(group.get('guid'), 'AND', 'EXACT', [fieldPath]);\n        if (search) {\n            builder.addQuery(search);\n        }\n        return this.get('searchService').performCustomSearch(builder);\n    },\n\n    loadMoreMembersOnInit() {\n        if (this.get('group.memberCount') <= 10) {\n            return;\n        }\n\n        let listingEl = this.$('.membership-listing');\n        if (!listingEl) {\n            return;\n        }\n\n        // Sometimes we've gotta load the second page depending on how much available screen\n        // space the user has. Otherwise they can't load more members!\n        let containerHeight = listingEl.height();\n        let heightPerEntry = 90;\n        if (containerHeight / heightPerEntry < this.get('membership.length')) {\n            return;\n        }\n\n        return this.get('loadContentOnScroll').perform();\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"TZJqmQU+\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"group\\\",\\\"isDynamicGroup\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"expression-display-header\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"expression-display\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"expressionDisplay\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn show-dynamic-rules\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectTab\\\",\\\"dynamicRules\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.edit\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"membership-header\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-5\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"h4\\\",[]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canViewRules\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"small\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleRules\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showRules\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.viewMembership\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.viewRules\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"header-right\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[9,\\\"gux-button-multi\\\",{\\\"attrs\\\":[[16,\\\"text\\\",[34,[[26,[\\\"dropdownTitle\\\"]]]]],[15,\\\"accent\\\",\\\"secondary\\\"],[15,\\\"class\\\",\\\"group-profile-members-button\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"showingFilterChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[9,\\\"gux-list-item\\\",{\\\"attrs\\\":[[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectFilter\\\",[28,[\\\"filter\\\"]]],null],null],[16,\\\"class\\\",[34,[[28,[\\\"filter\\\",\\\"key\\\"]]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[[28,[\\\"filter\\\",\\\"string\\\"]]],null],false],[0,\\\"\\\\n                    \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"filter\\\"]},null],[0,\\\"            \\\"]]}],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editMembership\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.edit\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-label\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.enableCalls\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"toggle\\\"],[[28,[\\\"callsEnabled\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"toggleCallsEnabled\\\"]]],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"filter-tabs\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"nav nav-tabs\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"editingFilterChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[15,\\\"role\\\",\\\"presentation\\\"],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"filter\\\",\\\"active\\\"]],\\\"active\\\"],null],\\\" \\\",[28,[\\\"filter\\\",\\\"key\\\"]],\\\"-tab\\\"]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectFilter\\\",[28,[\\\"filter\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[[28,[\\\"filter\\\",\\\"string\\\"]]],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"filter\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"shouldShowRules\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"membership-search\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"group-profile/membership-search\\\"],null,[[\\\"group\\\",\\\"loading\\\",\\\"editing\\\",\\\"updateSearch\\\",\\\"filter\\\",\\\"mode\\\"],[[28,[\\\"group\\\"]],[28,[\\\"loading\\\",\\\"search\\\"]],[28,[\\\"editing\\\"]],\\\"updateSearch\\\",[28,[\\\"filter\\\"]],\\\"search\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"membership-listing \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"shouldShowRules\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"group\\\",\\\"allowPermissionGroup\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"alert alert-warning roles-rules-info-message\\\"],[15,\\\"role\\\",\\\"alert\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-info-circle\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.rulesDisabledMessage\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"membershipRules\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12 member\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"group-profile/membership-rule-entry\\\"],null,[[\\\"rule\\\",\\\"group\\\",\\\"editing\\\",\\\"filter\\\",\\\"deleteRule\\\"],[[28,[\\\"rule\\\"]],[28,[\\\"group\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"filter\\\"]],\\\"removeRule\\\"]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"rule\\\"]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.noResults\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"membership\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12 member\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"group-profile/membership-entry\\\"],null,[[\\\"person\\\",\\\"group\\\",\\\"editing\\\",\\\"individuals\\\",\\\"membership\\\",\\\"deletePerson\\\"],[[28,[\\\"member\\\"]],[28,[\\\"group\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"addedIndividuals\\\"]],[28,[\\\"membership\\\"]],\\\"removePerson\\\"]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"member\\\"]},{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"loading\\\",\\\"search\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center empty\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.noResults\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayEditingFooter\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"editing-footer\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"add-member \\\",[33,[\\\"if\\\"],[[28,[\\\"isEditingRules\\\"]],\\\"col-sm-6\\\",\\\"col-sm-12\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"group-profile/membership-search\\\"],null,[[\\\"group\\\",\\\"loading\\\",\\\"filter\\\",\\\"selectPerson\\\",\\\"mode\\\"],[[28,[\\\"group\\\"]],[28,[\\\"loading\\\",\\\"add\\\"]],[28,[\\\"filter\\\"]],\\\"selectPerson\\\",\\\"add\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isEditingRules\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-keyword col-sm-6\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"group-profile/membership-tag-search\\\"],null,[[\\\"group\\\",\\\"filter\\\",\\\"selectKeyword\\\",\\\"mode\\\"],[[28,[\\\"group\\\"]],[28,[\\\"filter\\\"]],\\\"selectKeyword\\\",\\\"add\\\"]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"submit col-sm-12\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-success btn-purecloud\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"save\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"group\\\",\\\"isSaving\\\"]],[28,[\\\"saving\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"group\\\",\\\"isReloading\\\"]],[33,[\\\"not\\\"],[[28,[\\\"saving\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/membership-listing/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport LoggerMixin from '../../../mixins/logger';\n\nconst { computed, Component } = Ember;\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['group-membership-rule-entry'],\n\n    store: Ember.inject.service(),\n\n    rule: null,\n    group: null,\n    filter: null,\n    editing: false,\n\n    relationships: ['ancestors', 'parent', 'self', 'siblings', 'children', 'descendants'],\n    groupedRelationships: [\n        ['ancestors', 'parent'],\n        ['self', 'siblings'],\n        ['children', 'descendants']\n    ],\n\n    actions: {\n        toggleRelationship(relationship) {\n            const key = `graph.${relationship}`;\n            this.toggleProperty(key);\n            const value = this.get(key);\n            const field = this.get('rule');\n            const { rels } = _.last(Ember.get(field, 'value.q'));\n            if (value) {\n                rels.addObject(relationship);\n            } else {\n                rels.removeObject(relationship);\n            }\n        },\n\n        deleteRule() {\n            this.sendAction('deleteRule', this.get('rule'));\n        }\n    },\n\n    isKeyword: computed('rule.value.q.@each.type', function () {\n        const q = this.get('rule.value.q');\n        return _.head(q).type === 'equals';\n    }),\n\n    relationshipGroups: computed(\n        'groupedRelationships',\n        'graph.{self,parent,ancestors,siblings,children,descendants}',\n        function () {\n            const groupedRelationships = this.get('groupedRelationships');\n            return groupedRelationships.map(group => {\n                return group.map(relationship => {\n                    return {\n                        relationship,\n                        key: `person.graph.${relationship}`,\n                        selected: this.relationshipSelected(relationship)\n                    };\n                });\n            });\n        }\n    ),\n\n    field: computed('group', 'filter.key', function () {\n        const key = this.get('filter.key');\n        return this.get(`group.fieldConfig.membership.${key}`);\n    }),\n\n    person: computed('rule.value.q.@each.value', 'isKeyword', function () {\n        if (this.get('isKeyword')) {\n            return;\n        }\n        const q = this.get('rule.value.q');\n        let guid = _.head(q).guid;\n        let oid = _.head(q).value;\n        if (!guid && !!oid) {\n            // We've got a weird case where a guid value was not populated by directory\n            // Log and take these errors to directory team so they can migrate\n            this.logger.error('Found a group rule entry without a guid value', {\n                group: this.get('group.id')\n            });\n        }\n        return this.get('store').findRecord('person', guid || oid);\n    }),\n\n    graph: computed('rule.value.q.@each.rels', function () {\n        const q = this.get('rule.value.q');\n        return this.buildGraphFromRelationships(_.head(q).rels);\n    }),\n\n    name: computed('person.name', 'isKeyword', 'rule', function () {\n        if (this.get('isKeyword')) {\n            const q = this.get('rule.value.q');\n            return _.head(q).value;\n        }\n        return this.get('person.name');\n    }),\n\n    title: computed('person.title', 'isKeyword', 'rule', function () {\n        if (this.get('isKeyword')) {\n            const q = this.get('rule.value.q');\n            return _.head(q).key;\n        }\n        return this.get('person.title');\n    }),\n\n    relationshipSelected(relationship) {\n        return this.get('graph')[relationship];\n    },\n\n    buildGraphFromRelationships(rels) {\n        const graph = {};\n        _.forEach(rels, rel => {\n            graph[rel] = true;\n        });\n        const defaults = {\n            ancestors: false,\n            parent: false,\n            self: false,\n            siblings: false,\n            children: false,\n            descendants: false\n        };\n        const options = Object.assign({}, defaults, graph);\n        return Ember.Object.create(options);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        // If this entry fails to load due to the person record\n        // not being found, let's log it\n        let person = this.get('person');\n        if (!person || !person.catch) {\n            return;\n        }\n        person.catch(error => {\n            this.logger.error('Error loading membership rule entry', {\n                error\n            });\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"+jW7/wZi\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isKeyword\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-keyword\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"showPresence\\\"],[[33,[\\\"await\\\"],[[28,[\\\"person\\\"]]],null],true]],{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[33,[\\\"await\\\"],[[28,[\\\"person\\\"]]],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-name\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[26,[\\\"name\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-title\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isKeyword\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"tag-lookup\\\"],[[28,[\\\"title\\\"]]],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[1,[26,[\\\"title\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isKeyword\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"relationships\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"relationshipGroups\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"btn-group\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"group\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[\\\"btn btn-purecloud \\\",[33,[\\\"if\\\"],[[28,[\\\"relationship\\\",\\\"selected\\\"]],\\\"active\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleRelationship\\\",[28,[\\\"relationship\\\",\\\"relationship\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[[28,[\\\"relationship\\\",\\\"key\\\"]]],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"relationship\\\"]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"group\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"graph\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"person-graph\\\"],null,[[\\\"person\\\",\\\"width\\\",\\\"height\\\",\\\"graph\\\",\\\"mini\\\"],[[28,[\\\"person\\\"]],50,50,[28,[\\\"graph\\\"]],true]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"delete danger\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"deleteRule\\\"]],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/membership-rule-entry/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport { SearchMixin } from '../../../mixins/search';\n\nconst { get, run, inject, computed, observer, Component } = Ember;\n\nfunction removeDuplicates(group, key, results) {\n    let currentIds;\n    const current = group.getFieldValue(key);\n    if (current) {\n        currentIds = current.mapBy('value');\n    }\n    if (_.includes(key, 'membership')) {\n        currentIds = currentIds.map(id => {\n            const data = _.head(id.q) || {};\n            return Ember.get(data, 'value');\n        });\n    }\n    if (results && currentIds.length) {\n        return results.filter(result => {\n            const id = result.get('id');\n            return !currentIds.includes(id);\n        });\n    }\n    return results;\n}\n\nexport default Component.extend(SearchMixin, {\n    classNames: ['group-membership-search'],\n\n    intl: inject.service(),\n    search: inject.service(),\n\n    entityFilter: 'people',\n\n    group: null,\n    searchValue: null,\n    mode: null,\n    filter: null,\n\n    searchLimit: 6,\n    editing: false,\n\n    actions: {\n        clearSearch() {\n            this.set('searchValue', '');\n            this.updateSearchOnChange();\n        },\n\n        select(person) {\n            this.sendAction('selectPerson', person);\n            this.resetPersonSearch();\n        },\n\n        searchInputUpdated(event) {\n            this.set('searchValue', event.target.value);\n            this.updateSearchOnChange();\n        }\n    },\n\n    isRules: computed('filter.key', function () {\n        const key = this.get('filter.key');\n        return key === 'inclusions' || key === 'exclusions';\n    }),\n\n    iconClass: computed('iconClass', function () {\n        if (this.get('mode') === 'search') {\n            return 'pc-moon pc-search';\n        }\n        return 'pc pc-add-person';\n    }),\n\n    searchText: computed('mode', function () {\n        const intl = this.get('intl');\n        if (this.get('mode') === 'search') {\n            return intl.lookup('groups.searchMembers').toString();\n        }\n        return intl.lookup('groups.addPerson').toString();\n    }),\n\n    dismissed: computed('results.[]', function () {\n        return _.isEmpty(this.get('results'));\n    }),\n\n    results: computed('searchResults.[]', function () {\n        const group = this.get('group');\n        const key = this.get('filter.path');\n        return removeDuplicates(group, key, this.get('searchResults'));\n    }),\n\n    showSearchResults: computed('mode', 'dismissed', 'results.[]', function () {\n        const mode = this.get('mode');\n        const dismissed = this.get('dismissed');\n        return mode === 'add' && !dismissed;\n    }),\n\n    currentSearchRequestUpdated: observer('currentSearchRequest', function () {\n        this.get('currentSearchRequest').then(() => {\n            this.set('loading', false);\n        });\n    }),\n\n    didUpdateAttrs({ newAttrs, oldAttrs }) {\n        if (!newAttrs || !oldAttrs) {\n            return;\n        }\n\n        if (get(newAttrs, 'editing.value') !== get(oldAttrs, 'editing.value')) {\n            this.set('searchValue', null);\n        }\n    },\n\n    didReceiveAttrs() {\n        const filter = this.get('filter');\n        const previousFilter = this.get('_previousFilter');\n        if (previousFilter && filter !== previousFilter) {\n            this.set('searchValue', '');\n        }\n        this.set('_previousFilter', filter);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.attachOutsideHandler();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.removeOutsideHandler();\n    },\n\n    updateSearchOnChange() {\n        if (this.get('mode') === 'search') {\n            this.sendAction('updateSearch', this.get('searchValue'));\n        } else {\n            run.debounce(this, this.performPersonSearch, 300);\n        }\n    },\n\n    attachOutsideHandler() {\n        Ember.$(window).on(`click.${this.get('elementId')}`, event => {\n            Ember.run(() => {\n                if (this.get('dismissed')) {\n                    return;\n                }\n                const target = Ember.$(event.target);\n                if (!target.parents('.group-membership-search').length) {\n                    this.resetPersonSearch();\n                }\n            });\n        });\n    },\n\n    removeOutsideHandler() {\n        Ember.$(window).off(`.${this.get('elementId')}`);\n    },\n\n    performPersonSearch() {\n        const search = this.get('searchValue');\n        if (!_.isEmpty(search.trim())) {\n            this.set('loading', true);\n\n            this.get('search')\n                .performSearch(search, 0, 'users')\n                .then(({ results }) => {\n                    this.set('loading', false);\n                    this.set('searchResults', results);\n                });\n        } else {\n            this.set('searchResults', []);\n            this.set('searchMeta', {});\n        }\n    },\n\n    resetPersonSearch() {\n        this.set('searchValue', '');\n        this.set('searchResults', []);\n        this.set('searchMeta', {});\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"Lg51p2d0\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"searchValue\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-close clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"clearSearch\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[[26,[\\\"iconClass\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"hidden\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-membership-search\\\"]]],[13],[1,[33,[\\\"t\\\"],[\\\"groups.searchMembers\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-membership-search\\\"]]],[15,\\\"class\\\",\\\"form-control purecloud-input\\\"],[16,\\\"value\\\",[34,[[26,[\\\"searchValue\\\"]]]]],[16,\\\"placeholder\\\",[34,[[26,[\\\"searchText\\\"]]]]],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"searchInputUpdated\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showSearchResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"search-results show dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"isKeyword\\\"]],\\\"keyword\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"results-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"results\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"clearfix\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"select\\\",[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"showPresence\\\"],[[28,[\\\"result\\\"]],true]],{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[28,[\\\"result\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"result\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"department\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"result\\\",\\\"department\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"result\\\"]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.noResultsDuplicateEntries\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/membership-search/template.hbs\"}});","import Ember from 'ember';\n\nimport { SEARCH_FACET_KEYPATHS } from '../../../search/service';\nimport _ from 'lodash';\n\nconst { on, inject, computed, observer, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['group-membership-search', 'tag-search'],\n\n    intl: inject.service(),\n    search: inject.service(),\n\n    group: null,\n    searchValue: null,\n    mode: null,\n    filter: null,\n\n    loading: false,\n    editing: false,\n\n    actions: {\n        clearSearch() {\n            this.set('searchValue', '');\n        },\n\n        keyword(keyword) {\n            this.sendAction('selectKeyword', keyword);\n            this.resetSearch();\n        },\n\n        updateSearch(event) {\n            const value = event.target.value;\n            this.set('searchValue', value);\n            if (this.get('mode') === 'search') {\n                this.sendAction('updateSearch', value);\n            } else if (value === '') {\n                this.resetSearch();\n            } else {\n                Ember.run.debounce(this, this.performSearch, value, 250);\n            }\n        }\n    },\n\n    searchText: computed(function () {\n        return this.get('intl').lookup('groups.addKeyword').toString();\n    }),\n\n    results: computed('tagSearchResults.[]', function () {\n        return this.get('tagSearchResults');\n    }),\n\n    iconClass: computed('iconClass', function () {\n        if (this.get('mode') === 'search') {\n            return 'pc-search';\n        }\n        return 'pc-add-person';\n    }),\n\n    dismissed: computed('results.[]', function () {\n        return _.isEmpty(this.get('results'));\n    }),\n\n    editingStateChanged: observer('editing', function () {\n        if (!_.isEmpty(this.get('searchValue'))) {\n            this.set('searchValue', '');\n        }\n    }),\n\n    currentSearchRequestUpdated: observer('currentSearchRequest', function () {\n        this.get('currentSearchRequest').then(() => {\n            this.set('loading', false);\n        });\n    }),\n\n    showSearchResults: computed('mode', 'dismissed', 'results.[]', function () {\n        const mode = this.get('mode');\n        const dismissed = this.get('dismissed');\n        return mode === 'add' && !dismissed;\n    }),\n\n    attachOutsideHandler: on('didInsertElement', function () {\n        return Ember.$(window).on(`click.${this.get('elementId')}`, event => {\n            Ember.run(() => {\n                if (this.get('dismissed')) {\n                    return;\n                }\n                const target = Ember.$(event.target);\n                if (!target.parents('.group-membership-search').length) {\n                    this.resetSearch();\n                }\n            });\n        });\n    }),\n\n    removeOutsideHandler: on('willDestroyElement', function () {\n        Ember.$(window).off(`.${this.get('elementId')}`);\n    }),\n\n    performSearch(search) {\n        if (!_.isEmpty(search.trim())) {\n            this.set('loading', true);\n\n            const type = 'CONTAINS';\n            const builder = this.get('search').requestBuilder();\n            const fields = ['profileSkills', 'department', 'certifications', 'title'];\n            builder.addAggregations(\n                ['profileSkills', search, 'profileSkills', type, 5],\n                ['department', search, 'department', type, 5],\n                ['certifications', search, 'certifications', type, 5],\n                ['title', search, 'title', type, 5]\n            );\n            this.get('search')\n                .performCustomSearch(builder)\n                .then(data => {\n                    this.set('loading', false);\n                    const results = fields.map(field => {\n                        const aggregates = data[field];\n                        return aggregates.map(aggregate => {\n                            return {\n                                field: SEARCH_FACET_KEYPATHS[field],\n                                value: aggregate.key\n                            };\n                        });\n                    });\n                    this.set('results', _.flatten(results));\n                });\n        }\n    },\n\n    resetSearch() {\n        this.set('loading', false);\n        this.set('searchValue', '');\n        this.set('results', []);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"7cwxw4o7\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"searchValue\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-close clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"clearSearch\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[\\\"pc \\\",[26,[\\\"iconClass\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"hidden\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-membership-tag-search\\\"]]],[13],[1,[33,[\\\"t\\\"],[\\\"groups.searchMemberTags\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-membership-tag-search\\\"]]],[16,\\\"value\\\",[34,[[26,[\\\"searchValue\\\"]]]]],[15,\\\"class\\\",\\\"form-control purecloud-input\\\"],[16,\\\"placeholder\\\",[34,[[26,[\\\"searchText\\\"]]]]],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateSearch\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showSearchResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"search-results show dropdown-menu keyword\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"results-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"results\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"clearfix\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"keyword\\\",[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-keyword\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"result\\\",\\\"value\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"department\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"tag-lookup\\\"],[[28,[\\\"result\\\",\\\"field\\\"]]],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"result\\\"]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.noResultsDuplicateEntries\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/membership-tag-search/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport JobMixin from '../../../mixins/job';\n\nexport default Ember.Component.extend(JobMixin, {\n    intl: Ember.inject.service(),\n    store: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    session: Ember.inject.service(),\n    groupAssignedRoles: Ember.inject.service(), // tracks the roles/division relationships for display\n\n    isEditingRoles: false,\n    displayRoleRemoveModal: false,\n    rolesToDelete: [],\n    displayRulesRolesWarningModel: false,\n\n    // tracks all unsaved grant changes when editing roles for group\n    unsavedGrants: new Ember.Object({\n        roles: {}, //map of roles that contains a map of unsaved-grant objects\n        _hasUnsavedGrants: false,\n        parent: undefined, //pass reference after instantiation\n        hasUnsavedGrants: undefined, //create computed after instantiation\n        add({ grantId, roleId, divisionId }) {\n            const grantModel = this.get('parent.store').peekRecord('grant', grantId);\n            if (!this.get('roles')[roleId]) {\n                this.get('roles')[roleId] = {};\n            }\n            //if grant already exists, then just make sure we don't delete it\n            if (grantModel) {\n                delete this.get('roles')[roleId][grantId];\n            } else {\n                this.get('roles')[roleId][grantId] = {\n                    action: 'save',\n                    roleId,\n                    divisionId\n                };\n            }\n            this.recalculateHasUnsavedGrants();\n        },\n        remove({ grantId, roleId }) {\n            if (!this.get('roles')[roleId]) {\n                this.get('roles')[roleId] = {};\n            }\n            const grantModel = this.get('parent.store').peekRecord('grant', grantId);\n            if (grantModel) {\n                this.get('roles')[roleId][grantId] = { action: 'delete' };\n            } else {\n                delete this.get('roles')[roleId][grantId];\n            }\n            this.recalculateHasUnsavedGrants();\n        },\n        addAllFutureDivisions({ grantId, roleId }) {\n            this.get('roles')[roleId] = {};\n            this.add({ divisionId: '*', roleId, grantId });\n        },\n        removeAllFutureDivisions(roleId, grantId) {\n            this.remove({ roleId, grantId });\n        },\n        recalculateHasUnsavedGrants() {\n            const grantMaps = _.values(this.get('roles'));\n            let hasUnsavedGrants = false;\n            grantMaps.forEach(grantMap => {\n                if (Object.keys(grantMap).length) {\n                    hasUnsavedGrants = true;\n                }\n            });\n            this.set('_hasUnsavedGrants', hasUnsavedGrants);\n        },\n        clear() {\n            this.set('roles', {});\n            this.recalculateHasUnsavedGrants();\n        }\n    }),\n\n    groupRolesViewColumns: Ember.computed('model', 'session.features', function () {\n        const nameColumn = {\n            key: 'role.name',\n            header: this.get('intl').lookup('groups.roles.name'),\n            cellClass: 't-role-name-view'\n        };\n        const typeColumn = {\n            key: 'role.type',\n            header: this.get('intl').lookup('groups.roles.type'),\n            cellClass: 't-role-type-view'\n        };\n        const descriptionColumn = {\n            key: 'role.description',\n            header: this.get('intl').lookup('common.description'),\n            cellClass: 't-role-description-view'\n        };\n        const divisionsViewColumn = {\n            key: 'divisions',\n            header: this.get('intl').lookup('groups.roles.divisions'),\n            width: '255px',\n            component: 'group-profile/roles-edit/fixtable/division-view',\n            cellClass: 't-role-divisions-view'\n        };\n        const deleteColumn = {\n            header: 'delete button',\n            hideLabel: true,\n            component: 'group-profile/roles-edit/fixtable/list-remove',\n            iconClass: 'fa fa-times',\n            width: '1px',\n            class: 'list-remove-button'\n        };\n\n        return [nameColumn, typeColumn, descriptionColumn, divisionsViewColumn, deleteColumn];\n    }),\n\n    groupRolesEditColumns: Ember.computed('model', 'session.features', function () {\n        const nameColumn = {\n            key: 'name',\n            header: this.get('intl').lookup('groups.roles.name'),\n            cellClass: 't-role-name-edit'\n        };\n        const typeColumn = {\n            key: 'type',\n            header: this.get('intl').lookup('groups.roles.type'),\n            cellClass: 't-role-type-edit'\n        };\n        const descriptionColumn = {\n            key: 'description',\n            header: this.get('intl').lookup('common.description'),\n            cellClass: 't-role-description-edit'\n        };\n        const divisionsEditColumn = {\n            key: 'divisions',\n            header: this.get('intl').lookup('groups.roles.divisions'),\n            width: '350px',\n            component: 'group-profile/roles-edit/fixtable/division-select',\n            cellClass: 't-role-divisions-edit'\n        };\n        const assignmentColumn = {\n            header: this.get('intl').lookup('groups.roles.selection'),\n            component: 'group-profile/roles-edit/fixtable/is-assigned-toggle',\n            width: '1px',\n            cellClass: 't-role-is-assigned'\n        };\n\n        return [nameColumn, typeColumn, descriptionColumn, divisionsEditColumn, assignmentColumn];\n    }),\n\n    hasRules: Ember.computed('model.membership.inclusions', 'model.membership.exclusions', function () {\n        return (\n            !_.isEmpty(this.get('model.membership.inclusions')) || !_.isEmpty(this.get('model.membership.exclusions'))\n        );\n    }),\n\n    actions: {\n        editRoles() {\n            if (this.get('hasRules')) {\n                this.set('displayRulesRolesWarningModel', true);\n            } else {\n                this.set('isEditingRoles', true);\n                this.set('allRolesFiltered', this.get('allRoles'));\n            }\n        },\n\n        toggleRolesEnabled() {\n            this._toggleRolesEnabled();\n        },\n\n        confirmWarningModal() {\n            this.set('displayRulesRolesWarningModel', false);\n            this._enableRoles();\n        },\n\n        closeRulesRolesWarningModal() {\n            this.set('displayRulesRolesWarningModel', false);\n        },\n\n        getGroupRoles() {\n            this._getGroupRoles();\n        },\n\n        deleteRoles() {\n            this._deleteRoles();\n        },\n\n        openConfirmModelSingleRole(roleId) {\n            const grantRole = this.get('groupAssignedRoles.list').find(grantRoles => {\n                return Ember.get(grantRoles, 'id') === roleId;\n            });\n            this.set('rolesToDelete', [grantRole.role]);\n            this.set('displayRoleRemoveModal', true);\n        },\n\n        openConfirmModelMultipleRole(divisionRoles) {\n            let roles = divisionRoles.map(divisionRole => {\n                return divisionRole.role;\n            });\n            this.set('rolesToDelete', roles);\n            this.set('displayRoleRemoveModal', true);\n        },\n\n        save() {\n            this.set('isLoadingAllRoles', true);\n            let rolesToUpdate = {}; //map a role Id to a list of division ids to add that role for bulk save\n            let grantsToDelete = [];\n            let version = this.get('model.grantVersion');\n            _.values(this.get('unsavedGrants.roles')).forEach(grantMap => {\n                _.forOwn(grantMap, ({ action, roleId, divisionId }, grantId) => {\n                    if (action === 'save') {\n                        if (rolesToUpdate[roleId]) {\n                            rolesToUpdate[roleId].pushObject(divisionId);\n                        } else {\n                            rolesToUpdate[roleId] = [divisionId];\n                        }\n                    } else if (action === 'delete') {\n                        const undeletedGrant = this.get('store').peekRecord('grant', grantId);\n                        if (undeletedGrant) {\n                            grantsToDelete.pushObject(undeletedGrant);\n                        }\n                    } else {\n                        Ember.Logger.error('grant actions other than save or delete are not supported');\n                    }\n                });\n            });\n            // Make API calls sequentially to avoid api clobbering data\n            _.reduce(\n                rolesToUpdate,\n                (promise, divisionIds, roleId) => {\n                    return promise.then(() => {\n                        return this.get('store')\n                            .adapterFor('grant')\n                            .saveBulk(roleId, [this.get('model.guid')], divisionIds);\n                    });\n                },\n                Ember.RSVP.Promise.resolve()\n            )\n                .then(() => {\n                    return grantsToDelete.reduce((promise, undeletedGrant) => {\n                        return promise.then(() => {\n                            return undeletedGrant.destroyRecord();\n                        });\n                    }, Ember.RSVP.Promise.resolve());\n                })\n                .then(() => {\n                    this.get('unsavedGrants').clear();\n                    this._stopEditingRoles();\n                    this.get('notification').success(\n                        null,\n                        this.get('intl').lookup('groups.roles.roleAssignmentSaveSuccess')\n                    );\n                    return this._getGroupRoles(version);\n                })\n                .catch(err => {\n                    if (this._isTooManyGrantsError(err)) {\n                        this.get('notification').error(\n                            null,\n                            this.get('intl').lookup('groups.roles.tooManyGrantsSaveError')\n                        );\n                    } else {\n                        this.get('notification').error(\n                            null,\n                            this.get('intl').lookup('groups.roles.roleAssignmenSaveError')\n                        );\n                    }\n                    Ember.Logger.error('error saving grants', { error: err });\n                })\n                .finally(() => {\n                    this.set('isLoadingAllRoles', false);\n                });\n        },\n\n        searchAssignedRoles(query) {\n            if (query.length < 2) {\n                this.set('groupAssignedRolesFiltered', this.get('groupAssignedRoles.list'));\n            } else {\n                let filteredRoles = this.get('groupAssignedRoles.list').filter(roleDivision => {\n                    return Ember.get(roleDivision, 'role.name').toLowerCase().includes(query.toLowerCase());\n                });\n                this.set('groupAssignedRolesFiltered', filteredRoles);\n            }\n        },\n\n        searchAllRoles(query) {\n            if (query.length < 2) {\n                this.set('allRolesFiltered', this.get('allRoles'));\n            } else {\n                let filteredRoles = this.get('allRoles').filter(role => {\n                    return role.get('name').toLowerCase().includes(query.toLowerCase());\n                });\n                this.set('allRolesFiltered', filteredRoles);\n            }\n        },\n\n        cancel() {\n            this._stopEditingRoles();\n        },\n\n        updateUnsavedGrants(roleId, selectedDivisions, previouslySelectedDivisions) {\n            this._updateUnsavedGrants(roleId, selectedDivisions, previouslySelectedDivisions);\n        },\n\n        closeWarningModal() {\n            this.set('rolesToDelete', []);\n            this.set('displayRoleRemoveModal', false);\n        },\n\n        confirmHasRolesWarningModal() {\n            this.set('displayHasRolesWarningModel', false);\n            this._disableRoles();\n        },\n\n        closeHasRolesWarningModal() {\n            this.set('displayHasRolesWarningModel', false);\n        },\n        toggleRoleAssignment(roleId, isAssigned) {\n            if (isAssigned) {\n                this.get('groupAssignedRoles').addRole(roleId, {});\n            } else {\n                this.get('groupAssignedRoles').removeRole(roleId);\n            }\n        }\n    },\n\n    _stopEditingRoles() {\n        this.get('unsavedGrants').clear();\n        this._getGroupRoles();\n        Ember.trySet(this, 'isEditingRoles', false);\n    },\n\n    _updateUnsavedGrants(roleId, selectedDivisions, previouslySelectedDivisions) {\n        //add selected divisions to unsaved grants map\n        selectedDivisions.forEach(division => {\n            const grantId = this.get('model.guid') + roleId + division.id;\n            this.get('unsavedGrants').add({\n                grantId,\n                roleId,\n                divisionId: division.id\n            });\n        });\n        //remove unselected divisions\n        previouslySelectedDivisions.forEach(division => {\n            let stillSelectedDivision = selectedDivisions.find(stillSelectedDivision => {\n                return division.id === stillSelectedDivision.id;\n            });\n            if (!stillSelectedDivision) {\n                const grantId = this.get('model.guid') + roleId + division.id;\n                this.get('unsavedGrants').remove({ grantId, roleId });\n            }\n        });\n\n        //keep unsaved divisions change between role pages\n        if (selectedDivisions.length) {\n            this.get('groupAssignedRoles').addRole(roleId, {\n                id: roleId,\n                role: this.get('store').peekRecord('role', roleId),\n                divisions: selectedDivisions\n            });\n        } else {\n            this.get('groupAssignedRoles').removeRole(roleId);\n        }\n    },\n\n    _removeRole(role) {\n        let grantsToDelete = [];\n        let divisionRole = this.get('groupAssignedRoles').getRoleWithDivisions(role.id);\n        Ember.get(divisionRole, 'divisions').forEach(division => {\n            const grantId = this.get('model.guid') + Ember.get(role, 'id') + division.get('id');\n            let grantRecord = this.get('store').peekRecord('grant', grantId);\n            grantsToDelete.pushObject(grantRecord);\n        });\n        Ember.set(divisionRole, 'divisions', []);\n        // Make API calls sequentially to avoid api clobbering data\n        return grantsToDelete\n            .reduce((promise, undeletedGrant) => {\n                return promise.then(() => {\n                    return undeletedGrant.destroyRecord();\n                });\n            }, Ember.RSVP.Promise.resolve())\n            .then(data => {\n                this.get('notification').success(null, this.get('intl').lookup('groups.roles.removeSuccess'));\n                return data;\n            })\n            .catch(err => {\n                this.get('notification').error(null, this.get('intl').lookup('groups.roles.removeError'));\n                return err;\n            });\n    },\n\n    _deleteRoles() {\n        Ember.trySet(this, 'isLoadingGroupRoles', true);\n        let version = this.get('model.grantVersion');\n        // Make API calls sequentially to avoid api clobbering data\n        return this.get('rolesToDelete')\n            .reduce((promise, role) => {\n                return promise.then(() => {\n                    return this._removeRole(role);\n                });\n            }, Ember.RSVP.Promise.resolve())\n            .then(() => {\n                return this._getGroupRoles(version);\n            })\n            .catch(err => {\n                Ember.Logger.error('error removing selected roles', { error: err });\n            })\n            .finally(() => {\n                this.set('rolesToDelete', []);\n                this.set('displayRoleRemoveModal', false);\n            });\n    },\n\n    _getGroupRoles(previousVersion, attempt = 0) {\n        if (attempt >= 10) {\n            return Ember.RSVP.reject('timed out waiting for group roles to update');\n        }\n        Ember.trySet(this, 'isLoadingGroupRoles', true);\n        const group = this.get('model');\n        if (!group) {\n            Ember.Logger.error('no group for roles edit component. (expected if test)');\n            return;\n        }\n        group\n            .getGrants()\n            .then(grants => {\n                //TODO: Bulk Update Does not Increment Version Number https://inindca.atlassian.net/browse/PLAT-1953\n                // if (previousVersion && this.get('model.grantVersion') <= previousVersion) {\n                //     return new Ember.RSVP.Promise((resolve) => {\n                //         Ember.run.later(() => {\n                //             resolve(this._getGroupRoles(previousVersion, ++attempt));\n                //         }, 500);\n                //     });\n                // }\n                let assignedRolesMap = {};\n                this.get('store').unloadAll('grant');\n                grants.forEach(grant => {\n                    grant.subjectId = this.get('model.guid');\n                    // push grants, roles and divisions to the store\n                    this.get('store').push(this.get('store').normalize('grant', grant));\n                    const role = this.get('store').push(this.get('store').normalize('role', grant.role));\n                    const division = this.get('store').push(this.get('store').normalize('division', grant.division));\n                    if (!assignedRolesMap[grant.role.id]) {\n                        assignedRolesMap[grant.role.id] = {\n                            id: grant.role.id,\n                            role,\n                            divisions: [division]\n                        };\n                    } else {\n                        Ember.get(assignedRolesMap[grant.role.id], 'divisions').pushObject(division);\n                    }\n                });\n                this.get('groupAssignedRoles').setMap(assignedRolesMap);\n                this.set('groupAssignedRolesFiltered', this.get('groupAssignedRoles.list'));\n            })\n            .catch(err => {\n                Ember.Logger.error('failed to load grants', { error: err });\n            })\n            .finally(() => {\n                this.isDestroyed || Ember.trySet(this, 'isLoadingGroupRoles', false); // workaround trySet until we get this fix https://github.com/emberjs/ember.js/pull/13355\n            });\n    },\n\n    _isTooManyGrantsError(err) {\n        return (\n            err &&\n            err.errors &&\n            err.errors.length &&\n            err.errors[0].message &&\n            err.errors[0].message.includes('Too many grants of role')\n        );\n    },\n\n    _toggleRolesEnabled() {\n        const turnOnRoles = !this.get('model.allowPermissionGroup');\n        if (turnOnRoles) {\n            this._toggleRolesOn();\n        } else {\n            this._toggleRolesOff();\n        }\n    },\n\n    _toggleRolesOn() {\n        if (this.get('hasRules')) {\n            this.set('displayRulesRolesWarningModel', true);\n        } else {\n            this._enableRoles();\n        }\n    },\n\n    _toggleRolesOff() {\n        if (this.get('groupAssignedRoles.list.length')) {\n            this.set('rolesToDelete', this.get('groupAssignedRoles.list'));\n            this.set('displayHasRolesWarningModel', true);\n        } else {\n            this._disableRoles();\n        }\n    },\n\n    _enableRoles() {\n        let hadRules = false;\n        this.set('isLoadingGroupRoles', true);\n        if (this.get('hasRules')) {\n            hadRules = true;\n            this.set('model.membership.exclusions', []);\n            this.set('model.membership.inclusions', []);\n        }\n        this.set('model.allowPermissionGroup', true);\n        return this.get('model')\n            .save()\n            .then(res => {\n                const job = Ember.get(res, 'meta.job');\n                if (hadRules) {\n                    const message = this.get('intl').lookup('notification.group.membership').toString();\n                    this.get('notification').success(null, message, {\n                        forceBrowserNotification: true\n                    });\n                }\n                if (job && job.jobId) {\n                    this.addJob(\n                        job,\n                        () => {\n                            this.get('model').reload();\n                        },\n                        this\n                    );\n                }\n                this.set('isLoadingGroupRoles', false);\n            });\n    },\n\n    _disableRoles() {\n        this.set('isLoadingGroupRoles', true);\n        this.set('rolesToDelete', this.get('groupAssignedRoles.list'));\n        return this._deleteRoles()\n            .then(() => {\n                this.set('model.allowPermissionGroup', false);\n                return this.get('model').save();\n            })\n            .then(() => {\n                this.set('isLoadingGroupRoles', false);\n            });\n    },\n\n    init() {\n        this.get('groupAssignedRoles').clear();\n        this.get('store').findAll('division'); //load divisions into the store for use in the fixtable table\n        this.get('unsavedGrants').parent = this; // pass parent reference into unsavedGrants object to provide access to injected properties\n        this.get('unsavedGrants').hasUnsavedGrants = Ember.computed('_hasUnsavedGrants', function () {\n            return this.get('_hasUnsavedGrants');\n        });\n        this.get('unsavedGrants').clear(); //in case the component didn't get the chance to clean itself up before it was destroyed\n        this._getGroupRoles();\n        //Load All Roles\n        this.set('isLoadingAllRoles', true);\n        this.get('store')\n            .findAll('role')\n            .then(roles => {\n                if (this.isDestroyed || this.isDestroying) {\n                    return;\n                }\n                this.set('allRoles', roles);\n                this.set('allRolesFiltered', roles);\n                this.set('isLoadingAllRoles', false);\n            });\n        this._super(...arguments);\n    }\n});\n","import Ember from 'ember';\nimport layout from './template';\n\nexport default Ember.Component.extend({\n    layout,\n    selectionIsEmpty: Ember.computed('selectedDataRows', function () {\n        let selectedDataRows = this.get('selectedDataRows');\n        return !selectedDataRows || !selectedDataRows.length;\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"hXr4u8/q\",\"block\":\"{\\\"statements\\\":[[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[16,\\\"disabled\\\",[26,[\\\"selectionIsEmpty\\\"]],null],[16,\\\"data-t\\\",[34,[[26,[\\\"bulkActionTitle\\\"]]]]],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"bulkAction\\\"]],\\\"bulkAction\\\",[28,[\\\"selectedDataRows\\\"]]],null]]],[13],[0,\\\"\\\\n    \\\"],[1,[26,[\\\"bulkActionTitle\\\"]],false],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/bulk-actions/selected-elements/template.hbs\"}});","import Ember from 'ember';\nimport layout from './template';\n\nexport default Ember.Component.extend({\n    classNames: ['fixtable-custom-footer'],\n    layout,\n\n    one: 1,\n    isFirstPage: Ember.computed.equal('currentPage', 1),\n    isLastPage: Ember.computed('currentPage', 'totalPages', function () {\n        return this.get('currentPage') === this.get('totalPages');\n    }),\n    listedPages: Ember.computed('currentPage', 'totalPages', function () {\n        let currentPage = this.get('currentPage');\n        let totalPages = this.get('totalPages');\n\n        // ideal number of pages to be linked on each side of current page\n        let neighbors = 3;\n\n        // determine how many pages \"short\" we are on each side\n        let pagesToFirst = currentPage - 1;\n        let pagesToLast = totalPages - currentPage;\n        let shortageL = pagesToFirst < neighbors ? neighbors - pagesToFirst : 0;\n        let shortageR = pagesToLast < neighbors ? neighbors - pagesToLast : 0;\n\n        // increase neighbors by the largest \"shortage\" value\n        neighbors += Math.max(shortageL, shortageR);\n\n        // calculate indices of first & last pages in range\n        let lowerIndex = currentPage - neighbors;\n        let upperIndex = currentPage + neighbors;\n        if (lowerIndex < 1) {\n            lowerIndex = 1;\n        }\n        if (upperIndex > totalPages) {\n            upperIndex = totalPages;\n        }\n\n        // build & return pages array\n        let pages = [];\n        for (let i = lowerIndex; i <= upperIndex; i++) {\n            pages.push({\n                index: i,\n                isCurrent: i === currentPage\n            });\n        }\n        return pages;\n    }),\n    firstPageListed: Ember.computed('listedPages', function () {\n        return (\n            this.get('listedPages')\n                .map(function (page) {\n                    return page.index;\n                })\n                .indexOf(1) >= 0\n        );\n    }),\n    secondPageListed: Ember.computed('listedPages', function () {\n        return (\n            this.get('listedPages')\n                .map(function (page) {\n                    return page.index;\n                })\n                .indexOf(2) >= 0\n        );\n    }),\n    penultimatePageListed: Ember.computed('listedPages', 'totalPages', function () {\n        return (\n            this.get('listedPages')\n                .map(function (page) {\n                    return page.index;\n                })\n                .indexOf(this.get('totalPages') - 1) >= 0\n        );\n    }),\n    finalPageListed: Ember.computed('listedPages', 'totalPages', function () {\n        return (\n            this.get('listedPages')\n                .map(function (page) {\n                    return page.index;\n                })\n                .indexOf(this.get('totalPages')) >= 0\n        );\n    }),\n    showPaginationControls: Ember.computed('listedPages', function () {\n        return this.get('listedPages').length > 1;\n    }),\n    showRangeLabel: Ember.computed.not('isLoading'),\n\n    actions: {\n        bulkAction(selectedDataRows, action) {\n            this.sendAction('bubbleAction', action, selectedDataRows);\n        },\n        showPage(pageNumber) {\n            this.set('currentPage', pageNumber);\n        },\n        showNextPage() {\n            this.sendAction('goToNextPage');\n        },\n        showPreviousPage() {\n            this.sendAction('goToPreviousPage');\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"WPVwICVQ\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"fixtable-footer-bulk-actions\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"bulkActions\\\"]]],[[\\\"selectedDataRows\\\",\\\"bulkAction\\\",\\\"bulkActionTitle\\\"],[[28,[\\\"selectedDataRows\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"bulkAction\\\",[28,[\\\"selectedDataRows\\\"]]],null],[28,[\\\"bulkActionTitle\\\"]]]]],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showRangeLabel\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"group-profile/roles-edit/fixtable/item-range\\\"],null,[[\\\"currentPage\\\",\\\"pageSize\\\",\\\"totalPages\\\",\\\"totalRows\\\"],[[28,[\\\"currentPage\\\"]],[28,[\\\"pageSize\\\"]],[28,[\\\"totalPages\\\"]],[28,[\\\"totalRows\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showPaginationControls\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"fixtable-pagination-controls\\\"],[13],[0,\\\"\\\\n\\\\n\\\"],[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link fixtable-btn-page-prev\\\"],[16,\\\"disabled\\\",[26,[\\\"isFirstPage\\\"]],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showPreviousPage\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.fixtable.go_previous\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"firstPageListed\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"fixtable-btn-page-jump\\\"],[15,\\\"data-page\\\",\\\"1\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showPage\\\",1]],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"one\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"secondPageListed\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-ellipsis-h\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"listedPages\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"fixtable-btn-page-jump\\\"],[16,\\\"disabled\\\",[28,[\\\"page\\\",\\\"isCurrent\\\"]],null],[16,\\\"data-page\\\",[28,[\\\"page\\\",\\\"index\\\"]],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showPage\\\",[28,[\\\"page\\\",\\\"index\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"page\\\",\\\"index\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"page\\\"]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"finalPageListed\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"penultimatePageListed\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-ellipsis-h\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"fixtable-btn-page-jump\\\"],[15,\\\"data-page\\\",\\\"1\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showPage\\\",[28,[\\\"totalPages\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"totalPages\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link fixtable-btn-page-next\\\"],[16,\\\"disabled\\\",[26,[\\\"isLastPage\\\"]],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showNextPage\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.fixtable.go_next\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/custom-footer/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    store: Ember.inject.service(),\n    groupAssignedRoles: Ember.inject.service(), // tracks the roles/division relationships for display\n    isAssigned: Ember.computed('groupAssignedRoles.changeCount', function () {\n        return this.get('groupAssignedRoles').containsRole(this.get('dataRow.id'));\n    }),\n\n    rowHasToggled: Ember.observer('groupAssignedRoles.changeCount', function () {\n        const isAssigned = this.get('groupAssignedRoles').containsRole(this.get('dataRow.id'));\n        const wasAssigned = this.get('wasAssigned');\n\n        if (wasAssigned === isAssigned) {\n            return;\n        } else {\n            this.set('wasAssigned', isAssigned);\n        }\n\n        if (!isAssigned) {\n            const previouslySelected = this.get('selectedDivisions');\n            this.set('selectedDivisions', []);\n            this._updateDivisions([], previouslySelected);\n        } else {\n            const homeDivision = this.get('store')\n                .peekAll('division')\n                .find(division => {\n                    return division.get('homeDivision');\n                });\n            const selected = [homeDivision];\n            this.set('selectedDivisions', selected);\n            this._updateDivisions(selected, []);\n        }\n    }),\n\n    allFutureDivisionsSelected: false,\n\n    actions: {\n        updateDivisions(currentSelection, info) {\n            this._updateDivisions(currentSelection, info.selected);\n        }\n    },\n\n    _updateDivisions(currentSelection, previousSelection) {\n        const allFutureDivision = currentSelection.find(division => {\n            return division.id === '*';\n        });\n        //don't allow special division to exist with any other division\n        if (allFutureDivision) {\n            currentSelection = [allFutureDivision];\n        }\n        this.set('allFutureDivisionsSelected', !!allFutureDivision);\n        this.set('selectedDivisions', currentSelection);\n        const roleId = this.get('dataRow.id');\n        this.bubbleAction('updateDivisions', roleId, currentSelection, previousSelection);\n    },\n\n    _loadDivisions() {\n        this.set('divisions', this.get('store').peekAll('division'));\n    },\n\n    _setSelectedDivisions() {\n        // need to set selected divisions from the divisions array to make select work\n        const roleId = this.get('dataRow.id');\n        const roleDivisions = this.get('groupAssignedRoles').getRoleWithDivisions(roleId)\n            ? Ember.get(this.get('groupAssignedRoles').getRoleWithDivisions(roleId), 'divisions')\n            : [];\n        if (roleDivisions && roleDivisions.length) {\n            const allDivisions = this.get('divisions');\n            const allFutureDivisionsSelected = roleDivisions.some(division => {\n                return division.id === '*';\n            });\n            this.set('allFutureDivisionsSelected', allFutureDivisionsSelected);\n            let selectedDivisions = [];\n\n            roleDivisions.forEach(selectedDivision => {\n                selectedDivisions.push(\n                    allDivisions.find(division => {\n                        return division.id === selectedDivision.id;\n                    })\n                );\n            });\n            this.set('selectedDivisions', selectedDivisions);\n        }\n    },\n\n    init() {\n        this._loadDivisions();\n        this._setSelectedDivisions();\n        this.set('wasAssigned', this.get('groupAssignedRoles').containsRole(this.get('dataRow.id')));\n        //for passing into  custom components (e.g. select-footer)\n        this.set('extra', { rolesEditComponent: this });\n        return this._super(...arguments);\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    store: Ember.inject.service(),\n    allDivisionsSelected: Ember.computed('select.selected', function () {\n        let optionsWithoutSpecial = this.get('select.options').filter(division => {\n            return division.id !== '*';\n        });\n        return this.get('select.selected.length') === optionsWithoutSpecial.length;\n    }),\n    allFutureDivisions: undefined,\n\n    _allFutureDivisionsObserver() {\n        const allFutureDivisions = this.get('allFutureDivisions');\n        if (allFutureDivisions) {\n            const powerSelectAPI = this.get('select');\n            const rolesEditComponent = this.get('extra.rolesEditComponent');\n            rolesEditComponent._updateDivisions([{ id: '*' }], powerSelectAPI.selected);\n        } else {\n            this._selectAll();\n        }\n    },\n\n    actions: {\n        selectAll() {\n            this._selectAll();\n        },\n        deselectAll() {\n            if (this.get('allFutureDivisions')) {\n                this.removeObserver('allFutureDivisions', this, '_allFutureDivisionsObserver');\n                this.set('allFutureDivisions', false);\n                this.addObserver('allFutureDivisions', this, '_allFutureDivisionsObserver');\n            }\n            const powerSelectAPI = this.get('select');\n            const rolesEditComponent = this.get('extra.rolesEditComponent');\n            rolesEditComponent._updateDivisions([], powerSelectAPI.selected);\n        }\n    },\n\n    _selectAll() {\n        if (this.get('allFutureDivisions')) {\n            return;\n        }\n        const powerSelectAPI = this.get('select');\n        const rolesEditComponent = this.get('extra.rolesEditComponent');\n        let optionsWithoutSpecial = powerSelectAPI.options.filter(division => {\n            return division.id !== '*';\n        });\n        rolesEditComponent._updateDivisions(optionsWithoutSpecial, powerSelectAPI.selected);\n    },\n\n    init() {\n        const powerSelectAPI = this.get('select');\n        const allFutureDivisions = powerSelectAPI.selected.some(division => {\n            return division.id === '*';\n        });\n        this.set('allFutureDivisions', allFutureDivisions);\n        this.addObserver('allFutureDivisions', this, '_allFutureDivisionsObserver');\n        return this._super(...arguments);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"RuP4Ryyk\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"select-footer\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[33,[\\\"if\\\"],[[28,[\\\"allFutureDivisions\\\"]],\\\"btn btn-link select-all-divisions disabled\\\",\\\"btn btn-link select-all-divisions\\\"],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectAll\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.selectFooter.selectAll\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        |\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"btn btn-link deselect-all-divisions\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"deselectAll\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.selectFooter.deselectAll\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"type\\\",\\\"disabled\\\",\\\"checked\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-division-toggle\\\"],null],\\\"checkbox\\\",[33,[\\\"not\\\"],[[33,[\\\"or\\\"],[[28,[\\\"allFutureDivisions\\\"]],[28,[\\\"allDivisionsSelected\\\"]]],null]],null],[28,[\\\"allFutureDivisions\\\"]]]]],false],[0,\\\"\\\\n        \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-division-toggle\\\"]]],[13],[0,\\\" \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.selectFooter.allFutureDivisions\\\"],null],false],[0,\\\" \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/division-select/select-footer/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({});\n","export default Ember.HTMLBars.template({\"id\":\"AzDakxFC\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"option\\\",\\\"id\\\"]],\\\"*\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.allDivisions\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[1,[28,[\\\"option\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/division-select/selected-division/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"q65Ds8WH\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isAssigned\\\"]]],null,{\\\"statements\\\":[[6,[\\\"power-select-multiple\\\"],null,[[\\\"renderInPlace\\\",\\\"selected\\\",\\\"options\\\",\\\"searchField\\\",\\\"class\\\",\\\"placeholder\\\",\\\"onchange\\\",\\\"extra\\\",\\\"noMatchesMessage\\\",\\\"selectedItemComponent\\\",\\\"afterOptionsComponent\\\"],[true,[28,[\\\"selectedDivisions\\\"]],[28,[\\\"divisions\\\"]],\\\"name\\\",\\\"divisions-power-select\\\",[33,[\\\"t\\\"],[\\\"groups.roles.selectDivisions\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"updateDivisions\\\"],null],[28,[\\\"extra\\\"]],[33,[\\\"t\\\"],[\\\"groups.roles.noDivisionsFound\\\"],null],\\\"group-profile/roles-edit/fixtable/division-select/selected-division\\\",\\\"group-profile/roles-edit/fixtable/division-select/select-footer\\\"]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"division\\\",\\\"id\\\"]],\\\"*\\\"],null]],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[33,[\\\"if\\\"],[[28,[\\\"allFutureDivisionsSelected\\\"]],\\\"division-select-option disabled\\\",\\\"division-select-option\\\"],null],null],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"division-name\\\"],[13],[1,[28,[\\\"division\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"division-description\\\"],[13],[1,[28,[\\\"division\\\",\\\"description\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"division\\\"]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/division-select/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    intl: Ember.inject.service(),\n\n    divisionsDisplayList: Ember.computed('dataRow.divisions.[]', function () {\n        const divisions = this.get('dataRow.divisions');\n        let displayString = '';\n        if (divisions.length) {\n            for (var i = 0; i < divisions.length - 1; i++) {\n                displayString +=\n                    divisions.objectAt(i).id === '*'\n                        ? this.get('intl').lookup('groups.roles.allDivisions')\n                        : divisions.objectAt(i).get('name');\n                displayString += ', ';\n            }\n            displayString +=\n                divisions.objectAt(i).id === '*'\n                    ? this.get('intl').lookup('groups.roles.allDivisions')\n                    : divisions.objectAt(i).get('name');\n        }\n        return displayString;\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"5snZkTTk\",\"block\":\"{\\\"statements\\\":[[1,[26,[\\\"divisionsDisplayList\\\"]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/division-view/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    groupAssignedRoles: Ember.inject.service(),\n\n    isAssigned: Ember.computed('groupAssignedRoles.changeCount', function () {\n        return this.get('groupAssignedRoles').containsRole(this.get('dataRow.id'));\n    }),\n\n    actions: {\n        toggle() {\n            const isAssigned = !this.get('groupAssignedRoles').containsRole(this.get('dataRow.id'));\n            const roleId = this.get('dataRow.id');\n            this.bubbleAction('assignRole', roleId, isAssigned);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"xDTp8+9U\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"class\\\",\\\"check\\\",\\\"toggle\\\"],[\\\"toggle-width\\\",[28,[\\\"isAssigned\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggle\\\"],null]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/is-assigned-toggle/template.hbs\"}});","import Ember from 'ember';\nimport layout from './template';\n\nexport default Ember.Component.extend({\n    classNames: ['fixtable-item-range'],\n    layout,\n\n    dash: '-',\n    firstItemIndex: Ember.computed('currentPage', 'pageSize', function () {\n        return (this.get('currentPage') - 1) * this.get('pageSize') + 1;\n    }),\n    lastItemIndex: Ember.computed('currentPage', 'pageSize', 'totalPages', 'totalRows', function () {\n        if (this.get('currentPage') === this.get('totalPages')) {\n            return this.get('totalRows');\n        } else {\n            return this.get('currentPage') * this.get('pageSize');\n        }\n    }),\n    isSingleItem: Ember.computed('firstItemIndex', 'lastItemIndex', function () {\n        return this.get('firstItemIndex') === this.get('lastItemIndex');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"X1zLrc19\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"totalRows\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isSingleItem\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[26,[\\\"firstItemIndex\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[1,[26,[\\\"firstItemIndex\\\"]],false],[1,[26,[\\\"dash\\\"]],false],[1,[26,[\\\"lastItemIndex\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text-muted\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.roles.fixtable.of\\\"],null],false],[14],[0,\\\"\\\\n\\\\n    \\\"],[1,[26,[\\\"totalRows\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/item-range/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    iconClass: Ember.computed('columnDef.iconClass', function () {\n        return this.get('columnDef.iconClass') || 'fa fa-minus';\n    }),\n    class: Ember.computed('columnDef.class', function () {\n        return this.get('columnDef.class') ? this.get('columnDef.class') : 'btn btn-danger btn-xs';\n    }),\n    disabledMessage: Ember.computed('columnDef.disabledMessage', 'dataRow.disabledMessage', function () {\n        return this.get('dataRow.disabledMessage') || this.get('columnDef.disabledMessage');\n    }),\n    actions: {\n        remove(id) {\n            if (!this.get('dataRow.isDeleteDisabled')) {\n                this.bubbleAction('remove', id);\n            }\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"wLQez7ni\",\"block\":\"{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"dataRow\\\",\\\"hideButton\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"dataRow\\\",\\\"isDeleteDisabled\\\"]],\\\"disabled\\\"],null],\\\" \\\",[26,[\\\"class\\\"]]]]],[15,\\\"data-t\\\",\\\"minus-button\\\"],[16,\\\"title\\\",[33,[\\\"if\\\"],[[28,[\\\"dataRow\\\",\\\"isDeleteDisabled\\\"]],[28,[\\\"disabledMessage\\\"]]],null],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"remove\\\",[28,[\\\"dataRow\\\",\\\"id\\\"]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[26,[\\\"iconClass\\\"]],null],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\" \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"dataRow\\\",\\\"isDeleteDisabled\\\"]],[28,[\\\"disabledMessage\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\",\\\"text\\\"],[\\\"left\\\",[28,[\\\"disabledMessage\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/list-remove/template.hbs\"}});","import { debounce } from '@ember/runloop';\nimport { observer, computed } from '@ember/object';\nimport Component from '@ember/component';\nimport layout from './template';\n\nexport default Component.extend({\n    layout,\n    classNames: ['search-field'],\n    classNameBindings: ['positionSubclass'],\n\n    debounce: 250,\n    query: '',\n\n    queryChanged: observer('query', function () {\n        debounce(this, this.triggerSearch, this.get('debounce'));\n    }),\n\n    positionSubclass: computed('position', function () {\n        let position = this.get('position');\n        return position ? `search-field-${this.get('position')}` : '';\n    }),\n\n    triggerSearch: function () {\n        this.sendAction('onChange', this.get('query'));\n    },\n\n    actions: {\n        reset() {\n            this.set('query', '');\n            this.triggerSearch();\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"yqPpq/Zk\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-field-icon\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"query\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-lg pc-times-circle search-field-reset\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"reset\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-lg pc-icon-magnifying-glass\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"fill-between-floats\\\"],[15,\\\"data-t\\\",\\\"searchfieldparent\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"hidden\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-roles-search\\\"]]],[13],[1,[33,[\\\"t\\\"],[\\\"groups.roles.roleSearch\\\"],null],false],[14],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"type\\\",\\\"value\\\",\\\"placeholder\\\",\\\"data-t\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-roles-search\\\"],null],\\\"text\\\",[28,[\\\"query\\\"]],[28,[\\\"placeholder\\\"]],\\\"input-search\\\"]]],false],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/search-field/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"SmqpL55m\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"id\\\",\\\"roles-edit\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isEditingRoles\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"new-roles-bar row\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-success btn-purecloud\\\"],[16,\\\"disabled\\\",[33,[\\\"not\\\"],[[28,[\\\"unsavedGrants\\\",\\\"hasUnsavedGrants\\\"]]],null],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"save\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"enable-roles-toggle\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle disabled\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.enableRoles\\\"],null],false],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"disabled\\\",\\\"check\\\",\\\"toggle\\\"],[true,[28,[\\\"model\\\",\\\"allowPermissionGroup\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleRolesEnabled\\\"],null]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"fixtable-toolbar\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"group-profile/roles-edit/fixtable/search-field\\\"],null,[[\\\"onChange\\\"],[[33,[\\\"action\\\"],[[28,[null]],\\\"searchAllRoles\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"list-container\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"fixtable-grid\\\"],null,[[\\\"columns\\\",\\\"content\\\",\\\"clientPaging\\\",\\\"isLoading\\\",\\\"classNames\\\",\\\"fixtableClass\\\",\\\"tableClass\\\",\\\"updateDivisions\\\",\\\"assignRole\\\",\\\"footerComponent\\\"],[[28,[\\\"groupRolesEditColumns\\\"]],[28,[\\\"allRolesFiltered\\\"]],true,[28,[\\\"isLoadingAllRoles\\\"]],\\\"fixtable-grid\\\",\\\"fixtable-purecloud\\\",\\\"fixtable-table\\\",\\\"updateUnsavedGrants\\\",\\\"toggleRoleAssignment\\\",[33,[\\\"component\\\"],[\\\"group-profile/roles-edit/fixtable/custom-footer\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"new-roles-bar row\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn new-btn\\\"],[16,\\\"disabled\\\",[33,[\\\"not\\\"],[[28,[\\\"model\\\",\\\"allowPermissionGroup\\\"]]],null],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editRoles\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-edit\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.assignRoles\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"enable-roles-toggle\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.enableRoles\\\"],null],false],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"toggle\\\"],[[28,[\\\"model\\\",\\\"allowPermissionGroup\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleRolesEnabled\\\"],null]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"fixtable-toolbar\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"group-profile/roles-edit/fixtable/search-field\\\"],null,[[\\\"onChange\\\"],[[33,[\\\"action\\\"],[[28,[null]],\\\"searchAssignedRoles\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"list-container\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"fixtable-grid\\\"],null,[[\\\"columns\\\",\\\"content\\\",\\\"rowSelection\\\",\\\"clientPaging\\\",\\\"isLoading\\\",\\\"classNames\\\",\\\"fixtableClass\\\",\\\"tableClass\\\",\\\"remove\\\",\\\"bulkAction\\\",\\\"emptyStateComponentValues\\\",\\\"footerComponent\\\"],[[28,[\\\"groupRolesViewColumns\\\"]],[28,[\\\"groupAssignedRolesFiltered\\\"]],true,true,[28,[\\\"isLoadingGroupRoles\\\"]],\\\"fixtable-grid\\\",\\\"fixtable-purecloud\\\",\\\"fixtable-table\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"openConfirmModelSingleRole\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"openConfirmModelMultipleRole\\\"],null],[33,[\\\"hash\\\"],null,[[\\\"nullMessage\\\"],[[33,[\\\"t\\\"],[\\\"groups.roles.noRolesAreAssigned\\\"],null]]]],[33,[\\\"component\\\"],[\\\"group-profile/roles-edit/fixtable/custom-footer\\\"],[[\\\"bulkActions\\\",\\\"bulkActionTitle\\\"],[\\\"group-profile/roles-edit/fixtable/bulk-actions/selected-elements\\\",[33,[\\\"t\\\"],[\\\"groups.roles.deleteAllSelected\\\"],null]]]]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayRoleRemoveModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"headerText\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"rolesToDelete\\\",\\\"enforceModality\\\"],[true,[33,[\\\"t\\\"],[\\\"groups.roles.confirmRemove\\\"],null],true,\\\"warning-modal\\\",\\\"deleteRoles\\\",\\\"closeWarningModal\\\",[28,[\\\"rolesToDelete\\\"]],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-info\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"rolesToDelete\\\",\\\"length\\\"]],1],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.removeRoleConfirm\\\"],null],false],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.removeRolesConfirm\\\"],null],false],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[6,[\\\"each\\\"],[[28,[\\\"rolesToDelete\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"b\\\",[]],[13],[1,[28,[\\\"role\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"role\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayRulesRolesWarningModel\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"enforceModality\\\"],[false,true,\\\"warning-modal\\\",\\\"confirmWarningModal\\\",\\\"closeRulesRolesWarningModal\\\",true]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"header\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.header\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-info\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.rulesWarning\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-body\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.newGroupSuggestion\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.confirmWarning\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayHasRolesWarningModel\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"enforceModality\\\"],[false,true,\\\"warning-modal\\\",\\\"confirmHasRolesWarningModal\\\",\\\"closeHasRolesWarningModal\\\",true]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"header\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.header\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-info\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.thereAreRoles\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.confirmRolesRemoval\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"a5VWgTut\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"container-fluid\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"left-rail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditLeftRailInfo\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"edit dropdown\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"id\\\",\\\"group-profile-edit\\\"],[15,\\\"closeOnClickOutside\\\",\\\"true\\\"],[15,\\\"class\\\",\\\"btn btn-link dropdown-link\\\"],[15,\\\"data-toggle\\\",\\\"dropdown\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.edit\\\"],null],false],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-caret-down\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]]],null,{\\\"statements\\\":[[6,[\\\"click-outside\\\"],null,[[\\\"action\\\"],[[33,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]],null]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[9,\\\"gux-popover\\\",{\\\"attrs\\\":[[15,\\\"id\\\",\\\"group-profile-edit-popover\\\"],[15,\\\"position\\\",\\\"bottom-end\\\"],[15,\\\"for\\\",\\\"group-profile-edit\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                            \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"popover-menu\\\"],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"edit-general\\\"],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"edit-general\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editGeneralInfo\\\"]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"person.edit.generalInfo\\\"],null],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\\n                                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"edit-picture\\\"],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"edit-profile-picture-link group\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editProfilePicture\\\"]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"person.edit.profilePicture\\\"],null],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\\n                                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"edit-rules\\\"],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"edit-privacy-rules\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editPrivacyRules\\\"]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.edit.privacyRules\\\"],null],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\\n                                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"delete-group\\\"],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"delete-group text-danger\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"deleteGroup\\\"]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.admin.delete\\\"],null],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"profile-picture\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-8 col-xs-offset-2\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\"],[[28,[\\\"model\\\"]],400]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"general\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row name\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"name\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"name\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row group-type\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isEditing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[[26,[\\\"groupTypeIcon\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-fields/select-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"groupType\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"groupType\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"hr\\\",[]],[13],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"description-contact-info\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row description\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"description\\\",\\\"value\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"description\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"description\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"empty\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.noGroupDescription\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-contact-group-v2\\\"],null,[[\\\"canViewVideo\\\",\\\"canViewChat\\\",\\\"entity\\\",\\\"showFavorite\\\",\\\"viewLightGallery\\\"],[[28,[\\\"canViewVideo\\\"]],[28,[\\\"canViewChat\\\"]],[28,[\\\"model\\\"]],[28,[\\\"favorites\\\",\\\"enabled\\\"]],\\\"viewLightGallery\\\"]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"hr\\\",[]],[13],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"meta\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row visibility\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"label\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"group_privacy_groupVisibility_labelKey_groupVisibility\\\"],null],false],[14],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-fields/select-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"groupVisibility\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"privacy\\\",\\\"groupVisibility\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasLinks\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"hr\\\",[]],[13],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"link-header\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"tooltip.groupLink\\\"],null],true],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"links\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"ul\\\",[]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"model\\\",\\\"general\\\",\\\"links\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"li\\\",[]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"entity-fields/weblink-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"link\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"links\\\"]]]]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"link\\\"]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"hr\\\",[]],[13],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-phone-header\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.phone\\\"],null],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-phone\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"session\\\",\\\"features\\\",\\\"AGORA-268_connections-ui-in-admin-ui\\\"]],[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"number\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phoneService\\\",\\\"enabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"number\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"number\\\"]],\\\"tel\\\",[28,[\\\"dialableNumber\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]],\\\"tel\\\",[28,[\\\"dialableNumber\\\"]]]]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"email\\\",\\\"value\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-email-header\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.email\\\"],null],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-email\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"session\\\",\\\"features\\\",\\\"AGORA-268_connections-ui-in-admin-ui\\\"]],[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[28,[\\\"email\\\",\\\"value\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"a\\\",[]],[16,\\\"href\\\",[34,[\\\"mailto:\\\",[28,[\\\"email\\\",\\\"value\\\"]]]]],[13],[1,[28,[\\\"email\\\",\\\"value\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"right-rail tabsUI hunt-groups\\\"],[13],[0,\\\"\\\\n\\\"],[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"button-tabs\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"flex-left\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[\\\"btn-tab t-membership-tab \\\",[33,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"activeTab\\\"]],\\\"members\\\"],null],\\\"active\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectTab\\\",\\\"members\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"membershipHeader\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditInformation\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"canEditRoles\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[\\\"btn-tab t-roles-tab \\\",[33,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"activeTab\\\"]],\\\"roles\\\"],null],\\\"active\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectTab\\\",\\\"roles\\\"]],[13],[0,\\\"\\\\n                            \\\"],[1,[26,[\\\"groupRolesHeader\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"activeTab\\\"]],\\\"members\\\"],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"callsEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-header\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-name\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"name\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"name\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditInformation\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"header-right\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link edit-button\\\"],[16,\\\"disabled\\\",[26,[\\\"isEditing\\\"]],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleEditing\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.edit\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-label\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.enableCalls\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"disabled\\\",\\\"check\\\",\\\"toggle\\\"],[[28,[\\\"disableToggleCalls\\\"]],[28,[\\\"callsEnabled\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleCallsEnabled\\\"],null]]]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"group-profile/group-contact-panel\\\"],null,[[\\\"group\\\",\\\"editing\\\",\\\"canEditGroupTelephonySettings\\\",\\\"changeEditing\\\",\\\"toggleEditing\\\"],[[28,[\\\"model\\\"]],[28,[\\\"isEditing\\\"]],[28,[\\\"canEditGroupTelephonySettings\\\"]],\\\"changeEditingMode\\\",\\\"toggleEditing\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row content\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12 field-section tabsUI\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"group-profile/membership-listing\\\"],null,[[\\\"group\\\",\\\"callsEnabled\\\",\\\"owners\\\",\\\"individuals\\\",\\\"toggleCallsEnabled\\\",\\\"changeEditing\\\"],[[28,[\\\"model\\\"]],[28,[\\\"callsEnabled\\\"]],[28,[\\\"model\\\",\\\"owners\\\",\\\"owners\\\"]],[28,[\\\"model\\\",\\\"individuals\\\",\\\"individuals\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleCallsEnabled\\\"],null],\\\"changeEditingMode\\\"]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"activeTab\\\"]],\\\"roles\\\"],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"group-profile/roles-edit\\\"],null,[[\\\"model\\\",\\\"class\\\"],[[28,[\\\"model\\\"]],\\\"roles-edit-container\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"activeTab\\\"]],\\\"dynamicRules\\\"],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"group-profile/dynamicRules\\\"],null,[[\\\"group\\\",\\\"class\\\",\\\"selectTab\\\"],[[28,[\\\"model\\\"]],\\\"dynamic-rules\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectTab\\\"],null]]]],false],[0,\\\"\\\\n        \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[1,[33,[\\\"entity-picture-content\\\"],null,[[\\\"entity\\\",\\\"showing\\\",\\\"open\\\",\\\"close\\\",\\\"targetAttachment\\\"],[[28,[\\\"model\\\"]],[28,[\\\"editingPictures\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"editProfilePicture\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelEditProfilePicture\\\"],null],\\\"none\\\"]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showContactInfo\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"enforceModality\\\",\\\"cancel\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\"],[true,\\\"cancelEditContactInfo\\\",[33,[\\\"t\\\"],[\\\"groups.modal.contact\\\"],null],[33,[\\\"t\\\"],[\\\"common.save\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"group-contact-modal\\\"],null,[[\\\"entity\\\",\\\"saveContactInfo\\\",\\\"disableModal\\\",\\\"close\\\"],[[28,[\\\"model\\\"]],[28,[\\\"confirmAction\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"disableAction\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelEditContactInfo\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"confirmAction\\\",\\\"_\\\",\\\"disableAction\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[1,[33,[\\\"light-gallery-modal\\\"],null,[[\\\"entity\\\",\\\"showing\\\",\\\"open\\\",\\\"close\\\"],[[28,[\\\"model\\\"]],[28,[\\\"viewingGallery\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"viewLightGallery\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelViewLightGallery\\\"],null]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isShowingDeleteModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"headerText\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\"],[true,[33,[\\\"t\\\"],[\\\"groups.admin.deleteHeader\\\"],[[\\\"name\\\"],[[33,[\\\"escape\\\"],[[28,[\\\"model\\\",\\\"name\\\"]]],null]]]],true,\\\"delete-group-confirmation-modal\\\",\\\"confirmDelete\\\",\\\"cancelDelete\\\"]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.admin.deleteConfirmation\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isShowingGeneralModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"headerText\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"enforceModality\\\"],[true,[28,[\\\"generalFieldConfigSection\\\",\\\"sectionName\\\"]],true,\\\"field-section-modal\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"confirmGeneral\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelGeneral\\\"],null],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-field-section\\\"],null,[[\\\"entity\\\",\\\"section\\\",\\\"modal\\\",\\\"editing\\\",\\\"editingProfile\\\",\\\"canEditProfile\\\",\\\"canEditSection\\\",\\\"excludedFields\\\",\\\"disableModal\\\"],[[28,[\\\"model\\\"]],[28,[\\\"generalFieldConfigSection\\\"]],true,true,true,true,true,[28,[\\\"generalExcludedEditingFields\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"disableAction\\\"]]],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"_confirm\\\",\\\"_cancel\\\",\\\"disableAction\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isShowingPrivacyModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"headerText\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"enforceModality\\\"],[true,[28,[\\\"privacyFieldConfigSection\\\",\\\"sectionName\\\"]],true,\\\"field-section-modal\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"confirmGeneral\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelGeneral\\\"],null],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-field-section\\\"],null,[[\\\"entity\\\",\\\"section\\\",\\\"modal\\\",\\\"editing\\\",\\\"editingProfile\\\",\\\"canEditSection\\\",\\\"canEditProfile\\\"],[[28,[\\\"model\\\"]],[28,[\\\"privacyFieldConfigSection\\\"]],true,true,true,true,true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayWarningModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"enforceModality\\\"],[false,true,\\\"warning-modal\\\",\\\"confirmWarningModal\\\",\\\"closeWarningModal\\\",true]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"header\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.warningModal.header\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-info\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.warningModal.rulesWarning\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-body\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.warningModal.newGroupSuggestion\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.warningModal.confirmWarning\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['grouped-facet-term'],\n    classNameBindings: ['label'],\n\n    intl: Ember.inject.service(),\n\n    group: null,\n\n    showDropdown: false,\n\n    actions: {\n        removeSelectedTerm: function () {\n            var terms = this.get('group.terms');\n            var term = terms.objectAt(0);\n\n            this.send('removeSingleTerm', term);\n        },\n\n        removeSingleTerm: function (term) {\n            var facet = this.get('group.facet');\n            this.bubbleAction({\n                action: 'removeSelectedTerm',\n                actionContext: [term, facet]\n            });\n        },\n\n        toggleDropdown: function () {\n            if (!this.get('isSingleTerm')) {\n                this.toggleProperty('showDropdown');\n            }\n        }\n    },\n\n    isSingleTerm: Ember.computed('group.terms.[]', function () {\n        return this.get('group.terms.length') === 1;\n    }),\n\n    label: Ember.computed('group.facet.facetName', function () {\n        var facetName = this.get('group.facet.facetName');\n        if (facetName) {\n            return facetName.toLowerCase().replace(/\\./gi, '_');\n        }\n    }),\n\n    value: Ember.computed('isSingleTerm', function () {\n        var terms = this.get('group.terms');\n        if (this.get('isSingleTerm')) {\n            var term = terms.objectAt(0);\n            return term.term;\n        } else {\n            return this.get('intl').lookup('search.multipleFacetsSelected', { count: terms.length }).toString();\n        }\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"l2Nsz1vc\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"grouped-facet-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isSingleTerm\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"facet\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],false],[0,\\\":\\\\n            \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"css-classify\\\"],[[28,[\\\"value\\\"]]],null]]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"value\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"remove clickable\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"search.deselectTag\\\"],[[\\\"tag\\\"],[[33,[\\\"concat\\\"],[[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],\\\": \\\",[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"value\\\"]]]]]],null]]]],null],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"search.deselectTag\\\"],[[\\\"tag\\\"],[[33,[\\\"concat\\\"],[[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],\\\": \\\",[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"value\\\"]]]]]],null]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeSelectedTerm\\\"]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"terms-dropdown-button\\\"],[16,\\\"aria-expanded\\\",[34,[[26,[\\\"showDropdown\\\"]]]]],[16,\\\"aria-controls\\\",[34,[[26,[\\\"elementId\\\"]],\\\"section\\\"]]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleDropdown\\\"]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[\\\"facet \\\",[33,[\\\"unless\\\"],[[28,[\\\"isSingleTerm\\\"]],\\\"clickable\\\"],null]]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],false],[0,\\\":\\\\n                \\\"],[11,\\\"span\\\",[]],[13],[1,[26,[\\\"value\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"toggle-dropdown clickable\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[\\\"pc \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"pc-caret-up\\\",\\\"pc-caret-down\\\"],null]]]],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"ul\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"section\\\"]]],[15,\\\"class\\\",\\\"terms-dropdown list-unstyled\\\"],[15,\\\"role\\\",\\\"region\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"group\\\",\\\"terms\\\"]]],[[\\\"key\\\"],[\\\"term\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"css-classify\\\"],[[28,[\\\"t\\\",\\\"term\\\"]]],null]]]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"t\\\",\\\"term\\\"]]]]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\\n                        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"remove clickable\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"search.deselectTag\\\"],[[\\\"tag\\\"],[[33,[\\\"concat\\\"],[[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],\\\": \\\",[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"t\\\",\\\"term\\\"]]]]]],null]]]],null],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"search.deselectTag\\\"],[[\\\"tag\\\"],[[33,[\\\"concat\\\"],[[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],\\\": \\\",[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"t\\\",\\\"term\\\"]]]]]],null]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeSingleTerm\\\",[28,[\\\"t\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete\\\"],[13],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"t\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/grouped-facet-term/template.hbs\"}});","define(\"connections-ui/components/headset-status/component\", [\"exports\", \"ember-softphone-integration/components/headset-status/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/headset-vendor-picker/component\", [\"exports\", \"ember-softphone-integration/components/headset-vendor-picker/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/horizontal-collection\", [\"exports\", \"smoke-and-mirrors/components/horizontal-collection\"], function (_exports, _horizontalCollection) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _horizontalCollection.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    session: Ember.inject.service(),\n\n    bootstrapIcons: Ember.computed.reads('session.isAuthenticated')\n});\n","export default Ember.HTMLBars.template({\"id\":\"dekSi0FY\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"bootstrapIcons\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-chevron-right invisible\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-email invisible\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading invisible\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/icon-bootstrap/template.hbs\"}});","define(\"connections-ui/components/in-viewport\", [\"exports\", \"smoke-and-mirrors/components/in-viewport\"], function (_exports, _inViewport) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _inViewport.default;\n    }\n  });\n});\n","import Component from '@ember/component';\nimport Ember from 'ember';\nimport LoggerMixin from '../../mixins/logger';\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['infinite-scroll'],\n    classNameBindings: ['hideScrollbars'],\n\n    /**\n     * @Input\n     * `true` if the component should be showing a loading state\n     */\n    loading: false,\n    /**\n     * `true` if the component should not invoke any infinite scroll\n     * interactions\n     */\n    disabled: false,\n    /**\n     * `true` if the scrollbar display should be visually hidden\n     */\n    hideScrollbars: false,\n\n    /**\n     * The amount of space in pixels that when the user scrolls within\n     * it will trigger the infinite scroll event for the parent to\n     * react to.\n     * !! If possible do not override this value with an inputted value.\n     * The functionality and UX should be consistent so if the threshold\n     * needs to increase it should increase everywhere.\n     */\n    scrollBottomThreshold: 100,\n\n    /**\n     * Lifecycle hook triggered when the element is rendered and inserted\n     * into the DOM\n     */\n    didInsertElement() {\n        const element: HTMLDivElement = this.get('element');\n        element.onscroll = () => {\n            this.onScroll();\n        };\n    },\n\n    /**\n     * Invoked when the infinite scroll component has detected scrolling\n     * behavior within its main element\n     */\n    onScroll() {\n        const element: HTMLDivElement = this.get('element');\n        const scrollBottom = element.scrollTop + element.clientHeight;\n        const scrollThreshold = scrollBottom + this.get('scrollBottomThreshold');\n        if (scrollThreshold >= element.scrollHeight) {\n            this.checkInfiniteScroll();\n        }\n    },\n\n    /**\n     * Checks if infinite scrolling can be invoked based on other factors and properties\n     */\n    checkInfiniteScroll() {\n        if (!this.get('loading') && !this.get('disabled')) {\n            this.infiniteScroll();\n        }\n    },\n\n    /**\n     * @Action\n     * Invoked when the scroll container has reached the scroll threshold to load more data\n     */\n    infiniteScroll() {\n        Ember.Logger.warn('Infinite scroll event closure action has not been set up.');\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"x6vvnuBv\",\"block\":\"{\\\"statements\\\":[[18,\\\"default\\\"],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"infinite-scroll-loader\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/infinite-scroll/template.hbs\"}});","import Ember from 'ember';\n\nconst { Component, computed, inject } = Ember;\n\nexport default Component.extend({\n    classNames: ['integration-badge'],\n    tagName: 'span',\n\n    intl: inject.service(),\n\n    // represents what integration we want to show\n    integration: null,\n    isSmall: false,\n    useLightIcon: false,\n\n    iconUri: computed('integration.icon', 'isSmall', 'useLightIcon', function () {\n        if (this.get('isSmall')) {\n            return this.get('useLightIcon')\n                ? this.get('integration.badgeIcons.light')\n                : this.get('integration.badgeIcons.dark');\n        }\n        return this.get('integration.icon');\n    }),\n\n    translation: computed.reads('integration.translation')\n});\n","export default Ember.HTMLBars.template({\"id\":\"isG4X8WY\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"integration\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"img\\\",[]],[16,\\\"class\\\",[34,[\\\"integration-icon \\\",[33,[\\\"if\\\"],[[28,[\\\"isSmall\\\"]],\\\"mini-icon\\\"],null]]]],[16,\\\"src\\\",[26,[\\\"iconUri\\\"]],null],[16,\\\"alt\\\",[26,[\\\"translation\\\"]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/integration-badge/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['integration-badges'],\n\n    phoneIntegrations: Ember.inject.service(),\n\n    entity: null,\n    size: null,\n    useLightIcon: false,\n    isSmall: Ember.computed.equal('size', 'small')\n});\n","export default Ember.HTMLBars.template({\"id\":\"lSIuV8JS\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entity\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"isSmall\\\"]],\\\"small-integration-badge\\\",\\\"\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[33,[\\\"phone-integrations\\\"],[[28,[\\\"entity\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"integration-badge\\\"],null,[[\\\"integration\\\",\\\"isSmall\\\",\\\"useLightIcon\\\"],[[28,[\\\"phoneIntegration\\\"]],[28,[\\\"isSmall\\\"]],[28,[\\\"useLightIcon\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"phoneIntegration\\\"]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/integration-badges/template.hbs\"}});","define(\"connections-ui/components/interaction-annotation/component\", [\"exports\", \"ember-purecloud-components/components/interaction-annotation/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nvar LightGalleryModal = Ember.Component.extend({\n    intl: Ember.inject.service(),\n\n    entity: null,\n    showing: false,\n    escaped: false,\n\n    gallery: Ember.computed('entity.images.informal', 'entity.images.gallery', function () {\n        if (this.get('entity.type') === 'group') {\n            return this.get('entity.images.gallery');\n        }\n        return this.get('entity.images.informal');\n    }),\n\n    actions: {\n        cancel() {\n            this.attrs.close();\n        }\n    },\n\n    initGallery: Ember.observer('showing', function () {\n        if (this.get('showing')) {\n            Ember.run.scheduleOnce('afterRender', this, function () {\n                const gallery = Ember.$('#lightGallery');\n                const images = gallery.children('li');\n\n                images.each((index /*, image */) => {\n                    const caption =\n                        '<div class=\"customHtml\"><h3>' + this.get('gallery')[index].labelKey + '</h3></div>';\n                    Ember.$(this).attr('data-sub-html', caption);\n                });\n\n                gallery.lightGallery({\n                    caption: true,\n                    loop: true,\n                    speed: 1,\n                    closable: false,\n                    escKey: true,\n                    lang: { allPhotos: this.get('intl').lookup('images.allPhotos') }\n                });\n            });\n        }\n    })\n});\n\nexport default LightGalleryModal;\n","export default Ember.HTMLBars.template({\"id\":\"BWEPhqLd\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showing\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"confirmText\\\",\\\"cancel\\\",\\\"headerText\\\",\\\"cancelText\\\"],[null,\\\"cancel\\\",[33,[\\\"t\\\"],[\\\"person.modals.viewPictures\\\"],null],[33,[\\\"t\\\"],[\\\"common.close\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"light-gallery-modal\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"ul\\\",[]],[15,\\\"id\\\",\\\"lightGallery\\\"],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"gallery\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[16,\\\"data-src\\\",[28,[\\\"image\\\",\\\"value\\\",\\\"x1024\\\"]],null],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[33,[\\\"t\\\"],[\\\"images.userSubmitted\\\"],null],null],[16,\\\"src\\\",[28,[\\\"image\\\",\\\"value\\\",\\\"x1024\\\"]],null],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"image\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/light-gallery-modal/template.hbs\"}});","define(\"connections-ui/components/link-to-external\", [\"exports\", \"ember-engines/components/link-to-external-component\"], function (_exports, _linkToExternalComponent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _linkToExternalComponent.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['loading-indicator']\n});\n","export default Ember.HTMLBars.template({\"id\":\"Tx//k/3u\",\"block\":\"{\\\"statements\\\":[[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/loading-indicator/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['location-display', 'location'],\n\n    entity: null,\n    location: null\n});\n","export default Ember.HTMLBars.template({\"id\":\"fewxU3+t\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\"],[[28,[\\\"location\\\"]],200]]],false],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location-name\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"h5\\\",[]],[13],[1,[28,[\\\"location\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/location-display/template.hbs\"}});","import Ember from 'ember';\n\nconst { Component, inject, computed } = Ember;\n\nexport default Component.extend({\n    classNames: ['login-oauth'],\n\n    session: inject.service(),\n\n    isAuthenticated: computed.reads('session.isAuthenticated'),\n\n    // attrs\n    offerMobileApp: false,\n    // Expected Actions: mobileOfferDenied, authenticate\n\n    onMobileOfferDecline() {\n        return this.attrs.mobileOfferDeclined().then(this.attrs.authenticate);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        if (!this.get('offerMobileApp')) {\n            this.attrs.authenticate();\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"dq/ukkxL\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"isAuthenticated\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[26,[\\\"auth-loading\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/login-oauth/template.hbs\"}});","define(\"connections-ui/components/logoff-link/component\", [\"exports\", \"ember-purecloud-components/components/logoff-link/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport Popper from 'popper.js';\n\nexport default Ember.Component.extend({\n    tagName: 'ul',\n    classNames: ['media-provider-video-dropdown'],\n    classNameBindings: ['displayDropdown:display-dropdown:hide'],\n\n    webrtc: Ember.inject.service(),\n    mediaProviders: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n\n    user: null,\n    room: null,\n    attachTo: null,\n    attachClickHandler: false,\n\n    _displayDropdown: true,\n\n    // Default implementation is to just run the provider action in Web-Directory\n    selectProvider(provider) {\n        const personId = this.get('user').get('id');\n        const providerId = provider.get('id');\n        this.get('embedded').launchVideoProviderWithPersonById(personId, providerId);\n        this.send('hide');\n    },\n\n    _popper: null,\n    _targetEl: null,\n\n    actions: {\n        hide() {\n            this.set('_displayDropdown', false);\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n\n        Ember.assert(!!this.get('user'), '`user` is required');\n        Ember.assert(!!this.get('attachTo'), '`attachTo` is required');\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        Ember.run.scheduleOnce('afterRender', this, this.setup);\n    },\n\n    willDestroyElement() {\n        if (this._popper) {\n            this._popper.destroy();\n            this._popper = null;\n        }\n\n        const targetEl = this._targetEl;\n        const ev = `click.${this.elementId}`;\n\n        Ember.$(window).off(ev);\n        if (targetEl) {\n            Ember.$(targetEl).off(ev);\n        }\n\n        this._super(...arguments);\n    },\n\n    setup() {\n        const targetEl = document.querySelector(this.get('attachTo'));\n        if (!targetEl) {\n            // Let's wait for a bit and check again...\n            // This might happen when we are waiting on asynchronous helpers\n            Ember.run.later(() => this.setup(), 250);\n\n            return;\n        }\n\n        if (this._targetEl) {\n            // We've already setup, dont try again\n            return;\n        }\n\n        this._targetEl = targetEl;\n\n        const popoverEl = this.element;\n        this._popper = new Popper(targetEl, popoverEl, {\n            placement: 'bottom',\n            arrowElement: this.$('.media-provider-arrow')[0],\n            modifiers: {\n                flip: {\n                    behavior: ['bottom', 'top', 'left']\n                },\n                preventOverflow: {\n                    padding: 1\n                }\n            }\n        });\n\n        // Attach a click handler to the target so that we can control the dropdown\n        // internally instead of externally\n        if (this.get('attachClickHandler')) {\n            this.set('_displayDropdown', false);\n\n            Ember.$(targetEl).on(\n                `click.${this.elementId}`,\n                Ember.run.bind(this, () => Ember.run.once(this, this.handleClick))\n            );\n\n            Ember.$(window).on(`click.${this.elementId}`, Ember.run.bind(this, this.handleOutsideClick));\n        }\n    },\n\n    handleClick() {\n        this.toggleProperty('_displayDropdown');\n\n        Ember.run.join(() =>\n            Ember.run.scheduleOnce('afterRender', this, () => this._popper && this._popper.scheduleUpdate())\n        );\n    },\n\n    handleOutsideClick(event) {\n        if (!this.get('displayDropdown')) {\n            return;\n        }\n\n        let target = event.target;\n        let isAttachTarget = Ember.$(this.attachTo).is(target);\n        let componentParents = Ember.$(target).parent(this.elementId);\n        let attachTargetParents = Ember.$(target).parents(this.attachTo);\n\n        if (!isAttachTarget && componentParents.length === 0 && attachTargetParents.length === 0) {\n            this.send('hide');\n        }\n    },\n\n    showingVideo: Ember.computed(\n        'webrtc.activeRoom.{showingVideo,isAcdRoom}',\n        'mediaProviders.usingVideoProvider',\n        function () {\n            const showingPurecloudVideo =\n                this.get('webrtc.activeRoom.showingVideo') && !this.get('webrtc.activeRoom.isAcdRoom');\n            const showingMediaProvider = this.get('mediaProviders.usingVideoProvider');\n            return showingPurecloudVideo || showingMediaProvider;\n        }\n    ),\n\n    providers: Ember.computed('user', 'room', 'webrtc.activeRoom.oneToOneTarget.presence', function () {\n        return this.get('mediaProviders').getVideoProviders(this.get('user'), this.get('room'));\n    }),\n\n    displayDropdown: Ember.computed(\n        '_displayDropdown',\n        'attachTo',\n        'user.profile.content.isOffline',\n        'showingVideo',\n        'room',\n        function () {\n            let targetEl = this._targetEl;\n            if (!targetEl || this.get('showingVideo')) {\n                return false;\n            }\n\n            let chatRoom = this.get('room');\n            if (chatRoom && chatRoom.isGroupRoom()) {\n                return this._displayDropdown;\n            }\n\n            return this._displayDropdown;\n        }\n    )\n});\n","export default Ember.HTMLBars.template({\"id\":\"VTG6SUhQ\",\"block\":\"{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"providers\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"provider\\\",\\\"haveAccess\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"provider\\\",\\\"disabled\\\"]]],null],\\\"disabled\\\"],null]]]],[16,\\\"aria-disabled\\\",[33,[\\\"await\\\"],[[28,[\\\"provider\\\",\\\"disabled\\\"]]],null],null],[5,[\\\"action\\\"],[[28,[null]],[28,[\\\"selectProvider\\\"]],[28,[\\\"provider\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"provider\\\",\\\"label\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"provider\\\",\\\"disabled\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\",\\\"text\\\"],[\\\"right\\\",[33,[\\\"t\\\"],[[33,[\\\"await\\\"],[[28,[\\\"provider\\\",\\\"disabledMessage\\\"]]],null]],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"provider\\\"]},null],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"media-provider-arrow\\\"],[13],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/media-providers/video-dropdown/template.hbs\"}});","import Ember from 'ember';\n\nvar MiniCardComponent = Ember.Component.extend({\n    tagName: 'a',\n    attributeBindings: ['href'],\n    classNameBindings: [':mini-card', 'isManager:manager-card:'],\n\n    session: Ember.inject.service(),\n    intl: Ember.inject.service(),\n\n    entity: null,\n    currentPerson: null,\n    managerCount: null,\n    geolocation: Ember.inject.service(),\n    isGeolocationEnabled: Ember.computed.readOnly('geolocation.isEnabled'),\n\n    isManager: Ember.computed('entity', 'currentPerson', function () {\n        return this.get('entity.id') === this.get('currentPerson.manager.id');\n    }),\n\n    managerCountText: Ember.computed('managerCount', function () {\n        const intl = this.get('intl');\n        const count = this.get('managerCount');\n        if (count === 1) {\n            return intl.lookup('person.relationships.peerCount.singular', {\n                count: count\n            });\n        } else {\n            return intl.lookup('person.relationships.peerCount.plural', {\n                count: count\n            });\n        }\n    }),\n\n    click: function () {\n        this.sendAction('action', this.get('entity'));\n    },\n    eLocation: Ember.computed('entity.geolocation.{city,region,country}', function () {\n        if (!this.entity) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.entity, 'geolocation.city'),\n            region: Ember.get(this.entity, 'geolocation.region'),\n            country: Ember.get(this.entity, 'geolocation.country')\n        };\n    }),\n    selfLocation: Ember.computed('session.person.geolocation.{city,region,country}', function () {\n        if (!this.session || !this.session.person) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.session.person, 'geolocation.city'),\n            region: Ember.get(this.session.person, 'geolocation.region'),\n            country: Ember.get(this.session.person, 'geolocation.country')\n        };\n    }),\n    entityLocationData: Ember.computed('eLocation', 'selfLocation', 'isGeolocationEnabled', function () {\n        return {\n            isGeolocationEnabled: this.get('isGeolocationEnabled'),\n            eLocation: this.get('eLocation'),\n            selfLocation: this.get('selfLocation')\n        };\n    })\n});\n\nexport default MiniCardComponent;\n","export default Ember.HTMLBars.template({\"id\":\"PTNBkxes\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4 profile-pic\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"isLinkable\\\",\\\"showPresence\\\"],[[28,[\\\"entity\\\"]],200,false,true]]],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-4 col-sm-8 col-md-8 col-lg-8 profile-general\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-row\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"h4\\\",[]],[13],[1,[28,[\\\"entity\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"managerCount\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"managers\\\"],[13],[0,\\\"(\\\"],[1,[26,[\\\"managerCountText\\\"]],false],[0,\\\")\\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[1,[28,[\\\"entity\\\",\\\"title\\\"]],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"status\\\"],[13],[1,[33,[\\\"entity-status\\\"],null,[[\\\"entityId\\\"],[[28,[\\\"entity\\\",\\\"id\\\"]]]]],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"entity-location\\\"],null,[[\\\"entity\\\",\\\"class\\\"],[[28,[\\\"entity\\\"]],\\\"entity-location\\\"]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/mini-card/template.hbs\"}});","import Ember from 'ember';\nimport layout from './template';\nimport * as focusTrap from 'focus-trap';\n\nexport default Ember.Component.extend({\n    layout: layout,\n    translucentOverlay: true,\n    containerClassNames: ['modal-component', 'modal', 'in', 'fade'].join(' '),\n    overlayClassNames: 'translucent',\n\n    intl: Ember.inject.service(),\n\n    headerText: '',\n    confirmText: '',\n    cancelText: '',\n\n    cancel: null,\n    confirm: null,\n\n    showHeader: true,\n    showFooter: true,\n    wrapContent: true,\n    enforceModality: false,\n\n    extraClassNames: '',\n\n    confirmDisabled: false,\n    noCancel: false,\n\n    trap: null,\n\n    actions: {\n        sendClose() {\n            this.send('sendCancel');\n        },\n\n        sendConfirm() {\n            if (typeof this.get('confirm') === 'function') {\n                let ret = this.get('confirm')();\n                if (ret && ret.then) {\n                    this.set('loading', true);\n                    ret.then(() => {\n                        this.set('loading', false);\n                    });\n                }\n            } else {\n                this.sendAction('confirm');\n            }\n        },\n\n        sendCancel() {\n            if (typeof this.attrs.cancel === 'function') {\n                this.attrs.cancel();\n            } else {\n                this.sendAction('cancel');\n            }\n        },\n\n        backdropDismiss() {\n            if (!this.get('enforceModality')) {\n                this.send('sendClose');\n            }\n        },\n\n        setAttribute(key, value) {\n            this.set(key, value);\n        }\n    },\n\n    setText: Ember.on('init', function () {\n        const intl = this.get('intl');\n        let { headerText, confirmText, cancelText } = this.getProperties('headerText', 'confirmText', 'cancelText');\n\n        if (headerText === '') {\n            headerText = intl.lookup('components.modal.header').toString();\n        }\n\n        if (confirmText === '') {\n            confirmText = intl.lookup('common.confirm').toString();\n        }\n\n        if (cancelText === '') {\n            cancelText = intl.lookup('common.cancel').toString();\n        }\n\n        this.setProperties({\n            headerText,\n            confirmText,\n            cancelText\n        });\n    }),\n\n    confirmAction: Ember.computed({\n        get() {\n            return this.get('confirm');\n        },\n\n        set(key, value) {\n            if (typeof value === 'function') {\n                this.set('confirm', value);\n            }\n            return value;\n        }\n    }),\n\n    cancelAction: Ember.computed({\n        get() {\n            return this.get('cancel');\n        },\n\n        set(key, value) {\n            if (typeof value === 'function') {\n                this.set('cancel', value);\n            }\n            return value;\n        }\n    }),\n\n    disableAction: Ember.computed({\n        get() {\n            return this.setConfirmDisabled.bind(this);\n        },\n\n        set() {\n            return this.setConfirmDisabled.bind(this);\n        }\n    }),\n\n    attachClassToBody: Ember.on('didInsertElement', function () {\n        Ember.$('body').addClass('modal-open');\n\n        const modalContainerElement = this.$('.modal-dialog .modal-content')[0];\n        this.trap = focusTrap.createFocusTrap(modalContainerElement, {\n            escapeDeactivates: false,\n            allowOutsideClick: true\n        });\n        if (this.trap) {\n            this.trap.activate();\n        }\n    }),\n\n    removeClassFromBody: Ember.on('willDestroyElement', function () {\n        Ember.$('body').removeClass('modal-open');\n        if (this.trap) {\n            this.trap.deactivate();\n        }\n    }),\n\n    setConfirmDisabled(value) {\n        return this.set('confirmDisabled', value);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"vbH6Zjnv\",\"block\":\"{\\\"statements\\\":[[6,[\\\"modal-dialog\\\"],null,[[\\\"overlayClassNames\\\",\\\"containerClassNames\\\",\\\"targetAttachment\\\",\\\"onClose\\\"],[[28,[\\\"overlayClassNames\\\"]],[28,[\\\"containerClassNames\\\"]],\\\"center\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"sendClose\\\"],null]]],{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"modal-dialog \\\",[26,[\\\"extraClassNames\\\"]]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-content\\\"],[15,\\\"role\\\",\\\"dialog\\\"],[16,\\\"aria-label\\\",[26,[\\\"headerText\\\"]],null],[15,\\\"aria-modal\\\",\\\"true\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"wrapContent\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showHeader\\\"]],[28,[\\\"headerText\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-header\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"h4\\\",[]],[15,\\\"class\\\",\\\"modal-title\\\"],[13],[1,[26,[\\\"headerText\\\"]],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"class\\\",[34,[\\\"close \\\",[33,[\\\"if\\\"],[[28,[\\\"noCancel\\\"]],\\\"hide\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.close\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"sendClose\\\"]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-body\\\"],[13],[0,\\\"\\\\n                    \\\"],[18,\\\"default\\\",[[28,[\\\"confirmAction\\\"]],[28,[\\\"cancelAction\\\"]],[28,[\\\"disableAction\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setAttribute\\\"],null],[28,[\\\"headerText\\\"]],[28,[\\\"confirmText\\\"]],[28,[\\\"cancelText\\\"]]]],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showFooter\\\"]],[33,[\\\"or\\\"],[[28,[\\\"confirmText\\\"]],[28,[\\\"cancelText\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-footer\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"confirmText\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-success btn-purecloud\\\"],[16,\\\"disabled\\\",[26,[\\\"confirmDisabled\\\"]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"sendConfirm\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[26,[\\\"confirmText\\\"]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"cancelText\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-link btn-cancel\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"sendCancel\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[26,[\\\"cancelText\\\"]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"id\\\",\\\"modal-button-close\\\"],[16,\\\"class\\\",[34,[\\\"close \\\",[33,[\\\"if\\\"],[[28,[\\\"noCancel\\\"]],\\\"hide\\\"],null]]]],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"sendClose\\\"],null],null],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.close\\\"],null]]]],[16,\\\"gux-title\\\",[34,[[33,[\\\"t\\\"],[\\\"common.close\\\"],null]]]],[15,\\\"accent\\\",\\\"ghost\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"close\\\"],[16,\\\"screenreader-text\\\",[34,[[33,[\\\"t\\\"],[\\\"common.close\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"]]}],[0,\\\"\\\\n                \\\"],[18,\\\"default\\\",[[28,[\\\"confirmAction\\\"]],[28,[\\\"cancelAction\\\"]],[28,[\\\"disableAction\\\"]],[28,[\\\"headerText\\\"]],[28,[\\\"confirmText\\\"]],[28,[\\\"cancelText\\\"]]]],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/modal-component/template.hbs\"}});","define(\"connections-ui/components/modal-dialog-overlay\", [\"exports\", \"ember-modal-dialog/components/modal-dialog-overlay\"], function (_exports, _modalDialogOverlay) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _modalDialogOverlay.default;\n    }\n  });\n});\n","define(\"connections-ui/components/modal-dialog\", [\"exports\", \"ember-modal-dialog/components/modal-dialog\"], function (_exports, _modalDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _modalDialog.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport ModalDialog from 'ember-modal-dialog/components/modal-dialog';\n\n// This is a wrapper for the modal-dialog in the ember-modal-dialog library\nexport default ModalDialog.extend({\n    didInsertElement() {\n        this._super(...arguments);\n        this._initEscListener();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        Ember.$('body').off('keyup.modal-dialog');\n    },\n\n    _initEscListener() {\n        const closeOnEscapeKey = ev => {\n            if (ev.key === 'Escape' || ev.key === 'Esc') {\n                this.sendAction('onClose');\n            }\n        };\n\n        Ember.$('body').on('keyup.modal-dialog', closeOnEscapeKey);\n    }\n});\n","define(\"connections-ui/components/navigation-sub-menu/component\", [\"exports\", \"ember-purecloud-components/components/navigation-sub-menu/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nimport CreateGroupMixin from '../../mixins/create-group';\n\nconst { inject, Component } = Ember;\n\nexport default Component.extend(CreateGroupMixin, {\n    classNames: ['new-group'],\n\n    intl: inject.service(),\n\n    attrs: {\n        confirm() {},\n        cancel() {},\n        setAttribute() {}\n    },\n\n    setHandlers: Ember.on('init', function () {\n        const setAttr = this.get('setAttribute');\n        setAttr('confirm', this.createGroup.bind(this));\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            this.$('.form-control:first').focus();\n        });\n    }),\n\n    checkNameLength: Ember.observer('groupName', function () {\n        let isTooLong = this.get('groupName.length') > 140;\n\n        if (isTooLong) {\n            this.attrs.disable(true);\n            this.$('input.form-control').tooltip({\n                placement: 'bottom',\n                title: this.get('intl').lookup('groups.admin.nameLengthTooltip'),\n                trigger: 'manual'\n            });\n            this.$('input.form-control').tooltip('show');\n        } else {\n            this.attrs.disable(false);\n            this.$('input.form-control').tooltip('destroy');\n        }\n\n        this.set('nameLengthExceeded', isTooLong);\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"naAgh/EU\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-group\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-4 control-label\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-groups-name\\\"]]],[13],[1,[33,[\\\"t\\\"],[\\\"groups.name\\\"],null],false],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-8\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"class\\\",\\\"value\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-groups-name\\\"],null],\\\"form-control\\\",[28,[\\\"groupName\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"clearfix\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-group\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-4 control-label\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[13],[1,[26,[\\\"groupTypeI18nLabel\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-8\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"x-select\\\"],null,[[\\\"value\\\",\\\"action\\\",\\\"default\\\",\\\"class\\\"],[[28,[\\\"groupType\\\"]],[33,[\\\"action\\\"],[[28,[null]],[33,[\\\"mut\\\"],[[28,[\\\"groupType\\\"]]],null]],null],[28,[\\\"groupTypeDefault\\\"]],\\\"form-control group-type\\\"]],{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"newGroupTypeChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\"],[[28,[\\\"groupTypeChoice\\\",\\\"value\\\"]]]],{\\\"statements\\\":[[1,[28,[\\\"groupTypeChoice\\\",\\\"label\\\"]],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"groupTypeChoice\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"clearfix\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-group\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-4\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[13],[1,[26,[\\\"groupVisibilityI18nLabel\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-8\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"x-select\\\"],null,[[\\\"value\\\",\\\"action\\\",\\\"default\\\",\\\"class\\\"],[[28,[\\\"groupVisibility\\\"]],[33,[\\\"action\\\"],[[28,[null]],[33,[\\\"mut\\\"],[[28,[\\\"groupVisibility\\\"]]],null]],null],[28,[\\\"groupVisibilityDefault\\\"]],\\\"form-control group-visibility\\\"]],{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"newGroupVisibilityChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\"],[[28,[\\\"groupVisibilityChoice\\\",\\\"value\\\"]]]],{\\\"statements\\\":[[1,[28,[\\\"groupVisibilityChoice\\\",\\\"label\\\"]],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"groupVisibilityChoice\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"clearfix\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/new-group/template.hbs\"}});","define(\"connections-ui/components/occludable-area\", [\"exports\", \"smoke-and-mirrors/components/occludable-area\"], function (_exports, _occludableArea) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _occludableArea.default;\n    }\n  });\n});\n","define(\"connections-ui/components/pc-style-icon-example\", [\"exports\", \"ember-purecloud-style/components/pc-style-icon-example\"], function (_exports, _pcStyleIconExample) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _pcStyleIconExample.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport WebrtcActionUtilsMixin from 'connections-ui/mixins/webrtc-action-utils';\nimport EntityImageDefaults from 'connections-ui/mixins/entity-image-defaults';\nimport DS from 'ember-data';\nimport Component from '@ember/component';\nimport { inject } from '@ember/service';\nimport { computed, observer } from '@ember/object';\nimport { getOwner } from '@ember/application';\n\nexport default Component.extend(WebrtcActionUtilsMixin, EntityImageDefaults, {\n    classNameBindings: ['isActive:current:sibling', 'isActive:col-sm-6:col-sm-3', ':card'],\n    attributeBindings: ['entity.id:data-entity-id'],\n\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    geolocation: Ember.inject.service(),\n    isGeolocationEnabled: Ember.computed.readOnly('geolocation.isEnabled'),\n    canViewChat: Ember.computed.bool('permissions.canViewBusinessChat'),\n    canViewVideo: Ember.computed.bool('permissions.canViewCollaborateVideo'),\n    entity: null,\n\n    phone: inject(),\n\n    needsServices: ['chat'],\n    excludedFields: ['chat'],\n\n    init() {\n        this._super(...arguments);\n        this.checkUnusedFields();\n    },\n\n    emailEnabled: computed.notEmpty('entity.email'),\n    showPhone: computed.bool('phoneServiceEnabled'),\n\n    phoneNumber: computed('phoneNumber', function () {\n        let entity = this.get('entity');\n        if (entity instanceof DS.PromiseObject) {\n            entity = entity.get('content');\n        }\n        if (!entity) {\n            return;\n        }\n\n        let phone = entity.getFieldValue('primaryContactInfo.voice', true);\n        if (phone && phone.value && phone.value.fieldPath) {\n            return entity.getFieldValue(phone.value.fieldPath);\n        }\n\n        if (phone.rel) {\n            return phone.rel.e164;\n        }\n    }),\n\n    isSelf: Ember.computed('entity.id', function () {\n        return this.get('entity.id') === this.get('session.person.id');\n    }),\n\n    entityContactGroupData: computed('entity.email', 'entity.phone.number', function () {\n        return {\n            isPerson: true,\n            isChatEnabled: true,\n            videoTooltipTitle: this.get('videoTooltipTitle'),\n            isWebrtcEnabled: this.get('isWebrtcEnabled'),\n            emailEnabled: this.get('emailEnabled'),\n            linkToProfile: 'person.detail',\n            phoneServiceEnabled: this.get('phoneServiceEnabled'),\n            phoneAvailable: this.get('phone.enabled'),\n            emailAddress: this.entity.get('email'),\n            telephoneNumber: this.entity.get('phone.number'),\n            showPhone: this.get('showPhone'),\n            isVideoButtonEnabled: this.get('isVideoButtonEnabled'),\n            canViewChat: this.get('canViewChat'),\n            canViewVideo: this.get('canViewVideo')\n        };\n    }),\n\n    checkUnusedFields: observer('entity', function () {\n        this.set('excludedFields', ['chat']);\n\n        if (this.get('entity.fieldConfig.sections') !== undefined) {\n            var fields = this.get('entity.fieldConfig.sections')[7].get('fieldList');\n\n            for (var i = 0; i < fields.length; i++) {\n                var value = this.get('entity.data.contactInfo.' + fields[i].key);\n\n                if (value === undefined || value[0].value === '') {\n                    this.get('excludedFields').push(fields[i].key);\n                }\n            }\n        }\n    }),\n\n    initialFieldsCheck: Ember.on('init', function () {\n        this.checkUnusedFields();\n    }),\n    eLocation: Ember.computed('entity.geolocation.{city,region,country}', function () {\n        if (!this.entity) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.entity, 'geolocation.city'),\n            region: Ember.get(this.entity, 'geolocation.region'),\n            country: Ember.get(this.entity, 'geolocation.country')\n        };\n    }),\n    selfLocation: Ember.computed('session.person.geolocation.{city,region,country}', function () {\n        if (!this.session || !this.session.person) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.session.person, 'geolocation.city'),\n            region: Ember.get(this.session.person, 'geolocation.region'),\n            country: Ember.get(this.session.person, 'geolocation.country')\n        };\n    }),\n    entityLocationData: Ember.computed('eLocation', 'isGeolocationEnabled', function () {\n        return {\n            isGeolocationEnabled: this.get('isGeolocationEnabled'),\n            eLocation: this.get('eLocation'),\n            selfLocation: this.get('selfLocation')\n        };\n    }),\n    actions: {\n        startChat: function (jid) {\n            this.bubbleAction({\n                action: 'openChatRoom',\n                actionContext: [jid]\n            });\n        },\n\n        moveToPerson: function () {\n            this.sendAction('setPerson', this.get('entity'));\n        }\n    },\n\n    async toggleFavorite() {\n        await this.get('favorites').toggleFavorite(this.entity);\n        this.setEntityContactGroupData();\n    },\n\n    navigateToProfileEvent() {\n        try {\n            const router = getOwner(this).lookup('router:main');\n            const profileId = this.entity.get('id');\n            if (router && profileId) router.transitionTo('person.detail', profileId);\n        } catch (err) {\n            Ember.Logger.error(err);\n        }\n    },\n\n    contactEvent(e) {\n        try {\n            const openChat = this.get('actionOpenChatRoom');\n            const openVideo = this.get('actionOpenVideoCall');\n\n            switch (e.detail) {\n                case 'call':\n                    this.callEntity(this.entity);\n                    break;\n                case 'chat':\n                    if (openChat) {\n                        openChat(this.entity.get('jid'));\n                    }\n                    break;\n                case 'video':\n                    if (this.get('isOneToOneOfflineOrBusy') || !this.get('isVideoButtonEnabled')) {\n                        return;\n                    }\n                    if (openVideo) {\n                        openVideo(this.entity.get('jid'), this.get('useMediaProviders'));\n                    }\n                    break;\n                case 'navigateToProfile':\n                    this.navigateToProfileEvent();\n                    break;\n                default:\n                    Ember.Logger.error('Error: contact event not found.');\n                    break;\n            }\n        } catch (err) {\n            Ember.Logger.error(err);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"pd72SN3p\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-image\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"moveToPerson\\\"]],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\"],[[28,[\\\"entity\\\"]],400,true,true]]],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-info\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"h2\\\",[]],[13],[0,\\\"\\\\n        \\\"],[1,[28,[\\\"entity\\\",\\\"name\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"h5\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[1,[28,[\\\"entity\\\",\\\"title\\\"]],false],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"department\\\"],[13],[1,[28,[\\\"entity\\\",\\\"department\\\"]],false],[14],[0,\\\"\\\\n\\\\n    \\\"],[1,[33,[\\\"entity-status\\\"],null,[[\\\"entityId\\\"],[[28,[\\\"entity\\\",\\\"id\\\"]]]]],false],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-location-container\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"entity-location\\\"],null,[[\\\"entity\\\",\\\"class\\\"],[[28,[\\\"entity\\\"]],\\\"entity-location align-center\\\"]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-contact\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isSelf\\\"]]],null,{\\\"statements\\\":[[6,[\\\"link-to\\\"],[\\\"person.detail\\\",[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-personicon\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"menu-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"tooltip.person.profile\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"entity-contact-group-v2\\\"],null,[[\\\"canViewChat\\\",\\\"entity\\\",\\\"linkProfile\\\",\\\"showImages\\\"],[[28,[\\\"canViewChat\\\"]],[28,[\\\"entity\\\"]],true,false]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/person-card/template.hbs\"}});","import Ember from 'ember';\n\nvar PersonGraphComponent = Ember.Component.extend({\n    classNames: ['person-graph'],\n    classNameBindings: ['mini:mini'],\n    attributeBindings: ['width', 'height'],\n\n    person: null,\n\n    graph: null,\n    paper: null,\n\n    mini: false,\n\n    trueColor: '#66f',\n    trueStrokeColor: 'white',\n\n    falseColor: '#ddd',\n    falseStrokeColor: 'white',\n\n    disabledColor: 'transparent',\n    disabledStrokeColor: 'transparent',\n\n    disabledSegments: null,\n\n    paths: null,\n    baseAttrForPath: {},\n\n    segmentChanged: Ember.observer(\n        'graph',\n        'graph.{ancestors,parent,self,siblings,children,descendants}',\n        function (sender, key) {\n            if (this.get('paths')) {\n                var segName = key.split('.').reverse()[0];\n                var segment = this.get('paths.' + segName);\n                if (segment) {\n                    segment.attr(this.attrForSegment(segName));\n                }\n            }\n        }\n    ),\n\n    disabledSegmentsChanged: Ember.observer('disabledSegments.[]', function () {\n        var segs = this.get('disabledSegments');\n        var graph = this.get('graph');\n        if (segs && graph) {\n            for (var i = 0; i < segs.length; i++) {\n                graph.set(segs[i], false);\n                this.segmentChanged(this, 'graph.' + segs[i]);\n            }\n        }\n    }),\n\n    setupGraph: Ember.on('didInsertElement', function () {\n        this.set('paths', {});\n\n        if (!this.get('graph')) {\n            this.set(\n                'graph',\n                Ember.Object.create({\n                    ancestors: false,\n                    parent: false,\n                    self: false,\n                    siblings: false,\n                    children: false,\n                    descendants: false\n                })\n            );\n        }\n\n        this.drawGraphics();\n    }),\n\n    destroyGraphics: Ember.on('willDestroyElement', function () {\n        if (this.get('paper')) {\n            this.get('paper').remove();\n            this.set('paper', null);\n        }\n    }),\n\n    click: function (event) {\n        if (this.get('mini')) {\n            return;\n        }\n\n        var target = Ember.$(event.target);\n\n        if (target.is('path')) {\n            var segment = target.data('segmentName');\n            this.triggerAction({\n                action: 'selectRelationship',\n                actionContext: segment\n            });\n        } else if (target.is('img') || target.is('.entity-image')) {\n            this.triggerAction({\n                action: 'selectRelationship',\n                actionContext: 'self'\n            });\n        }\n    },\n\n    isDisabled: function (segment) {\n        return this.get('disabledSegments') && this.get('disabledSegments').indexOf(segment) > -1;\n    },\n\n    drawGraphics: function () {\n        this.destroyGraphics();\n\n        var width = this.get('width') || 200;\n        var height = this.get('height') || 200;\n\n        var paper = new window.Raphael(this.get('element'), width, height);\n        this.set('paper', paper);\n\n        this.drawSegment('ancestors');\n        this.drawSegment('parent');\n        this.drawSegment('self');\n        this.drawSegment('siblings');\n        this.drawSegment('children');\n        this.drawSegment('descendants');\n\n        paper.renderfix();\n        paper.safari();\n    },\n\n    drawSegment: function (segment) {\n        var width = this.get('width') || 200;\n        var height = this.get('height') || 200;\n\n        var xform = ['s', width, ',', height, ',0,0'];\n\n        var path = this.get('paper').path(this.pathForSegment(segment));\n        var attr = $.extend(this.get('baseAttrForPath'), this.attrForSegment(segment), { 'stroke-width': 0.5 });\n\n        path.transform(xform.join('')).attr(attr);\n        Ember.$(path.node).data('segmentName', segment);\n\n        this.set('paths.' + segment, path);\n    },\n\n    attrForSegment: function (segment) {\n        var attr = {};\n        attr.cursor = 'pointer';\n\n        if (this.isDisabled(segment)) {\n            attr.fill = this.get('disabledColor');\n            attr.stroke = this.get('disabledStrokeColor');\n            attr.cursor = 'default';\n        } else if (this.get('graph.' + segment)) {\n            attr.fill = this.get('trueColor');\n            attr.stroke = this.get('trueStrokeColor');\n        } else {\n            attr.fill = this.get('falseColor');\n            attr.stroke = this.get('falseStrokeColor');\n        }\n\n        if (this.get('mini')) {\n            attr.cursor = 'default';\n        }\n\n        return attr;\n    },\n\n    pathForSegment: function (segment) {\n        if (this.get('mini')) {\n            return this.get(segment + 'SmallPath');\n        } else {\n            return this.get(segment + 'Path');\n        }\n    },\n\n    ancestorsPath: 'M0.439,0.173L0.499,0.114L0.563,0.178L0.563,0.125L0.625,0.125L0.499,0L0.374,0.125L0.439,0.125z',\n    parentPath:\n        'M0.439,0.299C0.458,0.294,0.478,0.29,0.499,0.29c0.022,0,0.043,0.004,0.064,0.011V0.258h0.062L0.499,0.133L0.374,0.258h0.065V0.299z',\n    selfPath:\n        'M0.499,0.313c-0.103,0-0.186,0.083-0.186,0.186s0.083,0.186,0.186,0.186s0.186-0.083,0.186-0.186S0.602,0.313,0.499,0.313z  M0.499,0.624c-0.069,0-0.125-0.056-0.125-0.125c0-0.069,0.056-0.125,0.125-0.125c0.069,0,0.125,0.056,0.125,0.125C0.624,0.568,0.568,0.624,0.499,0.624z',\n    siblingsPath:\n        'M0.298,0.559C0.293,0.54,0.289,0.52,0.289,0.5c0-0.022,0.004-0.044,0.011-0.064H0.173V0.374L0.049,0.5l0.125,0.125V0.559H0.298z M0.698,0.438c0.005,0.019,0.009,0.039,0.009,0.059c0,0.023-0.004,0.044-0.011,0.064h0.126v0.062l0.125-0.126L0.823,0.372v0.065H0.698z',\n    childrenPath:\n        'M0.56,0.699C0.541,0.705,0.521,0.708,0.5,0.708c-0.022,0-0.044-0.004-0.064-0.011v0.043H0.374L0.5,0.865l0.125-0.125H0.56V0.699z',\n    descendantsPath: 'M0.559,0.827L0.5,0.886L0.436,0.822L0.436,0.875L0.374,0.875L0.5,1L0.625,0.875L0.559,0.875z',\n\n    ancestorsSmallPath: 'M0.439,0.173L0.499,0.114L0.563,0.178L0.563,0.125L0.625,0.125L0.499,0L0.374,0.125L0.439,0.125z',\n    parentSmallPath:\n        'M0.439,0.343c0.019-0.007,0.039-0.011,0.06-0.011c0.022,0,0.044,0.004,0.064,0.013V0.291h0.062L0.499,0.167L0.374,0.291h0.065V0.343z',\n    selfSmallPath:\n        'M0.499,0.374c-0.069,0-0.125,0.056-0.125,0.125c0,0.069,0.056,0.125,0.125,0.125c0.069,0,0.125-0.057,0.125-0.125c0-0.038-0.017-0.072-0.043-0.095C0.559,0.385,0.53,0.374,0.499,0.374z',\n    siblingsSmallPath:\n        'M0.332,0.499c0-0.023,0.004-0.044,0.013-0.063H0.208V0.374L0.083,0.5l0.125,0.125V0.559h0.136C0.336,0.54,0.332,0.52,0.332,0.499z M0.916,0.498L0.791,0.374v0.065H0.654c0.007,0.019,0.012,0.039,0.012,0.06c0,0.022-0.004,0.043-0.013,0.063h0.138v0.062L0.916,0.498z',\n    childrenSmallPath:\n        'M0.56,0.654L0.56,0.654C0.55,0.658,0.541,0.661,0.53,0.663S0.51,0.666,0.499,0.666c-0.011,0-0.022-0.001-0.033-0.003c-0.01-0.002-0.021-0.005-0.03-0.009v0.054H0.374L0.5,0.833l0.125-0.125H0.56V0.654z',\n    descendantsSmallPath: 'M0.559,0.827L0.5,0.886L0.436,0.822L0.436,0.875L0.374,0.875L0.5,1L0.625,0.875L0.559,0.875z'\n});\nexport default PersonGraphComponent;\n","export default Ember.HTMLBars.template({\"id\":\"fmI57xbg\",\"block\":\"{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"mini\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\"],[[28,[\\\"person\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/person-graph/template.hbs\"}});","import Ember from 'ember';\n\nvar PersonIconComponent = Ember.Component.extend({\n    classNames: ['person-icon'],\n\n    favorites: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n\n    canViewChat: Ember.computed.reads('permissions.canViewBusinessChat'),\n    canViewVideo: Ember.computed.reads('permissions.canViewCollaborateVideo'),\n    person: null,\n\n    actions: {\n        noop: () => {}\n    }\n});\n\nexport default PersonIconComponent;\n","export default Ember.HTMLBars.template({\"id\":\"Vh8AiTYZ\",\"block\":\"{\\\"statements\\\":[[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"useInitialsPlaceholder\\\",\\\"enableMiniCard\\\",\\\"isLinkable\\\",\\\"showPresence\\\",\\\"showFavorite\\\",\\\"subscribeToPresence\\\",\\\"canViewChat\\\",\\\"canViewVideo\\\",\\\"componentUpdated\\\",\\\"onContact\\\"],[[28,[\\\"person\\\"]],48,true,true,true,true,[28,[\\\"favorites\\\",\\\"enabled\\\"]],true,[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]],[28,[\\\"componentUpdated\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"noop\\\"],null]]],{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[28,[\\\"person\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/person-icon/template.hbs\"}});","import Ember from 'ember';\r\nimport PikadayInputComponent from 'ember-pikaday/components/pikaday-input';\r\n\r\nexport default PikadayInputComponent;\r\n","define(\"connections-ui/components/pikaday-inputless\", [\"exports\", \"ember-pikaday/components/pikaday-inputless\"], function (_exports, _pikadayInputless) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _pikadayInputless.default;\n    }\n  });\n});\n","define(\"connections-ui/components/popover-on-component\", [\"exports\", \"ember-tooltips/components/popover-on-component\"], function (_exports, _popoverOnComponent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _popoverOnComponent.default;\n    }\n  });\n});\n","define(\"connections-ui/components/popover-on-element\", [\"exports\", \"ember-tooltips/components/popover-on-element\"], function (_exports, _popoverOnElement) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _popoverOnElement.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select-multiple\", [\"exports\", \"ember-power-select/components/power-select-multiple\"], function (_exports, _powerSelectMultiple) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _powerSelectMultiple.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select-multiple/trigger\", [\"exports\", \"ember-power-select/components/power-select-multiple/trigger\"], function (_exports, _trigger) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _trigger.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select\", [\"exports\", \"ember-power-select/components/power-select\"], function (_exports, _powerSelect) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _powerSelect.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/before-options\", [\"exports\", \"ember-power-select/components/power-select/before-options\"], function (_exports, _beforeOptions) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _beforeOptions.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/options\", [\"exports\", \"ember-power-select/components/power-select/options\"], function (_exports, _options) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _options.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/placeholder\", [\"exports\", \"ember-power-select/components/power-select/placeholder\"], function (_exports, _placeholder) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _placeholder.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/power-select-group\", [\"exports\", \"ember-power-select/components/power-select/power-select-group\"], function (_exports, _powerSelectGroup) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _powerSelectGroup.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/search-message\", [\"exports\", \"ember-power-select/components/power-select/search-message\"], function (_exports, _searchMessage) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _searchMessage.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/trigger\", [\"exports\", \"ember-power-select/components/power-select/trigger\"], function (_exports, _trigger) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _trigger.default;\n    }\n  });\n});\n","define(\"connections-ui/components/pre-render\", [\"exports\", \"smoke-and-mirrors/components/pre-render\"], function (_exports, _preRender) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _preRender.default;\n    }\n  });\n});\n","define(\"connections-ui/components/presence-label/component\", [\"exports\", \"ember-purecloud-components/components/presence-label/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/presence-label/person-activity/component\", [\"exports\", \"ember-purecloud-components/components/presence-label/person-activity/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/presence-selector-dropdown/component\", [\"exports\", \"ember-purecloud-components/components/presence-selector-dropdown/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/profile-dropdown-menu/component\", [\"exports\", \"ember-webrtc-components/components/profile-dropdown-menu/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/progress-underlay/component\", [\"exports\", \"ember-purecloud-components/components/progress-underlay/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/queue-toggle-switch/component\", [\"exports\", \"ember-purecloud-components/components/queue-toggle-switch/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { Component } = Ember;\n\nexport default Component.extend({\n    tagName: 'input',\n\n    attributeBindings: [\n        'type',\n        'disabled',\n        'isChecked:checked',\n        'name',\n        'ariaLabel:aria-label',\n        'ariaLabelledby:aria-labelledby'\n    ],\n\n    checked: false,\n    disabled: false,\n    onClick: () => {},\n\n    type: 'radio',\n    name: 'radio',\n    ariaLabel: null,\n    ariaLabelledby: null,\n    isChecked: false,\n\n    init() {\n        this._super(...arguments);\n        this.set('isChecked', this.get('checked'));\n    },\n\n    didUpdateAttrs() {\n        this.set('isChecked', this.get('checked'));\n    },\n\n    click(event) {\n        this.set('isChecked', true);\n\n        this.get('onClick')();\n\n        event.stopPropagation();\n    }\n});\n","import Ember from 'ember';\n\nconst { on, observer, Component } = Ember;\n\nexport default Component.extend({\n    classNameBindings: [':resizable-content', 'minimized:minimized:maximized'],\n\n    isMouseDown: false,\n    minimized: true,\n\n    minHeight: 0,\n    maxHeight: null,\n    actions: {\n        toggleSize() {\n            this.toggleProperty('minimized');\n        }\n    },\n\n    attachCurrentHeight: on('didInsertElement', function () {\n        this.$().css('min-height', this.get('minHeight'));\n    }),\n\n    minimizedChanged: observer('minimized', function () {\n        if (this.get('minimized')) {\n            this.$().css('min-height', this.get('minHeight'));\n        } else {\n            let maxHeight = this.get('maxHeight');\n            if (!maxHeight) {\n                maxHeight = 'calc(100% - 8px)';\n                this.set('maxHeight', maxHeight);\n            }\n            this.$().css('min-height', maxHeight);\n        }\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"O1G95mNX\",\"block\":\"{\\\"statements\\\":[[18,\\\"default\\\"],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"resize-handle btn btn-purecloud\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleSize\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"minimized\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"common.expand\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-down\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-down\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-down\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"common.collapse\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-up\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-up\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-up\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/resizable-content/template.hbs\"}});","define(\"connections-ui/components/resize-detector\", [\"exports\", \"ember-element-resize-detector/components/resize-detector\"], function (_exports, _resizeDetector) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _resizeDetector.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['search-facet-group', 'panel', 'panel-default'],\n    classNameBindings: ['panelId'],\n\n    facet: null,\n    parentId: null,\n\n    selectedTerms: [],\n\n    accordianParentId: Ember.computed('parentId', function () {\n        return '#' + this.get('parentId');\n    }),\n\n    panelId: Ember.computed('facet.facetName', function () {\n        return this.get('facet.facetName').replace(/\\./g, '_');\n    }),\n\n    href: Ember.computed('panelId', function () {\n        return '#' + this.get('panelId');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"4Rob5zmU\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"facet-label panel-heading\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"h4\\\",[]],[15,\\\"class\\\",\\\"panel-title\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"a\\\",[]],[15,\\\"role\\\",\\\"button\\\"],[15,\\\"data-toggle\\\",\\\"collapse\\\"],[16,\\\"data-parent\\\",[26,[\\\"parentId\\\"]],null],[16,\\\"href\\\",[26,[\\\"href\\\"]],null],[15,\\\"aria-expanded\\\",\\\"true\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"facet\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[\\\"pc \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"pc-caret-up\\\",\\\"pc-caret-down\\\"],null]]]],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"terms panel-collapse collapse in\\\"],[16,\\\"id\\\",[26,[\\\"panelId\\\"]],null],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"panel-body\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"facet\\\",\\\"terms\\\"]]],[[\\\"key\\\"],[\\\"term\\\"]],{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"term \\\",[33,[\\\"css-classify\\\"],[[28,[\\\"term\\\",\\\"term\\\"]]],null]]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"search-facet-term\\\"],null,[[\\\"facet\\\",\\\"term\\\",\\\"selectedTerms\\\"],[[28,[\\\"facet\\\"]],[28,[\\\"term\\\"]],[28,[\\\"selectedTerms\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"term\\\"]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/search-facet-group/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['search-facet-term'],\n\n    facet: null,\n    term: null,\n\n    selectedTerms: [],\n\n    isSelected: false,\n\n    actions: {\n        selectTerm: function () {\n            var term = this.get('term');\n            var facet = this.get('facet');\n            var action = 'selectTerm';\n\n            this.bubbleAction({\n                action: action,\n                actionContext: [term, facet]\n            });\n        }\n    },\n\n    selectedTermsChanged: Ember.observer('selectedTerms.[]', function () {\n        var terms = this.get('selectedTerms');\n        var term = terms.findBy('term', this.get('term'));\n        this.set('isSelected', term !== undefined);\n    })\n\n    //    isSelectedChanged: Ember.observer('isSelected', function () {\n    //        var selected = this.get('isSelected');\n    //        if (!selected) {\n    //            this.send('selectTerm');\n    //        }\n    //    })\n\n    //    isSelected: Ember.computed('selectedTerms.[]', function () {\n    //        var terms = this.get('selectedTerms');\n    //        var term = terms.findBy('term', this.get('term'));\n    //        return term !== undefined;\n    //    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"8+SnBQn/\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"term\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"search.selectTag\\\"],[[\\\"tag\\\",\\\"count\\\"],[[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"facet\\\"]],[28,[\\\"term\\\",\\\"term\\\"]]]]],[28,[\\\"term\\\",\\\"count\\\"]]]]],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"search.selectTag\\\"],[[\\\"tag\\\",\\\"count\\\"],[[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"facet\\\"]],[28,[\\\"term\\\",\\\"term\\\"]]]]],[28,[\\\"term\\\",\\\"count\\\"]]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"selectTerm\\\"]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"facet\\\"]],[28,[\\\"term\\\",\\\"term\\\"]]]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"count\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[28,[\\\"term\\\",\\\"count\\\"]],false],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/search-facet-term/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport { BASE_GROUP_FIELDS } from '../../models/group';\nimport { BASE_LOCATION_FIELDS } from '../../models/location';\nimport { BASE_PERSON, BASE_PERSON_EXPANDS, BASE_PERSON_FIELDS } from '../../models/person';\nimport { MULTI_ENTITY_FIELDS } from '../../utils/entity-fields';\n\nconst FAVORITE_LIMIT = 200;\nconst FAVORITE_LIMIT_FOR_SEARCH_MULTI_CRITERIA = 50;\n\nconst PAGE_SIZE = 15;\nconst FACET_COUNT = 10;\nconst PAGE_LIMIT = 4;\nconst keypathRegex = /[\\w+.]+:\"?.[^\"]+([\\w\\s]+)?\"?/gi;\n\nexport const SEARCH_FACET_KEYPATHS = {\n    profileSkills: 'skills.skills',\n    department: 'general.department',\n    title: 'general.title',\n    hobbies: 'bio.hobbies',\n    interests: 'bio.interests',\n    certifications: 'skills.certs',\n    languages: 'languages.name'\n};\n\nfunction reverseLookup(obj, value) {\n    for (const key in obj) {\n        if (obj[key] === value) {\n            return key;\n        }\n    }\n}\n\nconst FacetTerm = Ember.Object.extend({\n    facet: null,\n    term: null,\n    isKeyword: false,\n\n    searchField: Ember.computed('facet.facetName', function () {\n        return reverseLookup(SEARCH_FACET_KEYPATHS, this.get('facet.facetName'));\n    }),\n\n    toString: function () {\n        if (this.get('isKeyword')) {\n            return this.get('term.term');\n        }\n\n        const name = this.get('facet.facetName');\n        const term = this.get('term.term');\n        return `${name}:\"${term}\"`;\n    }\n});\n\nconst View = {\n    classNames: ['container-fluid', 'search-results-page'],\n\n    attachScrollListener: Ember.on('didInsertElement', function () {\n        this.$().on('scroll.' + this.get('elementId'), () => {\n            this.loadNextPage();\n        });\n    }),\n\n    removeListeners: Ember.on('willDestroyElement', function () {\n        this.$().off('.' + this.get('elementId'));\n    }),\n\n    createDebouncedLoadNextPage: Ember.on('init', function () {\n        this.loadNextPage = _.debounce(function () {\n            Ember.run(() => {\n                // model.isPending\n                if (this.get('model._state') === 0 || this.get('_state') !== 'inDOM') {\n                    return;\n                }\n\n                var scroll = this.$().scrollTop();\n                var height = this.$('.search-content').height() - this.$().height();\n\n                if (height - scroll <= 500) {\n                    this.send('loadMore');\n                }\n            });\n        }, 150);\n    }),\n\n    // Keep loading pages of results until the page is filled with items.\n    // The reason this was added was because when permissions are at play,\n    // search results can come back with limited data.\n    loadResultsToFillPage: Ember.observer('model._state', function () {\n        if (this.get('model._state') === 1) {\n            // model.isFulfilled\n            this.loadNextPage();\n        }\n    }),\n\n    scrollToTopOnPageZero: Ember.observer('page', function () {\n        if (this.get('_state') === 'inDOM' && this.get('page') === 0) {\n            Ember.run.scheduleOnce('afterRender', this, function () {\n                let $el = this.$();\n                if ($el && $el.scrollTop) {\n                    $el.scrollTop(0);\n                }\n            });\n        }\n    })\n};\n\nconst Controller = {\n    intl: Ember.inject.service(),\n    store: Ember.inject.service(),\n    search: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    presenceSubscription: Ember.inject.service('presence-subscription'),\n    integrationsPresence: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n    favorites: Ember.inject.service(),\n\n    _searchQuery: null,\n\n    entity: null,\n    query: null,\n    queryFacets: null,\n    saveHistory: true,\n\n    page: 0,\n\n    loading: {\n        searchResults: false,\n        facets: false\n    },\n\n    selectedTerms: [],\n    searchResults: [],\n    facets: null,\n    totalResults: 0,\n    lastSearchFavoritesCount: 0,\n\n    init(...args) {\n        this._super(...args);\n        this.get('favorites').on('favoriteChange', this, this.onFavoriteChanged);\n    },\n    willDestroyElement(...args) {\n        this._super(...args);\n        this.get('favorites').off('favoriteChange', this, this.onFavoriteChanged);\n    },\n\n    onFavoriteChanged() {\n        if (this.get('entity') === 'favorites') {\n            Ember.run.debounce(this, this.runSearchQuery, 300);\n        }\n    },\n\n    actions: {\n        changeSearchType: function (type) {\n            var currentActive = this.get('entity');\n\n            if (currentActive === type) {\n                return false;\n            }\n\n            this.set('entity', type || 'all');\n        },\n\n        selectTerm: function (term, facet) {\n            var terms = this.get('selectedTerms');\n            var termObj = terms.findBy('term', term);\n\n            if (terms && terms.length === 10) {\n                this.notifyTooManySearchFilters();\n                return;\n            }\n\n            if (termObj !== undefined) {\n                this.get('selectedTerms').removeObject(termObj);\n            } else {\n                termObj = FacetTerm.create({\n                    term: term,\n                    facet: facet\n                });\n\n                this.get('selectedTerms').addObject(termObj);\n            }\n\n            this.updateQueryOnTermsChange();\n        },\n\n        removeSelectedTerm: function (term /*, facet*/) {\n            var termObj = this.get('selectedTerms').findBy('term', term);\n\n            if (termObj) {\n                this.get('selectedTerms').removeObject(termObj);\n                this.updateQueryOnTermsChange();\n            }\n        },\n\n        loadMore: function () {\n            if (this.get('hasMoreResults')) {\n                this.runSearchQuery(true);\n            }\n        }\n    },\n\n    atPageLimit: Ember.computed.equal('page', PAGE_LIMIT),\n    remainingResults: Ember.computed('totalResults', 'page', function () {\n        return this.get('totalResults') - this.get('page') * PAGE_SIZE;\n    }),\n\n    hasMoreResults: Ember.computed('remainingResults', 'loading.searchResults', function () {\n        const moreResults = this.get('remainingResults') > 0;\n        const loading = this.get('loading.searchResults');\n        return !loading && moreResults;\n    }),\n\n    groupedSelectedTerms: Ember.computed('selectedTerms.[]', function () {\n        var terms = this.get('selectedTerms');\n        var data = [];\n\n        terms.forEach(function (termObj) {\n            var term = termObj.get('term');\n            var facet = termObj.get('facet');\n            var currentGroup = data.findBy('facet.facetName', facet.facetName);\n\n            if (!currentGroup) {\n                currentGroup = {\n                    facet: facet,\n                    terms: [term]\n                };\n\n                data.addObject(currentGroup);\n            } else {\n                currentGroup.terms.addObject(term);\n            }\n        });\n\n        return data;\n    }),\n\n    isEmpty: Ember.computed('model._state', 'loading.searchResults', 'loading.facets', function () {\n        if (this.get('model._state') === 1) {\n            // model.isFulfilled\n            return this.get('totalResults') === 0;\n        } else if (this.get('model._state') === 2) {\n            // model.isRejected\n            return true;\n        }\n        return false;\n    }),\n\n    isGroups: Ember.computed.equal('entity', 'groups'),\n    isLocations: Ember.computed.equal('entity', 'locations'),\n    isExternalContacts: Ember.computed.equal('entity', 'externalContacts'),\n\n    isExternalContactsEmpty: Ember.computed('isExternalContacts', 'totalResults', 'query', function () {\n        return this.get('isExternalContacts') && this.get('totalResults') === 0 && !this.get('query');\n    }),\n\n    isFavorite: Ember.computed.equal('entity', 'favorites'),\n    isFavoritesEmpty: Ember.computed('isFavorite', 'lastSearchFavoritesCount', function () {\n        return this.get('isFavorite') && this.get('lastSearchFavoritesCount') === 0;\n    }),\n\n    haveSelectedTerms: Ember.computed.notEmpty('selectedTerms'),\n\n    displayFacets: Ember.computed('facets', 'selectedTerms', function () {\n        const facets = this.get('facets');\n        if (!Array.isArray(facets)) {\n            return facets;\n        }\n\n        // remove facets which are selected terms\n        const selectedTerms = this.get('selectedTerms');\n        facets.forEach(facet => {\n            const { facetName, terms } = facet;\n            facet.terms = terms.filter(\n                ({ term }) =>\n                    !selectedTerms.find(\n                        selected => selected.get('facet.facetName') === facetName && selected.get('term.term') === term\n                    )\n            );\n        });\n\n        // remove empty facets\n        return facets.filter(({ terms }) => !_.isEmpty(terms));\n    }),\n\n    updateQueryParameters() {\n        let queryParameters = '';\n        const params = [];\n        if (this.get('entity')) {\n            params.push(`entity=${encodeURIComponent(this.get('entity'))}`);\n        }\n        if (this.get('query')) {\n            params.push(`query=${encodeURIComponent(this.get('query'))}`);\n        }\n        if (this.get('queryFacets')) {\n            params.push(`queryFacets=${encodeURIComponent(this.get('queryFacets'))}`);\n        }\n        if (params.length) {\n            queryParameters = `?${params.join('&')}`;\n        }\n        const newHash = `#/search-v2${queryParameters}`;\n        if (newHash !== window.top.location.hash) {\n            this.get('embedded').sendNavigationEvent({\n                hash: newHash\n            });\n        }\n    },\n\n    searchInitial: Ember.on('didInsertElement', function () {\n        if (!this.get('entity')) {\n            this.set('entity', 'all');\n        }\n        Ember.run.next(this, this.runSearchQuery);\n    }),\n\n    searchOnChange: Ember.observer('entity', 'query', 'queryFacets', function () {\n        if (window.top.location.hash.startsWith('#/search-v2')) {\n            this.updateQueryParameters();\n            Ember.run.next(this, this.runSearchQuery);\n        }\n    }),\n\n    updateQueryOnTermsChange() {\n        var terms = this.get('selectedTerms');\n\n        var termStrings = _.chain(terms)\n            .filter(term => !term.get('isKeyword'))\n            .map(term => term.toString())\n            .value();\n        var queryFacets = termStrings.join(' ');\n        this.set('queryFacets', queryFacets);\n\n        var keywordStrings = _.map(\n            _.filter(terms, function (term) {\n                return term.get('isKeyword');\n            }),\n            function (term) {\n                return term.toString();\n            }\n        );\n        var query = keywordStrings.join(' ');\n        this.set('query', query);\n    },\n\n    // <Search>\n    _baseSearch() {\n        return {\n            pageSize: PAGE_SIZE,\n            sortOrder: 'SCORE'\n        };\n    },\n\n    _baseAggregations() {\n        const terms = ['department', 'title', 'profileSkills', 'hobbies', 'interests', 'certifications'];\n        const aggregateTerm = name => ({\n            name,\n            field: name,\n            type: 'TERM',\n            size: FACET_COUNT,\n            order: ['COUNT_DESC', 'VALUE_ASC']\n        });\n        return terms.map(aggregateTerm);\n    },\n\n    _valueQuery(value) {\n        if (value) {\n            return [\n                {\n                    type: 'QUERY_STRING',\n                    value\n                }\n            ];\n        }\n        return [{ type: 'MATCH_ALL' }];\n    },\n\n    _facetQuery(facets) {\n        return facets\n            .filter(facet => !facet.get('isKeyword'))\n            .map(facet => {\n                const value = facet.get('term.term');\n                const fields = [facet.get('searchField')];\n                return {\n                    value,\n                    fields,\n                    type: 'EXACT'\n                };\n            });\n    },\n\n    _baseSearchForEntity(entityType) {\n        if (entityType === 'people') {\n            entityType = 'users';\n        }\n        if (entityType === 'externalContacts') {\n            entityType = 'external_contacts';\n        }\n\n        if (entityType === 'all') {\n            let types = ['users', 'groups', 'locations'];\n            return {\n                types,\n                aggregations: this._baseAggregations(),\n                returnFields: MULTI_ENTITY_FIELDS,\n                expand: BASE_PERSON_EXPANDS\n            };\n        }\n\n        if (entityType === 'users') {\n            return {\n                types: ['users'],\n                aggregations: this._baseAggregations(),\n                returnFields: BASE_PERSON_FIELDS,\n                expand: BASE_PERSON_EXPANDS\n            };\n        }\n\n        if (entityType === 'locations') {\n            return {\n                types: ['locations'],\n                returnFields: BASE_LOCATION_FIELDS\n            };\n        }\n\n        if (entityType === 'groups') {\n            return {\n                types: ['groups'],\n                returnFields: BASE_GROUP_FIELDS\n            };\n        }\n\n        if (entityType === 'external_contacts') {\n            return {\n                types: ['external_contacts'],\n                returnFields: BASE_PERSON_FIELDS\n            };\n        }\n\n        // Unsafe to assert because the `entity` query param could\n        // be manually modified and blow up the page without warning.\n        Ember.Logger.warn(`_baseSearchForEntity(): Invalid entityType \"${entityType}\"`);\n        return this._baseSearchForEntity('all');\n    },\n\n    _buildSearch(entityType, search, facets, favoriteIds) {\n        let query = [...this._facetQuery(facets)];\n        const valueQuery = this._valueQuery(search);\n        if (search || _.isEmpty(facets)) {\n            query = [].concat([], query, valueQuery);\n        }\n        if (favoriteIds) {\n            if (favoriteIds.length > FAVORITE_LIMIT_FOR_SEARCH_MULTI_CRITERIA) {\n                const chunks = _.chunk(favoriteIds, FAVORITE_LIMIT_FOR_SEARCH_MULTI_CRITERIA);\n                query.push({\n                    group: chunks.map(chunk => ({\n                        operator: 'OR',\n                        type: 'EXACT',\n                        fields: ['id'],\n                        values: chunk\n                    }))\n                });\n            } else {\n                query.push({\n                    type: 'EXACT',\n                    fields: ['id'],\n                    values: favoriteIds\n                });\n            }\n        }\n\n        let base = this._baseSearch();\n        if (!valueQuery[0].value) {\n            base = Object.assign({}, base, {\n                sortBy: 'name',\n                sortOrder: 'ASC'\n            });\n        }\n\n        return Object.assign(\n            {\n                query\n            },\n            base,\n            this._baseSearchForEntity(entityType)\n        );\n    },\n\n    _normalizeSearch(data) {\n        const { total, aggregations, results } = data;\n        const models = this.get('search').modelResults(results);\n        const facets = this._processFacets(aggregations);\n        return { results: models, total, facets };\n    },\n\n    _processFacets(rawFacets) {\n        const facets = _.chain(rawFacets)\n            .map((terms, key) => {\n                if (!Object.prototype.hasOwnProperty.call(SEARCH_FACET_KEYPATHS, key)) {\n                    return null;\n                }\n\n                return {\n                    key,\n                    facetName: SEARCH_FACET_KEYPATHS[key],\n                    terms: _.map(terms, ({ key: term, count }) => ({ term, count }))\n                };\n            })\n            .filter()\n            .value();\n        const keyOrder = ['department', 'title', 'profileSkills', 'hobbies', 'interests', 'certifications'];\n        return _.sortBy(facets, ({ key }) => keyOrder.indexOf(key));\n    },\n\n    async getFavoriteIds() {\n        const favorites = await this.get('favorites').getLoadedFavorites();\n        return favorites.map(favorite => favorite.id).slice(0, FAVORITE_LIMIT);\n    },\n\n    async runSearchQuery(isLoadMore) {\n        // Wait for any existing search to complete (max 20 iterations * 50ms = 1 second)\n        let iterations = 0;\n        while (this.get('loading.searchResults') && iterations++ < 20) {\n            await new Promise(resolve => setTimeout(resolve, 50));\n        }\n\n        let nextPage = 1;\n        if (isLoadMore) {\n            nextPage = this.get('page') + 1;\n        }\n        this.set('loading.searchResults', true);\n        this.set('loading.facets', !isLoadMore);\n\n        let entity = this.get('entity') || 'all';\n        const query = this.get('query');\n        const queryFacets = this.get('queryFacets');\n        const selectedTerms = this.buildSelectedTerms(query, queryFacets);\n        let favoriteIds = null;\n        if (entity == 'favorites') {\n            entity = 'all';\n            try {\n                favoriteIds = await this.getFavoriteIds();\n            } catch (e) {\n                Ember.Logger.warn(`search::runSearchQuery() Cannot find favorites: ${e.message}`);\n                favoriteIds = [];\n            }\n            this.set('lastSearchFavoritesCount', favoriteIds ? favoriteIds.length : 0);\n            if (favoriteIds && !favoriteIds.length) {\n                // There is no favorite at all, abort the search request!\n                const searchResults = this.get('searchResults');\n                searchResults.clear();\n                this.set('page', nextPage);\n                this.set('totalResults', 0);\n                this.set('facets', []);\n                this.set('selectedTerms', selectedTerms);\n                this.set('model', Ember.RSVP.resolve());\n                this.set('loading.searchResults', false);\n                this.set('loading.facets', false);\n                return;\n            }\n        }\n\n        const search = this._buildSearch(entity, query, selectedTerms, favoriteIds);\n        search.pageNumber = nextPage;\n\n        const fetch = this.get('search')\n            .search(search)\n            .then(data => this._normalizeSearch(data));\n\n        await fetch\n            .then(({ results, total, facets }) => {\n                const searchResults = this.get('searchResults');\n                if (!isLoadMore) {\n                    searchResults.clear();\n                }\n                searchResults.pushObjects(results);\n                this.set('page', nextPage);\n                this.set('totalResults', total);\n                this.set('facets', facets);\n                this.set('selectedTerms', selectedTerms);\n                return results;\n            })\n            .then((results = []) => {\n                const people = results.filterBy('type', 'person');\n                const ids = people.mapBy('id');\n                if (ids) {\n                    return this.get('store')\n                        .findMany('person', ids, BASE_PERSON)\n                        .then(userResults => {\n                            const integrationsPresence = this.get('integrationsPresence');\n                            if (\n                                integrationsPresence &&\n                                integrationsPresence.get('useIntegrationPresenceDirectorySearch')\n                            ) {\n                                return integrationsPresence.alterUsersWithIntegration(userResults);\n                            }\n                            return userResults;\n                        });\n                }\n            })\n            .catch(reason => {\n                let code = Ember.get(reason, 'payload.details.0.errorCode');\n                if (code === 'TOO_MANY_SEARCH_CRITERIA') {\n                    this.notifyTooManySearchFilters();\n                    throw reason;\n                }\n                this.set('searchResults', []);\n                throw reason;\n            })\n            .finally(() => {\n                this.set('loading.searchResults', false);\n                this.set('loading.facets', false);\n                this.set('model', fetch);\n            });\n    },\n\n    searchKeywords(query) {\n        const intoQuoteSegments = /(\".*?\"|'.*?'|[^\"\\s]+)+(?=\\s*|\\s*$)/g;\n        return query.split(intoQuoteSegments).filter(keyword => keyword && keyword.trim());\n    },\n\n    buildSelectedTerms(query, queryFacets) {\n        if (!query) {\n            query = '';\n        }\n        if (!queryFacets) {\n            queryFacets = '';\n        }\n\n        const selectedTerms = [];\n        const addSelectedTerm = (facetName, term, isKeyword) => {\n            selectedTerms.push(\n                FacetTerm.create({\n                    isKeyword,\n                    facet: { facetName },\n                    term: { term }\n                })\n            );\n        };\n\n        const keywordFacetName = this.get('intl').t('search.keyword');\n        this.searchKeywords(query).forEach(keyword => {\n            addSelectedTerm(keywordFacetName, keyword, true);\n        });\n\n        const directedSearchTerms = queryFacets.match(keypathRegex);\n        _.forEach(directedSearchTerms, directedSearch => {\n            const [facetName, ...searchSplit] = directedSearch.split(':');\n            const value = searchSplit.join(':');\n            if (value) {\n                const term = value.replace(/\"/g, '');\n                addSelectedTerm(facetName, term);\n            }\n        });\n\n        return selectedTerms;\n    },\n\n    notifyTooManySearchFilters() {\n        let title = this.get('intl').t('search.errors.tooManyFilters.title');\n        let message = this.get('intl').t('search.errors.tooManyFilters.message');\n        this.get('notification').error(title, message);\n    }\n};\n\nexport default Ember.Component.extend(Controller, View);\n","export default Ember.HTMLBars.template({\"id\":\"F64xFD4Z\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-content\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"left-rail facets\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\",\\\"facets\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[33,[\\\"or\\\"],[[28,[\\\"isGroups\\\"]],[28,[\\\"isLocations\\\"]],[28,[\\\"isExternalContacts\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"loader\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"panel-group\\\"],[15,\\\"id\\\",\\\"facets\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isGroups\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-groups\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"no-filtering-results\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noFilteringGroups\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isLocations\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-location-marker\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"no-filtering-results\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noFiltering\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isExternalContacts\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-contacts\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"no-filtering-results\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noFilteringContacts\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-search\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"no-results\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noResults\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"loading\\\",\\\"facets\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"displayFacets\\\"]]],[[\\\"key\\\"],[\\\"facetName\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"search-facet-group\\\"],null,[[\\\"facet\\\",\\\"selectedTerms\\\",\\\"parentId\\\"],[[28,[\\\"facet\\\"]],[28,[\\\"selectedTerms\\\"]],\\\"facets\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"facet\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"            \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"right-rail results\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\",\\\"searchResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"loader\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-type-filter\\\"],[13],[0,\\\"\\\\n            \\\"],[9,\\\"gux-tabs-advanced\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"col-tabs\\\"],[16,\\\"active-tab\\\",[34,[\\\"tab-filter-\\\",[28,[null,\\\"entity\\\"]]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                \\\"],[9,\\\"gux-tab-advanced-list\\\",{\\\"attrs\\\":[[15,\\\"slot\\\",\\\"tab-list\\\"],[15,\\\"show-new-tab-button\\\",\\\"false\\\"],[15,\\\"allow-sort\\\",\\\"false\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                    \\\"],[9,\\\"gux-tab-advanced\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"tab-filter-all\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeSearchType\\\",\\\"all\\\"],null],null],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.all\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"filter-all\\\"],[15,\\\"class\\\",\\\"filter all\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-search-all\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"visible-lg-inline visible-md-inline\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.all\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"]]}],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-tab-advanced\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"tab-filter-people\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeSearchType\\\",\\\"people\\\"],null],null],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.people\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"filter-people\\\"],[15,\\\"class\\\",\\\"filter people\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-personicon\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"visible-lg-inline visible-md-inline\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.people\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"]]}],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-tab-advanced\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"tab-filter-groups\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeSearchType\\\",\\\"groups\\\"],null],null],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.groups\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"filter-groups\\\"],[15,\\\"class\\\",\\\"filter groups\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-groups\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"visible-lg-inline visible-md-inline\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.groups\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"]]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"session\\\",\\\"features\\\",\\\"PURE-7064_search_favorites\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[9,\\\"gux-tab-advanced\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"tab-filter-favorites\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeSearchType\\\",\\\"favorites\\\"],null],null],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.favorites\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"filter-favorites\\\"],[15,\\\"class\\\",\\\"filter favorites\\\"],[13],[0,\\\"\\\\n                                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"rating-active\\\"],[15,\\\"decorative\\\",\\\"\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"visible-lg-inline visible-md-inline\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.favorites\\\"],null],false],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[9,\\\"gux-tab-advanced\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"tab-filter-locations\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeSearchType\\\",\\\"locations\\\"],null],null],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.locations\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"filter-locations\\\"],[15,\\\"class\\\",\\\"filter locations\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-location-marker\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"visible-lg-inline visible-md-inline\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.locations\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"]]}],[0,\\\"\\\\n                \\\"]]}],[0,\\\"\\\\n            \\\"]]}],[0,\\\"\\\\n\\\\n            \\\"],[1,[26,[\\\"create-entity-menu\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"current-facets \\\",[33,[\\\"unless\\\"],[[28,[\\\"haveSelectedTerms\\\"]],\\\"no-selected-facets\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"groupedSelectedTerms\\\"]]],[[\\\"key\\\"],[\\\"facet.facetName\\\"]],{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"grouped-facet-term\\\"],null,[[\\\"group\\\"],[[28,[\\\"group\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"group\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"search-results \\\",[26,[\\\"entity\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isFavoritesEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"no-search-results-icon-favorite\\\"],[13],[0,\\\"\\\\n                            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"favorite-background pc-moon\\\"],[15,\\\"icon-name\\\",\\\"legacy/favs-full\\\"],[15,\\\"decorative\\\",\\\"\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"favorite-foreground pc-moon not-favorite favorite outline-favorite\\\"],[15,\\\"icon-name\\\",\\\"legacy/favs-alpha\\\"],[15,\\\"decorative\\\",\\\"\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center no-search-results-with-icon\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"strong\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"search.noFavorite\\\"],null],false],[14],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noFavoriteLonger\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isExternalContactsEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center no-search-results\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noContacts\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center no-search-results\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noResultsLonger\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"searchResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"isSearchResult\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\"],[[28,[\\\"entity\\\"]],true,true,false]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"entity\\\"]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"atPageLimit\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasMoreResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"text-center page-limit entity-mini\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"search.reachedPageLimit\\\"],[[\\\"count\\\"],[[28,[\\\"remainingResults\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/search-page/template.hbs\"}});","import Ember from 'ember';\n\nconst SearchResultContextComponent = Ember.Component.extend({\n    classNameBindings: ['searchResultContextVisible:search-result-context-area'],\n    searchResultContextVisible: false,\n\n    _scrollToPreviousTop(messages, $messagePane, $lastMessage) {\n        if (messages.length > 0) {\n            Ember.run.scheduleOnce('afterRender', null, () => {\n                let targetHeight =\n                    $lastMessage.position().top - $lastMessage.height() - this.$('.history-bar').outerHeight();\n                $messagePane.animate({ scrollTop: targetHeight });\n            });\n        }\n    },\n\n    closeOnContextSwitch: Ember.observer('chatService.activeRoom', function () {\n        this.send('close');\n    }),\n\n    actions: {\n        close() {\n            this.attrs.close();\n        },\n\n        replyToMessage(message) {\n            this.attrs.close();\n            this.attrs.replyToMessage(message);\n        },\n\n        loadHistoryAfterLast() {\n            const promise = this.attrs.loadMoreHistoryAfter(this.get('historyRoom'));\n            promise.then(messages => messages);\n        },\n\n        loadHistoryBeforeFirst() {\n            let $messagePane = this.$('.search-result-context-messages');\n            let $lastMessage = this.$('.search-result-context .chat-message').first();\n            const promise = this.attrs.loadMoreHistoryBefore(this.get('historyRoom'));\n            promise.then(messages => {\n                this._scrollToPreviousTop(messages, $messagePane, $lastMessage);\n                return messages;\n            });\n        }\n    }\n});\n\nexport default SearchResultContextComponent;\n","export default Ember.HTMLBars.template({\"id\":\"Z/9pIjDO\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-result-context\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-result-context-header\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"close\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"close\\\"]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"×\\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"h4\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"chat.history\\\"],null],false],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-result-context-messages\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"chat-panel/conversation/conversation-pane/history-bar\\\"],null,[[\\\"activeRoom\\\",\\\"isForward\\\",\\\"loadMoreHistory\\\",\\\"noMoreHistoryText\\\"],[[28,[\\\"historyRoom\\\"]],false,[33,[\\\"action\\\"],[[28,[null]],\\\"loadHistoryBeforeFirst\\\"],null],[33,[\\\"t\\\"],[\\\"chat.noHistory\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"chat-panel/conversation/conversation-pane/messages\\\"],null,[[\\\"room\\\",\\\"replyToMessage\\\",\\\"isMediaCollapsed\\\",\\\"openMentionWarning\\\"],[[28,[\\\"historyRoom\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"replyToMessage\\\"],null],true,[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"openMentionWarning\\\"]]],null]]]],false],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"chat-panel/conversation/conversation-pane/history-bar\\\"],null,[[\\\"activeRoom\\\",\\\"isForward\\\",\\\"loadMoreHistory\\\",\\\"noMoreHistoryText\\\"],[[28,[\\\"historyRoom\\\"]],true,[33,[\\\"action\\\"],[[28,[null]],\\\"loadHistoryAfterLast\\\"],null],[33,[\\\"t\\\"],[\\\"chat.noHistory\\\"],null]]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/search-result-context/template.hbs\"}});","import Ember from 'ember';\n\nconst { Component, computed } = Ember;\n\nexport default Component.extend({\n    classNames: ['sms-message-icon'],\n    classNameBindings: ['subMessageTypeClass'],\n\n    subMessageTypeClass: computed('subMessageType', function () {\n        return `sms-message-type-${this.get('subMessageType')}`;\n    }),\n\n    subMessageType: null\n});\n","export default Ember.HTMLBars.template({\"id\":\"swD2LZfy\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"line\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"line-messenger\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"facebook\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"facebook-messenger\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"twitter\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"twitter\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"viber\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"viber\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"wechat\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"wechat\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"telegram\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"telegram\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"whatsapp\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"whatsapp\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"webmessaging\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"chat-multi\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"open\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"comment-ellipsis\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"sms\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/sms-message-icon/template.hbs\"}});","define(\"connections-ui/components/station-disassociate-link/component\", [\"exports\", \"ember-purecloud-components/components/station-disassociate-link/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","export default Ember.HTMLBars.template({\"id\":\"kFbO6UNm\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"tags-input-label\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"tags-input__tag\\\"],[13],[0,\\\"\\\\n        \\\"],[9,\\\"gux-truncate-beta\\\",{\\\"attrs\\\":[[15,\\\"max-lines\\\",\\\"1\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[18,\\\"default\\\"],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/tags-input/label/template.hbs\"}});","define(\"connections-ui/components/telephone-input/component\", [\"exports\", \"ember-purecloud-components/components/telephone-input/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tether-dialog\", [\"exports\", \"ember-modal-dialog/components/deprecated-tether-dialog\"], function (_exports, _deprecatedTetherDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _deprecatedTetherDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tether-popover-on-component\", [\"exports\", \"ember-tooltips/components/tether-popover-on-component\"], function (_exports, _tetherPopoverOnComponent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tetherPopoverOnComponent.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tether-popover-on-element\", [\"exports\", \"ember-tooltips/components/tether-popover-on-element\"], function (_exports, _tetherPopoverOnElement) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tetherPopoverOnElement.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tether-tooltip-on-component\", [\"exports\", \"ember-tooltips/components/tether-tooltip-on-component\"], function (_exports, _tetherTooltipOnComponent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tetherTooltipOnComponent.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tether-tooltip-on-element\", [\"exports\", \"ember-tooltips/components/tether-tooltip-on-element\"], function (_exports, _tetherTooltipOnElement) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tetherTooltipOnElement.default;\n    }\n  });\n});\n","import { inject as service } from '@ember/service';\nimport { computed } from '@ember/object';\nimport Component from '@ember/component';\nimport moment from 'connections-ui/utils/dates';\nimport layout from './template';\n\nconst MINUTE = 1000 * 60;\nconst HOUR = MINUTE * 60;\nconst DAY = HOUR * 24;\n\nexport default Component.extend({\n    classNames: ['time-elapsed'],\n    tagName: 'span',\n    layout,\n\n    clock: service(),\n    intl: service(),\n\n    timeSince: null,\n\n    _calculateElapsedTime(durationInMs) {\n        durationInMs = durationInMs > 0 ? durationInMs : 0; // Do not show negative durations.\n\n        const duration = moment.duration(durationInMs);\n        const days = duration.asDays();\n        const hours = duration.hours();\n        const minutes = duration.minutes();\n\n        if (days) {\n            if (hours) {\n                return this.get('intl').t('components.timeElapsed.detail.daysHours', {\n                    days: days,\n                    hours: hours\n                });\n            }\n            return this.get('intl').t('components.timeElapsed.detail.days', {\n                days: days\n            });\n        } else if (hours) {\n            if (minutes) {\n                return this.get('intl').t('components.timeElapsed.detail.hoursMinutes', {\n                    hours: hours,\n                    minutes: minutes\n                });\n            }\n            return this.get('intl').t('components.timeElapsed.detail.hours', {\n                hours: hours\n            });\n        }\n\n        return this.get('intl').t('components.timeElapsed.detail.minutes', {\n            minutes: minutes || '0'\n        });\n    },\n\n    _formatDuration: function () {\n        const timeSince = this.get('timeSince');\n        const msSince = moment().diff(moment(timeSince));\n        let unit, cnt;\n\n        if (msSince > DAY) {\n            unit = 'days';\n        } else if (msSince > HOUR) {\n            unit = 'hours';\n        } else if (msSince > MINUTE) {\n            unit = 'minutes';\n        } else {\n            return this.get('intl').t('components.timeElapsed.now');\n        }\n\n        cnt = moment().diff(moment(timeSince), unit);\n\n        if (cnt < 2) {\n            return this.get('intl').t(`components.timeElapsed.singular.${unit}`);\n        }\n\n        return this.get('intl').t(`components.timeElapsed.plural.${unit}`, { count: cnt });\n    },\n\n    tickingDuration: computed('timeSince', 'clock.second', function () {\n        return this._formatDuration();\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"fP6V7Isp\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[13],[1,[26,[\\\"tickingDuration\\\"]],false],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/time-elapsed/template.hbs\"}});","import Ember from 'ember';\nimport moment from '../../utils/dates';\n\nconst CLOCK_MODE_DURATION = 10000;\n\nexport default Ember.Component.extend({\n    classNames: 'time-machine-confirmation',\n\n    // Expose attrs as direct properties for modern Ember\n    cancel: Ember.computed.reads('attrs.cancel'),\n    confirm: Ember.computed.reads('attrs.confirm'),\n\n    init() {\n        this._super(...arguments);\n\n        this.set('primaryDirection', Math.random() < 0.5 ? 1 : -1);\n        this.set('minuteDirection', this.get('primaryDirection') * -1);\n        // Set to undefined to init the clock with the current time and tick as normal\n        this.set('_clockStandardMode', true);\n        this.set('randomTime', undefined);\n    },\n\n    willDestroyElement() {\n        let timer = this.get('_updInterval');\n        if (timer) {\n            Ember.run.cancel(timer);\n            this.set('_updInterval', null);\n        }\n\n        this._super(...arguments);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.set('_updInterval', Ember.run.later(this, 'updRandTime', CLOCK_MODE_DURATION));\n    },\n\n    escapedBuildTag: Ember.computed('buildTag', function () {\n        let result = '';\n\n        let rawBuildTag = this.get('buildTag');\n        if (typeof rawBuildTag === 'string' && Ember.isPresent(rawBuildTag)) {\n            result = Ember.Handlebars.Utils.escapeExpression(rawBuildTag);\n        }\n\n        return result;\n    }),\n\n    updRandTime() {\n        if (this.get('_clockStandardMode')) {\n            this.set('_clockStandardMode', false);\n            this.set('_randomModeStart', Date.now());\n        } else if (Date.now() - this.get('_randomModeStart') > CLOCK_MODE_DURATION) {\n            this.set('_clockStandardMode', true);\n            this.set('randomTime', undefined);\n            this.set('_updInterval', Ember.run.later(this, 'updRandTime', CLOCK_MODE_DURATION));\n            return;\n        }\n\n        let currTime = moment(this.get('randomTime'));\n\n        try {\n            let currMinutes = currTime.get('minutes');\n            let currBin = Math.floor(currMinutes / 5);\n            currTime.add(5 * this.get('minuteDirection'), 'minutes');\n            currTime.add(10 * this.get('primaryDirection'), 'seconds');\n            let nextMinutes = currTime.get('minutes');\n            let nextBin = Math.floor(nextMinutes / 5);\n\n            let hourMultiplier = 1;\n            if (Math.abs(nextBin - currBin) === 11) {\n                // Prevents jitter caused by minutes rolling hours\n                hourMultiplier++;\n            }\n            currTime.add(hourMultiplier * this.get('primaryDirection'), 'hours');\n\n            if (isNaN(currTime) || !currTime.isValid()) {\n                // Protect against overflow\n                currTime = moment();\n            }\n        } catch (e) {\n            currTime = moment();\n        }\n\n        this.set('randomTime', currTime);\n\n        this.set('_updInterval', Ember.run.later(this, 'updRandTime', 100));\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"14qtFvIN\",\"block\":\"{\\\"statements\\\":[[6,[\\\"modal-dialog\\\"],null,[[\\\"attachment\\\",\\\"targetAttachment\\\",\\\"translucentOverlay\\\",\\\"overlay-class\\\",\\\"container-class\\\",\\\"destinationElementId\\\"],[\\\"top center\\\",\\\"top center\\\",true,\\\"dark\\\",\\\"modal-dialog time-machine-confirm-dialog\\\",\\\"modal-overlays\\\"]],{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-content\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"header\\\",[]],[15,\\\"class\\\",\\\"modal-header\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"analog-clock\\\"],null,[[\\\"class\\\",\\\"showSecondHand\\\",\\\"staticMoment\\\"],[\\\"random-clock\\\",true,[28,[\\\"randomTime\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[11,\\\"h1\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"timemachine.title\\\"],null],false],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"close cancel-time-machine-nav\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"timemachine.cancel.desc\\\"],null]]]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"timemachine.cancel.desc\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"×\\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-body\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"intended-destination\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"timemachine.intendedDestination\\\"],[[\\\"buildNumber\\\"],[[28,[\\\"escapedBuildTag\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"disclaimer\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"timemachine.disclaimer\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-footer\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"actions\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-default confirm-time-machine-nav\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"confirm\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"timemachine.confirm.label\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"extra-links\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"https://www.genesys.com/company/careers\\\"],[15,\\\"class\\\",\\\"hiring-link\\\"],[15,\\\"target\\\",\\\"_blank\\\"],[15,\\\"rel\\\",\\\"noopener noreferrer\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"timemachine.hiring\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/time-machine-confirmation/template.hbs\"}});","define(\"connections-ui/components/toggle-switch/component\", [\"exports\", \"ember-purecloud-components/components/toggle-switch/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tooltip-on-component\", [\"exports\", \"ember-tooltips/components/tooltip-on-component\"], function (_exports, _tooltipOnComponent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tooltipOnComponent.default;\n    }\n  });\n});\n","import config from '../config/environment';\nimport TooltipOnElement from 'ember-tooltips/components/tooltip-on-element';\n\nlet _didUpdateTimeoutLength = config.environment === 'test' ? 0 : 1000;\n\nexport default TooltipOnElement.extend({ _didUpdateTimeoutLength });\n","/* global File */\n\nimport Ember from 'ember';\nimport _ from 'lodash';\n\nimport PromiseLoadingMixin from 'connections-ui/mixins/promise-loading';\nimport AutoSaveDevicesMixin from 'ember-webrtc-components/mixins/webrtc-service/auto-save-devices';\n\nimport FileAPI from 'fileapi';\nimport { uploadImageUrl } from './helpers';\n\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\n\nconst { computed, observer } = Ember;\nconst webcamWidth = 640;\nconst webcamHeight = 480;\n\nexport default Ember.Component.extend(PromiseLoadingMixin, AutoSaveDevicesMixin, {\n    classNames: ['upload-picture'],\n\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    fileUpload: Ember.inject.service(),\n    store: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n\n    currentFile: null,\n    currentFileInfo: null,\n    currentCoords: null,\n    currentXHR: null,\n    currentImageId: null,\n\n    selectedCamera: null,\n    cameraPending: false,\n    cameraError: false,\n    startingMedia: false,\n\n    imageUrl: null,\n    imageUrlData: null,\n    uploadingImageUrl: false,\n\n    attrs: {\n        confirm() {},\n\n        upload: null,\n        autoTakePicture: false,\n\n        entity: null,\n        uploadType: null\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        Ember.run.scheduleOnce('afterRender', this, this.createDropZone);\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.send('cancelCamera');\n        if (this.get('dropzone')) {\n            this.get('dropzone').destroy();\n        }\n    },\n\n    actions: {\n        uploadError() {\n            if (this.attrs.upload) {\n                this.attrs.upload(this.get('cameraError'));\n            }\n        },\n\n        uploadImage() {\n            if (this.attrs.upload) {\n                this.attrs.upload(this.get('currentFile'));\n                return;\n            }\n\n            let file = this.get('currentFile');\n            let promise;\n\n            if (this.get('uploadingImageUrl')) {\n                promise = Ember.RSVP.resolve(this.get('imageUrlData'));\n            } else {\n                promise = this.upload(file);\n            }\n\n            let coords = this.get('currentCoords');\n            let left = coords.x + (coords.x2 - coords.x) / 2 - 21;\n            let top = coords.y + (coords.y2 - coords.y) / 2 - 21;\n            const entityType = Ember.get(this, 'attrs.entity.value.type');\n\n            if (entityType === 'group') {\n                // using the public api group image requests we don't need to worry\n                // about linking an image.\n                promise\n                    .then(result => {\n                        // set image Id\n                        this.set('currentImageId', result.id);\n                        return;\n                    })\n                    .then(this.showPictures.bind(this))\n                    .catch(err => {\n                        this.send('clearImage');\n                        const intl = this.get('intl');\n\n                        const groupId = this.get('entity').guid;\n                        const orgId = this.get('entity').orgId;\n                        this.get('logger').error(\n                            `failed to upload image for group ${groupId}, of organization ${orgId}`,\n                            { error: err }\n                        );\n\n                        this.get('notification').error(\n                            intl.t('notification.titles.profileSaveError').toString(),\n                            intl.t('notification.fieldSection.error').toString(),\n                            {\n                                forceBrowserNotification: true,\n                                tag: 'image-upload'\n                            }\n                        );\n                    });\n            } else {\n                const userId = this.get('entity').id;\n                promise\n                    .then(this.get('entity').reload())\n                    .then(this.showPictures.bind(this))\n                    .catch(err => {\n                        this.send('clearImage');\n                        const intl = this.get('intl');\n\n                        const orgId = this.get('entity').orgId;\n                        this.get('logger').error(\n                            `failed to upload image for user ${userId}, of organization ${orgId}`,\n                            { error: err }\n                        );\n\n                        this.get('notification').error(\n                            intl.t('notification.titles.profileSaveError').toString(),\n                            intl.t('notification.fieldSection.error').toString(),\n                            {\n                                forceBrowserNotification: true,\n                                tag: 'image-upload'\n                            }\n                        );\n                    });\n            }\n\n            this.addIndicatorForPromise(promise, `#${this.get('elementId')} .image`);\n            this.$('.loading-indicator i').css({ top, left });\n        },\n\n        uploadImageUrl() {\n            let application = this.get('application');\n            let imageUrl = this.get('imageUrl');\n\n            if (!imageUrl) {\n                return;\n            }\n\n            this.set('uploadingImageUrl', true);\n\n            uploadImageUrl(application, imageUrl)\n                .then(data => {\n                    this.set('imageUrlData', data);\n\n                    this.displayImage(data);\n                    this.setupFileFromUrl();\n                })\n                .catch(err => {\n                    const intl = this.get('intl');\n\n                    const groupId = this.get('entity').guid;\n                    const orgId = this.get('entity').orgId;\n                    this.get('logger').error(`upload ImageUrl failed for group ${groupId} of organization ${orgId}`, {\n                        error: err\n                    });\n\n                    this.get('notification').error(\n                        intl.t('notification.titles.profileSaveError').toString(),\n                        intl.t('notification.fieldSection.error').toString(),\n                        {\n                            forceBrowserNotification: true,\n                            tag: 'image-upload'\n                        }\n                    );\n\n                    this.set('uploadingImageUrl', false);\n                    this.set('imageUrl', '');\n                });\n        },\n\n        clearImage() {\n            this.$('.image').empty();\n\n            this.set('currentFile', null);\n            this.set('currentFileInfo', null);\n            this.set('currentFileCoords', null);\n            this.set('currentImageId', null);\n\n            this.set('uploadingImageUrl', false);\n\n            Ember.run.scheduleOnce('afterRender', this, this.createDropZone);\n        },\n\n        startCamera() {\n            if (this.get('startingMedia')) {\n                return;\n            }\n\n            this.send('cancelCamera');\n            this.set('startingMedia', true);\n            this.set('cameraPending', true);\n\n            const isWebRtcSdkDisabled = this.get('session.features.AGORA-319_webrtc-sdk-dependency-removal');\n\n            if (isWebRtcSdkDisabled) {\n                let options = {\n                    audio: false,\n                    video: true\n                };\n                return navigator.mediaDevices\n                    .getUserMedia(options)\n                    .then(stream => {\n                        this.set('cameraStream', stream);\n                        this.attachMediaStream(stream, this.$('.camera-preview')[0], {\n                            muted: true,\n                            mirror: true\n                        });\n                        this.set('startingMedia', false);\n                        if (this.get('autoTakePicture')) {\n                            this.send('takePicture');\n                        }\n                    })\n                    .catch(err => {\n                        this.set('cameraError', this.get('intl').lookup(`images.error.${err.name}`).toString());\n                        if (this.get('autoTakePicture')) {\n                            this.send('uploadError');\n                        }\n                    });\n            } else {\n                let options = {\n                    requestAudio: false,\n                    requestVideo: true\n                };\n                if (this.get('selectedCamera')) {\n                    options.camera = this.get('selectedCamera');\n                }\n                return this.get('webrtc')\n                    .createMedia(options)\n                    .then(media => {\n                        this.set('cameraStream', media);\n                        const stream = media.localStreams[0];\n\n                        this.get('webrtc').attachMediaStream(stream, this.$('.camera-preview')[0], {\n                            muted: true,\n                            mirror: true\n                        });\n\n                        this.set('startingMedia', false);\n                        if (this.get('autoTakePicture')) {\n                            this.send('takePicture');\n                        }\n                    })\n                    .catch(err => {\n                        this.set('cameraError', this.get('intl').lookup(`images.error.${err.name}`).toString());\n                        if (this.get('autoTakePicture')) {\n                            this.send('uploadError');\n                        }\n                    });\n            }\n        },\n\n        takePicture() {\n            this.set('countdown', true);\n            Ember.run.later(() => {\n                let video = this.$('video')[0];\n                this.set('countdown', false);\n                let canvas = document.createElement('canvas');\n                canvas.width = video.videoWidth;\n                canvas.height = video.videoHeight;\n                let ctx = canvas.getContext('2d');\n                ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n                //convert to desired file format\n                let dataUrl = canvas.toDataURL('image/jpeg');\n                let asBlob = window.dataURLtoBlob(dataUrl);\n                let pictureInfo = { width: webcamWidth, height: webcamHeight, type: 'image/jpeg' };\n\n                let fileName = 'webcam';\n                if (this.get('autoTakePicture')) {\n                    fileName = this.get('intl').lookup('chat.commands.selfie.command').toString();\n                }\n\n                let asFile = new File([asBlob], `${fileName}.jpeg`, pictureInfo);\n                this.onTookPicture(dataUrl, asFile, pictureInfo);\n                this.send('cancelCamera');\n            }, 3000);\n        },\n\n        cancelCamera() {\n            const isWebRtcSdkDisabled = this.get('session.features.AGORA-319_webrtc-sdk-dependency-removal');\n\n            let cameraStream = this.get('cameraStream');\n            try {\n                if (isWebRtcSdkDisabled) {\n                    if (cameraStream && cameraStream.getTracks) {\n                        cameraStream.getTracks().forEach(track => {\n                            track.stop();\n                        });\n                    }\n                } else {\n                    if (cameraStream && cameraStream.localStreams) {\n                        cameraStream.localStreams.forEach(stream => {\n                            stream.getTracks().forEach(track => track.stop());\n                        });\n                    }\n                }\n            } catch (e) {\n                const groupId = this.get('entity').guid;\n                const orgId = this.get('entity').orgId;\n                this.get('logger').error(`Error stopping camera stream for group ${groupId} of organization ${orgId}`, {\n                    error: e\n                });\n            }\n            this.set('cameraPending', false);\n            this.set('cameraStream', null);\n        }\n    },\n\n    switchCamera: observer('selectedCamera', function () {\n        if (this.get('cameraPending')) {\n            this.send('startCamera');\n            this.get('webrtc').updateDefaultDevices({\n                camera: this.get('selectedCamera')\n            });\n        }\n    }),\n\n    canUseCamera: computed('webrtc.hasCamera', function () {\n        return (\n            this.get('webrtc.hasCamera') &&\n            (window.navigator.getUserMedia ||\n                (window.navigator.mediaDevices && window.navigator.mediaDevices.getUserMedia))\n        );\n    }),\n\n    init() {\n        this._super(...arguments);\n        // Calling enumerateDevices will conduct translation PCM-316\n        this.get('webrtc').enumerateDevices();\n        if (this.get('autoTakePicture')) {\n            this.send('startCamera');\n        }\n    },\n\n    getImageDataFromXhr(xhr) {\n        if (xhr) {\n            if (typeof xhr.responseText === 'string') {\n                return JSON.parse(xhr.responseText);\n            } else if (typeof xhr.responseText === 'object') {\n                return xhr.responseText;\n            } else if (typeof xhr === 'string') {\n                return JSON.parse(xhr);\n            }\n        }\n        return xhr;\n    },\n\n    initCrop() {\n        let aspectRatio = 1;\n        let size = this.get('currentFileInfo.height');\n        let type = this.get('entity.type');\n        let uploadType = this.get('uploadType');\n\n        if (type === 'floor' || uploadType === 'informal') {\n            aspectRatio = null;\n        }\n\n        if (this.get('currentFileInfo').width <= this.get('currentFileInfo').height) {\n            size = this.get('currentFileInfo').width;\n        }\n        this.$('img').Jcrop({\n            onSelect: this.handleCropChange.bind(this),\n            onChange: this.handleCropChange.bind(this),\n            aspectRatio: aspectRatio, // TODO: get this ratio from field config.\n            setSelect: [0, 0, size, size]\n        });\n    },\n\n    showPictures() {\n        const entity = this.get('entity');\n        if (!entity) {\n            throw new Error('Missing entity for component');\n        }\n\n        if (entity.get('type') === 'group') {\n            /*\n               https://github.com/emberjs/data/issues/3704\n               I hit what I believe is an ember-data 2.16 bug where the store was not being\n               updated after a findRecord request (even with reload: true specified).\n               As a result we make the request ourselves and update the store.\n            */\n            const store = this.get('store');\n            let serializer = store.serializerFor('group');\n            let model = store.modelFor('group');\n            let adapter = store.adapterFor('group');\n\n            const url = adapter.urlForFindRecord(entity.id);\n            const fieldsObj = { fl: '*' };\n            const data = Object.assign({}, data, fieldsObj);\n\n            const traditional = true;\n\n            this.get('ajax')\n                .request(url, { method: 'GET', data, traditional })\n                .then(result => {\n                    const santizedResult = serializer.normalizeSingleResponse(\n                        store,\n                        model,\n                        result,\n                        entity.id,\n                        'findRecord'\n                    );\n                    entity.set('version', santizedResult.data.attributes.version);\n                    entity.set('images', santizedResult.data.attributes.images);\n                    this.attrs.confirm();\n                });\n        } else {\n            entity.reload().then(() => {\n                this.attrs.confirm();\n            });\n        }\n    },\n\n    handleCropChange(coords) {\n        if (coords.x === coords.x2 && coords.y === coords.y2) {\n            let ratio = this.get('currentFileInfo.ratio');\n            coords = {\n                x: 0,\n                y: 0,\n                x2: this.get('currentFileInfo.width') * ratio,\n                y2: this.get('currentFileInfo.height') * ratio\n            };\n        }\n\n        this.set('currentCoords', coords);\n    },\n\n    displayImage(xhr) {\n        let data = this.getImageDataFromXhr(xhr);\n        let container = this.$('div.image');\n\n        let width = container.width();\n        let ratio = width / data.dimensions.x;\n        let height = data.dimensions.y * ratio;\n\n        let image = $(`<img src=\"${data.url}\" />`).css({ width: width, height: height });\n        container.html(image);\n\n        let currentFileInfo = this.get('currentFileInfo');\n        if (_.isEmpty(currentFileInfo) || !currentFileInfo.ratio) {\n            if (!width) {\n                width = 100;\n            }\n\n            if (!height) {\n                height = 100;\n            }\n\n            let fileInfo = {\n                ratio: ratio,\n                width,\n                height\n            };\n\n            this.set('currentFileInfo', fileInfo);\n        }\n\n        return xhr;\n    },\n\n    setupFileFromUrl() {\n        let container = this.$('div.image');\n        let $image = this.$('div.image img');\n        let image = $image[0];\n        let currentFile = FileAPI.Image(image);\n        this.set('currentFile', currentFile);\n\n        $image.on('load', () => {\n            Ember.run(() => {\n                let ratio = container.width() / image.naturalWidth;\n                let width = container.width();\n                let height = image.naturalHeight * ratio;\n                this.set('currentFileInfo', {\n                    ratio,\n                    width: image.naturalWidth,\n                    height: image.naturalHeight\n                });\n                $image.width(width);\n                $image.height(height);\n\n                this.initCrop();\n            });\n        });\n    },\n\n    upload(file) {\n        const entityType = this.attrs.entity.value.get('type');\n\n        let uploadType = this.get('uploadType');\n        let imageCategory = uploadType === 'informal' ? 'gallery' : 'profile';\n        const coords = this.get('currentCoords');\n        const displaywidth = this.$('img').width();\n        const cropProportion = file.name === 'webcam.jpeg' ? webcamWidth / displaywidth : file.width / displaywidth; // webcam files are always 640 * 480\n\n        if (entityType === 'group') {\n            const gId = this.attrs.entity.value.get('id');\n\n            const imgData = {\n                // the server side directory requires that the file size width/height be used\n                // for x2/y2\n                boundingBox: {\n                    x: coords.x * cropProportion,\n                    x2: coords.x2 * cropProportion,\n                    y: coords.y * cropProportion,\n                    y2: coords.y2 * cropProportion\n                },\n                groupImageType: imageCategory\n            };\n\n            let formData = new window.FormData();\n            formData.append('file', file);\n            formData.append(\n                'groupImageRequest',\n                new Blob([JSON.stringify(imgData)], {\n                    type: 'application/json'\n                })\n            );\n            const uri = this.get('application').pcV2Uri(`api/v2/groups/${gId}/images`);\n            return this.get('fileUpload').upload(uri, formData);\n        } else {\n            const uId = this.attrs.entity.value.get('id');\n\n            const imgData = {\n                // the server side directory requires that the file size width/height be used\n                // for x2/y2\n                boundingBox: {\n                    x: coords.x * cropProportion,\n                    x2: coords.x2 * cropProportion,\n                    y: coords.y * cropProportion,\n                    y2: coords.y2 * cropProportion\n                },\n                userImageType: uploadType\n            };\n\n            let formData = new window.FormData();\n            formData.append('file', file);\n            formData.append(\n                'userImageRequest',\n                new Blob([JSON.stringify(imgData)], {\n                    type: 'application/json'\n                })\n            );\n            const uri = this.get('application').pcV2Uri(`api/v2/users/${uId}/images`);\n            return this.get('fileUpload').upload(uri, formData);\n        }\n    },\n\n    onTookPicture(dataUri, file) {\n        this.set('currentFile', file);\n\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            const container = this.$('div.image');\n            const width = container.width();\n\n            let image = $(`<img src=\"${dataUri}\" />`);\n            container.html(image);\n            image.width(width);\n\n            image.one('load', () => {\n                const width = image.width();\n                const ratio = width / image[0].naturalWidth;\n                this.set('currentFileInfo', {\n                    width: width,\n                    height: image.height(),\n                    ratio\n                });\n\n                this.initCrop();\n            });\n\n            if (this.get('autoTakePicture')) {\n                this.send('uploadImage');\n            }\n        });\n    },\n\n    onChange(file) {\n        let container = this.$('div.image');\n\n        if (/^image/.test(file.type)) {\n            FileAPI.getInfo(file, (err, info) => {\n                this.handleFileInfo(err, info, file);\n            });\n        } else {\n            if (file) {\n                container.html(this.get('intl').t('images.genericFileTypeMessage').toString());\n            }\n\n            FileAPI.reset(event.currentTarget);\n        }\n    },\n\n    handleFileInfo(err, info, file) {\n        let container = this.$('div.image');\n        if (!err) {\n            let image = FileAPI.Image(file);\n\n            let ratio = container.width() / info.width;\n\n            this.set('currentFile', file);\n            this.set('currentFileInfo', info);\n            this.set('currentFileInfo.ratio', ratio);\n\n            let width = container.width();\n            let height = info.height * ratio;\n\n            image.preview(width, height).get((err, img) => {\n                if (width && height) {\n                    let uri = img.toDataURL();\n                    let image = $(`<img src=\"${uri}\" />`);\n                    container.html(image);\n\n                    this.initCrop();\n                }\n            });\n        } else {\n            container.html(this.get('intl').t('images.genericFileTypeMessage').toString());\n        }\n        FileAPI.reset(event.currentTarget);\n    },\n\n    createDropZone: function () {\n        if (this.get('dropzone')) {\n            this.get('dropzone').destroy();\n        }\n        const dropzone = new window.Dropzone(`#${this.get('elementId')} .dropzone`, {\n            acceptedFiles: 'image/*',\n            url: '/file/post',\n            uploadMultiple: false,\n            maxFiles: 1,\n            clickable: '.browse',\n            autoProcessQueue: false,\n            addRemoveLinks: true,\n            maxFilesize: 10,\n            dictInvalidFileType: this.get('intl').t('images.genericFileTypeMessage').toString(),\n            dictRemoveFile: this.get('intl').t('common.remove').toString(),\n            dictFileTooBig: this.get('intl').t('images.fileTooLarge').toString(),\n            dictCancelUpload: this.get('intl').t('images.cancelUpload').toString(),\n            dictUploadCanceled: this.get('intl').t('images.uploadCanceled').toString()\n        });\n\n        dropzone.on('thumbnail', file => {\n            Ember.run(() => this.onChange(file));\n        });\n\n        dropzone.on('addedfile', function () {\n            Ember.run(() => {\n                if (this.files.length > 1) {\n                    this.removeFile(this.files[0]);\n                }\n            });\n        });\n        this.set('dropzone', dropzone);\n    },\n\n    attachMediaStream: function (stream, element, options) {\n        const opts = {\n            autoplay: true,\n            mirror: false,\n            muted: false,\n            audio: false,\n            disableContextMenu: false\n        };\n\n        if (options) {\n            Object.keys(options).forEach(key => {\n                opts[key] = options[key];\n            });\n        }\n\n        if (opts.disableContextMenu) {\n            element.oncontextmenu = function (e) {\n                e.preventDefault();\n            };\n        }\n\n        if (opts.autoplay) element.autoplay = 'autoplay';\n        element.muted = !!opts.muted;\n        if (!opts.audio) {\n            ['', 'moz', 'webkit', 'o', 'ms'].forEach(function (prefix) {\n                const styleName = prefix ? prefix + 'Transform' : 'transform';\n                element.style[styleName] = opts.mirror ? 'scaleX(-1)' : 'scaleX(1)';\n            });\n        }\n\n        if (BrowserUtils.isSafari) {\n            element.setAttribute('playsinline', true);\n        }\n\n        element.srcObject = stream;\n        return element;\n    }\n});\n","import ajax from 'ember-ajax';\n\nexport function uploadImageUrl(application, url) {\n    let formData = new window.FormData();\n    formData.append('imageUrl', url);\n    return ajax(application.uri('api/v2/images'), {\n        method: 'post',\n        data: formData,\n        contentType: false,\n        processData: false\n    });\n}\n","export default Ember.HTMLBars.template({\"id\":\"K6YT0VqB\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"uploads \\\",[33,[\\\"if\\\"],[[28,[\\\"autoTakePicture\\\"]],\\\"hide\\\"],null],\\\" \\\",[33,[\\\"if\\\"],[[28,[\\\"currentFile\\\"]],\\\"have-file\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"currentFile\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-primary upload-button clickable\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"uploadImage\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"images.uploadImage\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-danger clear-button clickable\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"clearImage\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"images.clearImage\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"cameraPending\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"webrtc\\\",\\\"hasCamera\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"btn-block camera-selection\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"select-with-icon\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"label\\\",[]],[15,\\\"for\\\",\\\"camera-select\\\"],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"webrtcDevices.videoSource\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"x-select\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"action\\\",\\\"class\\\",\\\"aria-label\\\"],[\\\"camera-select\\\",[28,[\\\"selectedCamera\\\"]],[33,[\\\"action\\\"],[[28,[null]],[33,[\\\"mut\\\"],[[28,[\\\"selectedCamera\\\"]]],null]],null],\\\"form-control with-icon\\\",\\\"{{t \\\\\\\"webrtcDevices.videoSource\\\\\\\"}}\\\"]],{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"webrtc\\\",\\\"cameraList\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\"],[[28,[\\\"camera\\\"]]]],{\\\"statements\\\":[[1,[28,[\\\"camera\\\",\\\"label\\\"]],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"camera\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null],[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-video select-icon\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-primary take-picture-button\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"takePicture\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"images.takePicture\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"dropzone\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"dz-message\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"glyphicon glyphicon-cloud-upload\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"images.drop\\\"],null],false],[0,\\\"\\\\n                    \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"browse\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"images.browseFile\\\"],null],false],[0,\\\".\\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"picture-options\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canUseCamera\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-default take-picture-button clickable\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"startCamera\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"images.takePicture\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"image \\\",[33,[\\\"if\\\"],[[28,[\\\"cameraPending\\\"]],\\\"hide\\\"],null]]]],[13],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"camera \\\",[33,[\\\"unless\\\"],[[28,[\\\"cameraPending\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"cameraError\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"h4\\\",[]],[13],[1,[26,[\\\"cameraError\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[11,\\\"video\\\",[]],[15,\\\"class\\\",\\\"camera-preview\\\"],[15,\\\"mute\\\",\\\"true\\\"],[15,\\\"autoplay\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"countdown\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"countdown\\\"],[13],[0,\\\"\\\\n\\\"],[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"countdown-3\\\"],[13],[0,\\\"3\\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"countdown-2\\\"],[13],[0,\\\"2\\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"countdown-1\\\"],[13],[0,\\\"1\\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/upload-picture/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nlet profilePaths = {\n    person: 'images.profile',\n    group: 'images.activeProfilePicture'\n};\n\nexport default Ember.Component.extend(LoggerMixin, {\n    classNames: ['uploaded-image'],\n\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n\n    image: null,\n    entity: null,\n    size: '128',\n    labelKey: '',\n    editingCaption: false,\n    canAddCaption: false,\n\n    type: 'profile',\n\n    attrs: {\n        select() {},\n        delete() {},\n\n        editing: false,\n        canEdit: false,\n        showingInformal: false\n    },\n\n    actions: {\n        selectUploadedImage(event) {\n            if (event) {\n                //action executed on click, kb Space, kb Enter\n                if (event.keyCode != 13 && event.keyCode != 32) {\n                    return;\n                }\n                event.preventDefault();\n            }\n            let type = this.get('type');\n            let image = this.get('image');\n            let active = this.get('isActive');\n\n            let selectUploadedImage = this.attrs.select;\n\n            if (this.get('editing') && this.get('canEdit') && this.get('type') === 'profile') {\n                selectUploadedImage(type, image, active);\n            } else {\n                let current = this.get('currentInformal');\n                if (current !== this.get('image')) {\n                    this.set('currentInformal', this.get('image'));\n                    this.showImage(image, type);\n                } else {\n                    this.set('currentInformal', null);\n                }\n            }\n        },\n        deleteUploadedImage(event) {\n            //action executed on click, kb Space, kb Enter\n            if (event) {\n                if (event.keyCode != 13 && event.keyCode != 32) {\n                    return;\n                }\n                event.preventDefault();\n            }\n            let type = this.get('type');\n            let image = this.get('image');\n            let active = this.get('isActive');\n            let deleteUploadedImage = this.attrs.delete;\n\n            if (this.get('canDelete')) {\n                const entityType = Ember.get(this, 'entity.type');\n\n                if (entityType === 'group' || entityType === 'person') {\n                    const id = Ember.get(this, 'entity.id');\n                    const imageId = Ember.get(this, 'image._id');\n                    const url =\n                        entityType === 'group'\n                            ? `api/v2/groups/${id}/images/${imageId}`\n                            : `api/v2/users/${id}/images/${imageId}`;\n\n                    return this.get('ajax')\n                        .delete(Ember.get(this, 'application').pcV2Uri(url))\n                        .then(() => {\n                            deleteUploadedImage(type, image, false);\n                            return;\n                        })\n                        .catch(err => {\n                            const intl = this.get('intl');\n\n                            this.logger.error('failed to upload image', { error: err });\n\n                            this.get('notification').error(\n                                intl.lookup('notification.titles.profileSaveError').toString(),\n                                intl.lookup('notification.fieldSection.error').toString(),\n                                {\n                                    forceBrowserNotification: true,\n                                    tag: 'image-upload'\n                                }\n                            );\n                            return;\n                        });\n                } else {\n                    this.get('delete')(type, image, active);\n                }\n            }\n        }\n    },\n\n    addCaption() {\n        this.set('openCaption', this);\n\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            this.$('.caption textarea').focus();\n        });\n    },\n\n    saveCaption() {\n        this.set('openCaption', null);\n\n        let imageList = this.get('entity').getFieldValue('images.informal');\n        let image = imageList.findBy('_id', this.get('image._id'));\n\n        Ember.set(image, 'labelKey', this.get('labelKey'));\n        this.get('entity').save();\n    },\n\n    initCaption: Ember.on('init', function () {\n        this.set('canAddCaption', this.get('type') === 'informal' && this.get('entity.type') === 'person');\n        this.set('labelKey', this.get('image.labelKey'));\n    }),\n\n    ownImage: Ember.computed('entity', 'entity.id', function () {\n        if (!this.get('canEdit')) {\n            return false;\n        }\n\n        let isPerson = this.get('entity.id') === this.get('session.person.id');\n        let isGroupOwner = false;\n\n        if (this.get('entity.type') === 'group') {\n            let owners = this.get('entity').getFieldValue('owners.owners') || [];\n            isGroupOwner = _.find(owners, owner => {\n                return owner.value === this.get('session.person.id');\n            });\n        }\n\n        return isPerson || isGroupOwner;\n    }),\n\n    closeCaption: Ember.observer('openCaption', function () {\n        if (this.get('openCaption') !== this) {\n            this.set('editingCaption', false);\n        } else {\n            this.set('editingCaption', true);\n        }\n    }),\n\n    canDelete: Ember.computed('entity.uploadedProfilePictures.length', function () {\n        const entityType = this.get('entity.type');\n        if (entityType === 'group') {\n            let isEditing = this.get('editing');\n            return isEditing;\n        }\n\n        let type = this.get('type') === 'informal';\n        let populated = this.get('entity.uploadedProfilePictures.length') !== 1;\n        let isEditing = this.get('editing');\n        return (type || populated) && isEditing;\n    }),\n\n    src: Ember.computed('image', 'entity', 'size', function () {\n        let image = this.get('image.value');\n        let size = `x${this.get('size')}`;\n\n        if (image) {\n            return image[size];\n        }\n\n        return '';\n    }),\n\n    isActive: Ember.computed('image', 'entity', 'entity.profilePicture', function () {\n        let image = this.get('image');\n        let type = this.get('type');\n        let imagePath = profilePaths[this.get('entity.type')];\n\n        if (type === 'profile') {\n            let currentImage = this.get('entity').getReferencedField(imagePath);\n\n            if (!_.isEmpty(currentImage)) {\n                return image._id === currentImage._id;\n            }\n        }\n\n        return false;\n    }),\n\n    showImage: function (/*image, type*/) {\n        this.bubbleAction({\n            action: 'viewLightGallery',\n            actionContext: [this.get('image')]\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"kplgeCU/\",\"block\":\"{\\\"statements\\\":[[11,\\\"img\\\",[]],[16,\\\"alt\\\",[33,[\\\"t\\\"],[\\\"images.userSubmitted\\\"],null],null],[16,\\\"class\\\",[34,[\\\"clickable \\\",[33,[\\\"if\\\"],[[28,[\\\"isActive\\\"]],\\\"active\\\"],null],\\\" \\\",[33,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]],\\\"can-edit\\\"],null]]]],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectUploadedImage\\\"],[[\\\"on\\\"],[\\\"keydown\\\"]]],null],[16,\\\"aria-label\\\",[33,[\\\"if\\\"],[[28,[\\\"isActive\\\"]],[33,[\\\"concat\\\"],[[33,[\\\"t\\\"],[\\\"images.userSubmitted\\\"],null],\\\" (selected)\\\"],null],[33,[\\\"t\\\"],[\\\"images.selectImage\\\"],null]],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"src\\\",[26,[\\\"src\\\"]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"selectUploadedImage\\\"]],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canDelete\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[\\\"delete \\\",[33,[\\\"if\\\"],[[28,[\\\"canAddCaption\\\"]],\\\"informal-delete\\\"],null]]]],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"deleteUploadedImage\\\"],[[\\\"on\\\"],[\\\"keydown\\\"]]],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"images.deleteImage\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"deleteUploadedImage\\\"]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-close-circled\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"editingCaption\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"caption form-group\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"textarea\\\"],null,[[\\\"classNames\\\",\\\"value\\\",\\\"aria-label\\\"],[\\\"form-control\\\",[28,[\\\"labelKey\\\"]],[33,[\\\"t\\\"],[\\\"images.addCaption\\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-default\\\"],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.save\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"saveCaption\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"canAddCaption\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"caption clickable\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"images.addCaption\\\"],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"images.addCaption\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"addCaption\\\",[28,[\\\"image\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current-caption own-caption\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"labelKey\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"edit\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-edit\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showingInformal\\\"]],[28,[\\\"labelKey\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"caption\\\"],[16,\\\"title\\\",[26,[\\\"labelKey\\\"]],null],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current-caption\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"labelKey\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/uploaded-image/template.hbs\"}});","define(\"connections-ui/components/vertical-collection\", [\"exports\", \"smoke-and-mirrors/components/vertical-collection\"], function (_exports, _verticalCollection) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _verticalCollection.default;\n    }\n  });\n});\n","define(\"connections-ui/components/vertical-item\", [\"exports\", \"smoke-and-mirrors/components/vertical-item\"], function (_exports, _verticalItem) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _verticalItem.default;\n    }\n  });\n});\n","define(\"connections-ui/components/volume-input/component\", [\"exports\", \"ember-purecloud-components/components/volume-input/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/webrtc-debug-modal/component\", [\"exports\", \"ember-webrtc-components/components/webrtc-debug-modal/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/webrtc-issues/component\", [\"exports\", \"ember-webrtc-components/components/webrtc-issues/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/webrtc-settings/component\", [\"exports\", \"ember-webrtc-components/components/webrtc-settings/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/webrtc-troubleshooter/component\", [\"exports\", \"webrtc-troubleshoot/components/webrtc-troubleshooter/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/wrap-urls\", [\"exports\", \"ember-wrap-urls/components/wrap-urls\"], function (_exports, _wrapUrls) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _wrapUrls.default;\n    }\n  });\n});\n","define(\"connections-ui/components/wrap-urls/link\", [\"exports\", \"ember-wrap-urls/components/wrap-urls/link\"], function (_exports, _link) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _link.default;\n    }\n  });\n});\n","define(\"connections-ui/components/wrap-urls/url\", [\"exports\", \"ember-wrap-urls/components/wrap-urls/url\"], function (_exports, _url) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _url.default;\n    }\n  });\n});\n","import XOption from 'emberx-select/components/x-option';\nexport default XOption;\n","import XSelect from 'emberx-select/components/x-select';\nexport default XSelect;\n","import require from 'require';\nimport environment from './environment';\n\nconst modulePrefix = environment.modulePrefix;\nconst metaName = `${modulePrefix}/config/asset-manifest`;\nconst nodeName = `${modulePrefix}/config/node-asset-manifest`;\n\nlet config = {};\n\ntry {\n  // If we have a Node version of the asset manifest, use that for FastBoot and\n  // similar environments.\n  if (require.has(nodeName)) {\n    config = require(nodeName).default; // eslint-disable-line\n  } else {\n    const rawConfig = document.querySelector('meta[name=\"' + metaName + '\"]').getAttribute('content');\n    config = JSON.parse(unescape(rawConfig));\n  }\n} catch(err) {\n  throw new Error('Failed to load asset manifest. For browser environments, verify the meta tag with name \"'+ metaName +\n    '\" is present. For non-browser environments, verify that you included the node-asset-manifest module.');\n}\n\nexport default config;\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    queryParams: ['path'],\n    path: ''\n});\n","import Ember from 'ember';\n\nconst isNonEmptyStringQueryParam = paramStr => {\n    return (\n        typeof paramStr === 'string' &&\n        !Ember.isBlank(paramStr) &&\n        // Handles 'https://wikipedia.org/?param' case.\n        // Ember parses as the literal string 'true'\n        paramStr !== 'true'\n    );\n};\n\nexport default Ember.Controller.extend({\n    chat: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    settings: Ember.inject.service(),\n    application: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    phoneService: Ember.inject.service('phone'),\n    appsService: Ember.inject.service('apps'),\n    webrtc: Ember.inject.service('webrtc'),\n\n    queryParams: ['mobile', 'panels', 'initialPanel'],\n    panels: null,\n    initialPanel: null,\n\n    updateCurrentRouteName: Ember.observer('currentRouteName', function () {\n        Ember.run.once(this, this.set, 'application.currentRouteName', this.get('currentRouteName'));\n    }),\n\n    panelsOverrideObject: Ember.computed('panels', 'initialPanel', function () {\n        const panelsOverrideObject = {};\n        const panelsOverride = this.get('panels');\n        const initialPanelOverride = this.get('initialPanel');\n        if (isNonEmptyStringQueryParam(panelsOverride)) {\n            panelsOverrideObject.panelsOverride = panelsOverride.split(',');\n        } else if (panelsOverride === '') {\n            panelsOverrideObject.panelsOverride = [];\n        }\n        if (isNonEmptyStringQueryParam(initialPanelOverride)) {\n            panelsOverrideObject.initialPanelOverride = initialPanelOverride;\n        }\n        return panelsOverrideObject;\n    }),\n\n    actions: {\n        reportError(notification) {\n            if (notification) {\n                notification.hide();\n            }\n\n            this.transitionToRoute('feedback');\n        },\n\n        openPreferencesModal() {\n            this.get('settings').open();\n        }\n    }\n});\n","define(\"connections-ui/controllers/array\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = Ember.Controller;\n  _exports.default = _default;\n});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    entity: Ember.computed.reads('model'),\n\n    currentPerson: null,\n\n    actions: {\n        setCurrentPerson(person) {\n            this.set('currentPerson', person);\n        }\n    }\n});\n","import Ember from 'ember';\nexport default Ember.Controller.extend({});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    permissions: Ember.inject.service()\n});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    chat: Ember.inject.service(),\n\n    managePresenceSubscriptions: Ember.observer('model.participantsVisible', function () {\n        const subscribeTo = this.get('model.participantsVisible') ? this.get('model.participants') : null;\n        return this.get('presenceSubscription').autoSubscribe(subscribeTo, this);\n    }),\n\n    actions: {\n        inviteUserToRoom(person) {\n            const room = this.get('model');\n            if (room.isOneToOneRoom()) {\n                return this.promoteToAdhocRoom(person);\n            } else {\n                return this.get('chat').inviteToRoom(room, person);\n            }\n        },\n\n        toggleParticipants() {\n            this.toggleProperty('model.participantsVisible');\n        },\n\n        collapseChat() {}\n    },\n\n    promoteToAdhocRoom(person) {\n        const chat = this.get('chat');\n        const oneToOneTarget = this.get('model.oneToOneTarget');\n        return chat.makeNewEmptyRoom().then(room => {\n            chat.inviteToRoom(room, oneToOneTarget);\n            return chat.inviteToRoom(room, person);\n        });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport DS from 'ember-data';\n\nimport PersonModel from '../models/person';\n\nvar ContactsController = Ember.Controller.extend({\n    favoritesNameFilter: null,\n\n    personBinding: 'session.person',\n    isOnlyFavorite: false,\n    canSearch: false,\n\n    actions: {\n        removeFavorite: function (person) {\n            var path = this.get('applicationService').uri([\n                'api/v2/people',\n                this.get('person.id'),\n                'favorites',\n                person.get('id')\n            ]);\n\n            $.ajax({\n                url: path,\n                type: 'delete',\n                dataType: 'json'\n            }).then(() => {\n                this.get('person').reload();\n                this.get('filteredFavorites').removeObject(person);\n            });\n        },\n\n        addFavorite: function (person) {\n            this.get('filteredFavorites').addObject(person);\n        },\n\n        toggleFavorite: function (person, isFavorite) {\n            if (person.content) {\n                person = person.content;\n            }\n\n            if (isFavorite) {\n                this.send('addFavorite', person);\n            } else {\n                this.send('removeFavorite', person);\n            }\n        }\n    },\n\n    recents: Ember.computed('person', 'model', function () {\n        var apiEndpoint = PersonModel.apiEndpoint;\n        var url = `/api/${apiEndpoint}/${this.get('person.id')}/recents`;\n\n        var promise = new Ember.RSVP.Promise(function (resolve) {\n            $.getJSON(url, { idOnly: true }).then(function (data) {\n                resolve(data.res);\n            });\n        });\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    setLocalFavorites: Ember.observer('model', 'person', function () {\n        var favorites = this.get('model');\n        if (!_.isEmpty(favorites)) {\n            this.set('filteredFavorites', favorites);\n        }\n    }),\n\n    favoritesFilterChanged: Ember.observer('favoritesNameFilter', function () {\n        this.debouncedFavoritesFilterChanged();\n    }),\n\n    createDebouncedFavoritesFilterChanged: Ember.on('init', function () {\n        this.debouncedFavoritesFilterChanged = _.debounce(() => {\n            Ember.run(() => this._filterChanged());\n        }, 250);\n    }),\n\n    _filterChanged: function () {\n        var filter = this.get('favoritesNameFilter');\n        var favorites = this.get('model');\n\n        if (filter) {\n            var filtered = this.get('model').filter(function (person) {\n                return _.includes(person.get('name').toLowerCase(), filter.toLowerCase());\n            });\n\n            this.setFavorites(filtered);\n        } else {\n            this.setFavorites(favorites);\n        }\n    },\n\n    countFavorites: Ember.observer('filteredFavorites', 'person.favorites.content', 'view', function () {\n        try {\n            var list = this.get('filteredFavorites');\n            this.set('isOnlyFavorite', list.length === 1);\n        } catch (err) {\n            this.set('isOnlyFavorite', false);\n        }\n    }),\n\n    checkSearchVisibility: Ember.observer('filteredFavorites', 'person.favorites.content', function () {\n        var list = this.get('filteredFavorites');\n\n        if (list !== null && list !== undefined) {\n            var value = list.length > 0;\n            this.set('canSearch', value);\n        }\n    }),\n\n    setFavorites: function (favorites) {\n        this.set('filteredFavorites', favorites);\n    }\n});\n\nexport default ContactsController;\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nvar EngageController = Ember.Controller.extend(LoggerMixin, {\n    engageService: Ember.inject.service('engage'),\n\n    // Overridden to preserve hash query parameters.\n    transitionToRoute(route) {\n        window.location.hash = route;\n    },\n\n    // Overridden to preserve hash query parameters.\n    replaceRoute(route) {\n        const search = window.location.search;\n        window.location.replace(`${window.location.pathname}${search}#${route}`);\n    },\n\n    setEngageActive() {\n        this.set('engageService.route', this.get('model.engagePath'));\n        this.set('engageService.isEngageActive', true);\n    },\n\n    setEngageInactive() {\n        this.set('engageService.isEngageActive', false);\n    },\n\n    navigationEvent: Ember.observer('engageService.navigationRoute', function () {\n        const navRoute = this.get('engageService.navigationRoute');\n        if (navRoute) {\n            const route = engageRouteToCollaborateRoute(navRoute);\n            this.logger.debug('Transitioning to', route);\n            this.transitionToRoute(route); //see override above\n            this.set('engageService.navigationRoute', null);\n        }\n    }),\n\n    redirectEvent: Ember.observer('engageService.redirectRoute', function () {\n        const route = engageRouteToCollaborateRoute(this.get('engageService.redirectRoute'));\n        this.replaceRoute(route); //see override above\n        this.logger.debug('Redirecting to', route);\n    })\n});\n\nfunction engageRouteToCollaborateRoute(route) {\n    // Content management routes live under their own top-level position in collaborate\n    let newRoute = route.replace(/^#contentManagement/, '/content-management');\n    // Everything else is mapped to the /engage/... routes\n    if (!/^\\/content-management/.test(newRoute)) {\n        newRoute = route.replace(/^#\\/?/, '/engage/');\n    }\n    return newRoute;\n}\n\nexport default EngageController;\n","import Ember from 'ember';\n\nconst { Controller } = Ember;\n\nexport default Controller.extend();\n","import Ember from 'ember';\n\nconst { Controller, computed, inject } = Ember;\n\ntype MaintenanceModeMessageKeys = {\n    titleKey: string;\n    descKey?: string;\n    actionKey: string;\n};\n\nconst MaintenanceController = Controller.extend({\n    intl: inject.service(),\n\n    hasDesc: false,\n\n    messageKeys: computed('model', function (): MaintenanceModeMessageKeys {\n        // Always return the same generic error in the maintenance page.\n        // Newrelic will still report the specific error.\n        return {\n            titleKey: 'unrecoverableAppFailure.unknownFailure.title',\n            descKey: 'unrecoverableAppFailure.unknownFailure.desc',\n            actionKey: 'unrecoverableAppFailure.unknownFailure.action'\n        };\n    })\n});\n\nexport default MaintenanceController;\n\n// DO NOT DELETE: This registers controllers by key with the Ember Container allowing TS to know the types of items in the container\ndeclare module '@ember/controller' {\n    interface Registry {\n        maintenance: typeof MaintenanceController;\n    }\n}\n","define(\"connections-ui/controllers/object\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = Ember.Controller;\n  _exports.default = _default;\n});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({});\n","import Ember from 'ember';\n\nconst { computed } = Ember;\n\nexport default Ember.Controller.extend({\n    entity: Ember.computed.alias('model.person'),\n    embedded: Ember.inject.service(),\n\n    queryParams: ['editing', 'editEmergencyLocation'],\n\n    editing: true,\n    editEmergencyLocation: false,\n    showMobile: false,\n    showDropdown: false,\n\n    loadingFieldSections: false,\n\n    editingProfile: computed.alias('editing'),\n    editingSection: false,\n\n    actions: {\n        toggleEditing() {\n            this.toggleProperty('editingProfile');\n        },\n\n        setEditingSection(value) {\n            this.set('editingSection', value);\n        },\n\n        showGridMode() {\n            this.setProperties({\n                stackedMode: false,\n                gridMode: true,\n                treeMode: false\n            });\n        },\n\n        showStackedMode() {\n            this.setProperties({\n                stackedMode: true,\n                gridMode: false,\n                treeMode: false\n            });\n        },\n\n        showTreeMode() {\n            this.setProperties({\n                stackedMode: false,\n                gridMode: false,\n                treeMode: true\n            });\n        },\n\n        toggleLeftRail() {\n            this.toggleProperty('showMobile');\n        },\n\n        noop() {}\n    },\n\n    name: computed('entity.general.name.[]', function () {\n        return this.get('entity').getFieldValue('general.name');\n    }),\n\n    title: computed('entity.general.title.[]', function () {\n        return this.get('entity').getFieldValue('general.title');\n    }),\n\n    department: computed('entity.general.department.[]', function () {\n        return this.get('entity').getFieldValue('general.department');\n    }),\n\n    onOwnProfile: computed('entity.id', 'session.person.id', function () {\n        return this.get('entity.id') === this.get('session.person.id');\n    }),\n\n    showGallery: computed('entity', 'entity.id', function () {\n        var gallery = this.get('entity.images.informal');\n        if (gallery) {\n            return gallery.length > 0;\n        }\n        return false;\n    }),\n\n    /**\n     * Observes query parameter changes and notifies the host application\n     */\n    queryParamObserver: Ember.observer('editing', 'editEmergencyLocation', function () {\n        Ember.run.debounce(this, this.syncQueryParamsWithHost, 100);\n    }),\n\n    /**\n     * Syncs current query parameters with the host application URL\n     */\n    syncQueryParamsWithHost() {\n        if (!this.get('embedded')) return;\n\n        const currentLocalHash = window.location.hash;\n        const currentHostHash = window.top.location.hash;\n        if (!currentLocalHash.startsWith('#/person')) return;\n\n        const updatedHostHash = currentLocalHash.replace(/person/, 'person-v2');\n\n        // Send navigation event to host application, if different from current\n        if (currentHostHash !== updatedHostHash) {\n            this.get('embedded').sendNavigationEvent({\n                hash: updatedHostHash\n            });\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport { PUBLIC_ENVS } from '../utils/net';\n\nconst { Controller, inject } = Ember;\n\nexport default Controller.extend({\n    application: inject.service(),\n    intl: inject.service(),\n\n    desktopRegionId: null,\n\n    actions: {\n        chooseRegion() {\n            const context = this.get('application.hostedContext');\n            if (context.isHosted()) {\n                context.sendRegionToDesktop(this.get('desktopRegionId'));\n            }\n        }\n    },\n\n    init: function () {\n        this._super(...arguments);\n\n        // Set Initial/Default Region\n        let defaultDesktopRegionId = 'global';\n\n        const locale = this.get('intl.systemLocale');\n        if (_.includes(locale, 'au')) {\n            defaultDesktopRegionId = 'au';\n        } else if (_.includes(locale, 'ja') || _.includes(locale, 'zh')) {\n            defaultDesktopRegionId = 'jp';\n        }\n\n        this.set(\n            'desktopRegionId',\n            _.find(PUBLIC_ENVS, { desktopId: defaultDesktopRegionId })\n                ? defaultDesktopRegionId\n                : PUBLIC_ENVS[0].desktopId\n        );\n    }\n});\n","import IndexController from './index';\n\nvar RelateExternalContactController = IndexController.extend({\n    // Nothing to override.  This is instantiated to provide the same services from RelateExternalContactRoute to\n    // the RelateExternalContactRoute\n});\n\nexport default RelateExternalContactController;\n","import IndexController from './index';\n\nvar RelateExternalOrganizationController = IndexController.extend({\n    // Nothing to override.  This is instantiated to provide the same services from RelateExternalContactRoute to\n    // the RelateExternalContactRoute\n});\n\nexport default RelateExternalOrganizationController;\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nvar IndexController = Ember.Controller.extend(LoggerMixin, {\n    session: Ember.inject.service(),\n    relateService: Ember.inject.service('relate'),\n\n    // Overridden to preserve hash query parameters.\n    transitionToRoute(route) {\n        window.location.hash = route;\n    },\n\n    // Overridden to preserve hash query parameters.\n    replaceRoute(route) {\n        const search = window.location.search;\n        window.location.replace(`${window.location.pathname}${search}#${route}`);\n    },\n\n    navigationEvent: Ember.observer('relateService.navigationRoute', function () {\n        var navRoute = this.get('relateService.navigationRoute');\n        if (navRoute) {\n            this.logger.debug('Transitioning to', navRoute);\n            this.transitionToRoute(navRoute); //see override above\n            this.set('relateService.navigationRoute', null);\n        }\n    }),\n\n    redirectEvent: Ember.observer('relateService.redirectRoute', function () {\n        let redirectRoute = this.get('relateService.redirectRoute');\n        this.logger.debug('Redirecting to', redirectRoute.route);\n        this.replaceRoute(redirectRoute.route); //see override above\n    }),\n\n    init: function () {\n        this._super.apply(this, arguments);\n        this.get('relateService.redirectRoute');\n    }\n});\n\nexport default IndexController;\n","import Ember from 'ember';\nimport SignupController from './signup';\n\nexport default SignupController.extend({\n    intl: Ember.inject.service(),\n\n    _heading: Ember.computed(function () {\n        return this.get('intl').lookup('signIn.forgotPasswordHeading').toString();\n    }),\n\n    _button: Ember.computed(function () {\n        return this.get('intl').lookup('signIn.forgotPasswordHeading').toString();\n    })\n});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    queryParams: ['entity', 'query', 'queryFacets', 'saveHistory'],\n\n    entity: null,\n    query: null,\n    queryFacets: null,\n    saveHistory: true\n});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    queryParams: ['targetRoute']\n});\n","define(\"connections-ui/enums/plantronics-call-events\", [\"exports\", \"ember-softphone-integration/enums/plantronics-call-events\"], function (_exports, _plantronicsCallEvents) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _plantronicsCallEvents.default;\n    }\n  });\n});\n","import FieldConfig from '../field-config';\nimport ExternalContactModel from '../../models/external-contact';\n\nexport default FieldConfig.extend({\n    modelClass: ExternalContactModel\n}).reopenClass({\n    modelClass: ExternalContactModel\n});\n","import FieldConfig from '../field-config';\nimport GroupModel from '../../models/group';\n\nexport default FieldConfig.extend({\n    modelClass: GroupModel\n}).reopenClass({\n    modelClass: GroupModel\n});\n","import FieldConfig from '../field-config';\nimport OrgModel from '../../models/org';\n\nexport default FieldConfig.extend({\n    modelClass: OrgModel\n}).reopenClass({\n    modelClass: OrgModel\n});\n","import FieldConfig from '../field-config';\nimport PersonModel from '../../models/person';\n\nexport default FieldConfig.extend({\n    modelClass: PersonModel\n}).reopenClass({\n    modelClass: PersonModel\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport FieldSection from './field-section';\n\nexport const KEY_BLACKLIST = [\n    'id',\n    '_id',\n    'guid',\n    'store',\n    'data',\n    'currentState',\n    'name',\n    'type',\n    'group',\n    'title',\n    'department',\n    'phone',\n    'email',\n    'description',\n    'organization'\n];\nconst GROUP_BLACKLIST = [...KEY_BLACKLIST, 'expression', 'groupType'];\nconst ORG_BLACKLIST = [...KEY_BLACKLIST, 'orgPreferences', 'shortName'];\nconst PROFILE_BLACKLIST = [\n    ...KEY_BLACKLIST,\n    'activities',\n    'profile',\n    'emptySections',\n    'fieldSections',\n    'emptyWriteableSections'\n];\n\nconst FieldConfig = Ember.Object.extend({\n    intl: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    id: Ember.computed.alias('_id'),\n\n    _id: null,\n    orgId: null,\n    entityType: null,\n    version: null,\n    sections: [],\n\n    _initModelWithType: function () {\n        const type = this.get('entityType');\n        const modelClass = this.modelClass;\n\n        let blacklist;\n        switch (type) {\n            case 'person':\n                blacklist = [...PROFILE_BLACKLIST];\n                break;\n            case 'org':\n                blacklist = [...ORG_BLACKLIST];\n                break;\n            case 'group':\n                blacklist = [...GROUP_BLACKLIST];\n                break;\n            case 'externalContact':\n            default:\n                blacklist = [...KEY_BLACKLIST];\n                break;\n        }\n\n        let fields = {};\n\n        this.get('sections').forEach(function (section) {\n            if (!Ember.A(blacklist).includes(section.key)) {\n                fields[section.key] = DS.attr();\n            }\n        });\n\n        modelClass\n            .reopenClass({\n                fieldConfig: this\n            })\n            .reopen(fields, {\n                fieldConfig: this\n            });\n\n        if (type === 'group') {\n            var allowedValues = this.getFieldByKey('general.groupType').get('params.allowedValues') || [];\n            allowedValues = allowedValues.filter(value => {\n                return value !== 'purecloud.distributionGroups';\n            });\n            this.set('groupTypes', allowedValues);\n        }\n    },\n\n    unknownProperty: function (property) {\n        var sections = this.get('sections');\n\n        if (_.map(sections, 'key').indexOf(property) > -1) {\n            return this.getSectionByKey(property);\n        }\n\n        return this._super();\n    },\n\n    splitFieldPath: function (path) {\n        var split = path.replace(/^\\w+\\.\\s/gi, '').split('.');\n        return {\n            sectionKey: split[0],\n            fieldKey: split[1]\n        };\n    },\n\n    getSectionByKey: function (key) {\n        return this.sections.findBy('key', key);\n    },\n\n    getFieldByKey: function (key) {\n        var splitField = this.splitFieldPath(key);\n        var section = this.getSectionByKey(splitField.sectionKey);\n        if (splitField.fieldKey && section) {\n            return section.getFieldByKey(splitField.fieldKey);\n        }\n\n        return undefined;\n    },\n\n    getFieldListByType: function (type) {\n        var fieldList = this.sections\n            .map(function (section) {\n                return section.getFieldsByType(type);\n            })\n            .filter(function (field) {\n                return field !== undefined && field.length > 0;\n            });\n\n        return _.flatten(fieldList);\n    },\n\n    getFieldsByType: function () {\n        this.getFieldListByType.apply(this, arguments);\n    },\n\n    getAllowedValues: function (fieldPath) {\n        return this.getFieldByKey(fieldPath).params.allowedValues;\n    },\n\n    isFieldRepeatable: function (fieldPath) {\n        var field = this.getFieldByKey(fieldPath);\n\n        if (field) {\n            return field.repeatable;\n        }\n\n        return false;\n    },\n\n    isFieldReference: function (fieldPath) {\n        var field = this.getFieldByKey(fieldPath);\n\n        if (field) {\n            return field.type === 'reference';\n        }\n\n        return false;\n    },\n\n    isFieldChoice: function (fieldPath) {\n        return this.getFieldByKey(fieldPath).type === 'select';\n    },\n\n    groupFieldConfig: Ember.computed(function () {\n        return this.getFieldConfig('group', Ember.getOwner(this));\n    }),\n\n    personFieldConfig: Ember.computed(function () {\n        return this.getFieldConfig('person', Ember.getOwner(this));\n    })\n});\n\nvar extra = {\n    getFieldConfig: function (type, owner) {\n        return owner.lookup('field-config:' + type);\n    }\n};\n\nFieldConfig.reopenClass({\n    createFieldConfig: function (attributes, container) {\n        // Ensure that sections are the proper object\n        attributes.sections = attributes.sections.map(function (section) {\n            return FieldSection.create(section);\n        });\n\n        var instance = container.lookup('field-config:' + attributes.entityType);\n        if (instance) {\n            instance.setProperties(attributes);\n\n            instance.sections.forEach(function (section) {\n                section.set('fieldConfig', instance);\n            });\n\n            instance._initModelWithType();\n\n            return instance;\n        }\n        Ember.Logger.warn('Unknown field-config type:', { type: attributes.entityType });\n    }\n})\n    .reopenClass(extra)\n    .reopen(extra);\n\nexport default FieldConfig;\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default Ember.Object.extend({\n    entity: null,\n    field: null,\n\n    entries: [],\n\n    attachComputedEntries: Ember.on('init', function () {\n        var fieldPath = this.get('field').getFieldPath();\n        if (typeof fieldPath === 'string') {\n            fieldPath = fieldPath.trim();\n\n            var boundTo = `entity.${fieldPath}`;\n            var boundToEach = `entity.${fieldPath}.[]`;\n\n            Ember.defineProperty(this, 'entries', Ember.computed(boundTo, boundToEach, this.getEntriesFromEntity));\n        }\n    }),\n\n    fieldPath: Ember.computed('field', function () {\n        return this.get('field').getFieldPath();\n    }),\n\n    fieldPathClass: Ember.computed('fieldPath', function () {\n        var fieldPath = this.get('fieldPath');\n        return fieldPath.replace(/\\./gi, '-');\n    }),\n\n    isEmpty: Ember.computed('field', 'entries', 'entries.[]', function () {\n        return this.isFieldEmpty(this.get('field'), this.get('entries'));\n    }),\n\n    writeable: Ember.computed('entity.readWritePermissions', 'entries.[]', function () {\n        var path = this.get('field').getFieldPath();\n        var readWritePermissions = this.get('entity.readWritePermissions');\n        var promise = Ember.RSVP.resolve(true);\n\n        if (this.get('entity.type') !== 'group') {\n            promise = new Ember.RSVP.Promise(function (resolve) {\n                readWritePermissions.then(function (permissions) {\n                    resolve(_.includes(permissions.write, path));\n                });\n            });\n        }\n\n        return DS.PromiseObject.create({\n            promise: promise\n        });\n    }),\n\n    getEntriesFromEntity: function () {\n        var path = this.get('field').getFieldPath();\n        var value = this.get('entity').getFieldValue(path);\n        if (value === undefined) {\n            return [];\n        }\n\n        return value;\n    },\n\n    isFieldEmpty: function (field, entry) {\n        if (entry === undefined) {\n            return true;\n        }\n\n        if (field.repeatable) {\n            return _.isEmpty(entry) || entry.length <= 0;\n        } else {\n            return !(entry && entry.value);\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport Field from './field';\n\nvar FieldSection = Ember.Object.extend({\n    intl: Ember.computed.reads('fieldConfig.intl'),\n    application: Ember.computed.reads('fieldConfig.application'),\n\n    fieldConfig: null,\n\n    key: null,\n    state: null,\n    instructionText: null,\n    fieldList: [],\n\n    getFieldByKey: function (key) {\n        return this.fieldList.findBy('key', key);\n    },\n\n    getFieldsByType: function (type) {\n        return this.fieldList.filterBy('type', type);\n    },\n\n    getEntityType: function () {\n        return this.fieldConfig.entityType;\n    },\n\n    getI18nKey: function () {\n        var type = this.getEntityType();\n        return `${type}_${this.key}`;\n    },\n\n    unknownProperty: function (property) {\n        var fieldList = this.get('fieldList');\n\n        if (_.map(fieldList, 'key').indexOf(property) > -1) {\n            return this.getFieldByKey(property);\n        }\n\n        return null;\n    },\n\n    sectionName: Ember.computed(function () {\n        const intl = this.get('intl');\n        const key = this.getI18nKey();\n        const serverKey = `server_translations.${key}`;\n        if (!intl.exists(serverKey)) {\n            return key;\n        }\n        return intl.t(serverKey, null, true).toString();\n    })\n});\n\nFieldSection.reopenClass({\n    create: function (attributes) {\n        attributes.fieldList = attributes.fieldList\n            .filter(field => {\n                return field.state !== 'deleted';\n            })\n            .map(field => {\n                return Field.create(field);\n            });\n\n        var instance = this._super(attributes);\n        instance.fieldList.forEach(function (field) {\n            field.section = instance;\n        });\n\n        return instance;\n    }\n});\n\nexport default FieldSection;\n","/* global requirejs */\n\nimport Ember from 'ember';\n\nvar Field = Ember.Object.extend({\n    intl: Ember.computed.reads('section.intl'),\n    application: Ember.computed.reads('section.application'),\n\n    section: null,\n\n    key: null,\n    type: null,\n    labelKeys: [],\n    instructionText: '',\n    customLabels: false,\n    repeatable: false,\n    params: null,\n\n    maxRepeat: Ember.computed.reads('params.maxRepeat'),\n\n    i18nLabel: Ember.computed(function () {\n        let intl = this.get('intl');\n        let key = `server_translations.${this.getI18nKey()}`;\n        let labelKey = `server_translations.${this.getI18nLabelKey()}`;\n        if (intl.exists(labelKey)) {\n            return intl.t(labelKey).toString();\n        }\n        if (intl.exists(key)) {\n            return intl.t(key).toString();\n        }\n        return this.get('key');\n    }),\n\n    i18nKey: Ember.computed(function () {\n        return this.getI18nKey();\n    }),\n\n    elemId: Ember.computed(function () {\n        return `#${this.get('key')}`;\n    }),\n\n    fieldPath: Ember.computed(function () {\n        return this.getFieldPath();\n    }),\n\n    fieldPathClass: Ember.computed(function () {\n        let path = this.getFieldPath();\n        return path.replace(/\\./gi, '-');\n    }),\n\n    componentName: Ember.computed('type', function () {\n        var type = this.get('type');\n        return `entity-fields/${type}-field`;\n    }),\n\n    getI18nKey() {\n        return `${this.section.getI18nKey()}_${this.key}`;\n    },\n\n    getI18nLabelKey() {\n        return `${this.getI18nKey()}_labelKey_${this.key}`;\n    },\n\n    getFieldPath() {\n        return this.section.key + '.' + this.key;\n    },\n\n    getEntityType() {\n        return this.section.getEntityType();\n    },\n\n    cleanForEntity(entity) {\n        Ember.Logger.warn('DEPRECATION: Stop using this method please...it breaks a lot of rules...');\n\n        var name = this.get('componentName');\n        if (requirejs._eak_seen[name]) {\n            var module = requirejs(name);\n            if (module.cleanFieldForEntity) {\n                return module.cleanFieldForEntity(entity, this, entity.getFieldValue(this.getFieldPath()));\n            }\n        }\n    },\n\n    component: Ember.computed(function () {\n        Ember.Logger.warn(\n            'DEPRECATION: Use component helper and `field.componentName` property to use field components'\n        );\n\n        // We have fields with hyphens (multiline-text). Make sure they get Ember-ized.\n        var className = this.get('componentName');\n\n        var factory = this.get('application.container').lookupFactory('component:' + className);\n        if (factory) {\n            return factory;\n        }\n\n        Ember.Logger.warn('Could not find view for:', { className });\n\n        return this.get('application.container').lookupFactory('component:text-field');\n    })\n});\n\nexport default Field;\n","export default {\n    time: {\n        hhmmss: {\n            hour: 'numeric',\n            minute: 'numeric',\n            second: 'numeric'\n        }\n    },\n    date: {\n        hhmmss: {\n            hour: 'numeric',\n            minute: 'numeric',\n            second: 'numeric'\n        }\n    },\n    number: {\n        EUR: {\n            style: 'currency',\n            currency: 'EUR',\n            minimumFractionDigits: 2,\n            maximumFractionDigits: 2\n        },\n        USD: {\n            style: 'currency',\n            currency: 'USD',\n            minimumFractionDigits: 2,\n            maximumFractionDigits: 2\n        }\n    }\n};\n","import Ember from 'ember';\n\nconst { Mixin, RSVP } = Ember;\n\nconst DEFAULT_PARAMETERS = {\n    offset: 0,\n    limit: 15\n};\n\nexport default Mixin.create({\n    findGroupMembership(id, parameters = DEFAULT_PARAMETERS) {\n        const label = 'Adapter#findGroupMembership';\n        const adapter = this.adapterFor('group');\n\n        const serializer = this.serializerFor('person');\n        const modelClass = this.modelFor('person');\n        let promise = adapter.findGroupMembership(id, parameters);\n        promise = RSVP.Promise.resolve(promise, label);\n\n        return promise.then(\n            payload => {\n                payload = serializer.normalizeArrayResponse(this, modelClass, payload, null, 'findMany');\n                const records = this.push(payload);\n                return records;\n            },\n            null,\n            'Store#findGroupMembership'\n        );\n    }\n});\n","import Ember from 'ember';\nimport moment from '../utils/dates';\n\nconst activityMessages = {\n    sms: 'components.recentContact.sms',\n    voice: 'components.recentContact.voice',\n    email: 'components.recentContact.email',\n    chat: 'components.recentContact.chat'\n};\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params) {\n        const activity = params[0];\n        const message = activityMessages[activity.method];\n        const date = moment(activity.ts * 1000);\n        return this.get('intl').lookup(message, { date: date.format('L') });\n    }\n});\n","define(\"connections-ui/helpers/abs\", [\"exports\", \"ember-math-helpers/helpers/abs\"], function (_exports, _abs) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"abs\", {\n    enumerable: true,\n    get: function get() {\n      return _abs.abs;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _abs.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/acos\", [\"exports\", \"ember-math-helpers/helpers/acos\"], function (_exports, _acos) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"acos\", {\n    enumerable: true,\n    get: function get() {\n      return _acos.acos;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _acos.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/acosh\", [\"exports\", \"ember-math-helpers/helpers/acosh\"], function (_exports, _acosh) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"acosh\", {\n    enumerable: true,\n    get: function get() {\n      return _acosh.acosh;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _acosh.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/add\", [\"exports\", \"ember-math-helpers/helpers/add\"], function (_exports, _add) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"add\", {\n    enumerable: true,\n    get: function get() {\n      return _add.add;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _add.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    addressformat: Ember.inject.service(),\n\n    compute: function (params) {\n        if (!params || params.length !== 1) {\n            Ember.Logger.warn('addressformat helper called with bad arguments');\n            return '';\n        }\n        return this.get('addressformat').formatOrLookupAddressForDisplay(params[0]);\n    }\n});\n","define(\"connections-ui/helpers/and\", [\"exports\", \"ember-truth-helpers/helpers/and\"], function (_exports, _and) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"and\", {\n    enumerable: true,\n    get: function get() {\n      return _and.and;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _and.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport config from '../config/environment';\nimport { shaRegExp, versionRegExp } from 'ember-cli-app-version/utils/regexp';\n\nconst {\n  APP: {\n    version\n  }\n} = config;\n\nexport function appVersion(_, hash = {}) {\n  if (hash.hideSha) {\n    return version.match(versionRegExp)[0];\n  }\n\n  if (hash.hideVersion) {\n    return version.match(shaRegExp)[0];\n  }\n\n  return version;\n}\n\nexport default Ember.Helper.helper(appVersion);\n","define(\"connections-ui/helpers/array-contains\", [\"exports\", \"ember-array-contains-helper/helpers/array-contains\"], function (_exports, _arrayContains) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"arrayContains\", {\n    enumerable: true,\n    get: function get() {\n      return _arrayContains.arrayContains;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _arrayContains.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/asin\", [\"exports\", \"ember-math-helpers/helpers/asin\"], function (_exports, _asin) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"asin\", {\n    enumerable: true,\n    get: function get() {\n      return _asin.asin;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _asin.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/asinh\", [\"exports\", \"ember-math-helpers/helpers/asinh\"], function (_exports, _asinh) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"asinh\", {\n    enumerable: true,\n    get: function get() {\n      return _asinh.asinh;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _asinh.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/atan\", [\"exports\", \"ember-math-helpers/helpers/atan\"], function (_exports, _atan) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"atan\", {\n    enumerable: true,\n    get: function get() {\n      return _atan.atan;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _atan.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/atan2\", [\"exports\", \"ember-math-helpers/helpers/atan2\"], function (_exports, _atan) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"atan2\", {\n    enumerable: true,\n    get: function get() {\n      return _atan.atan2;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _atan.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/atanh\", [\"exports\", \"ember-math-helpers/helpers/atanh\"], function (_exports, _atanh) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"atanh\", {\n    enumerable: true,\n    get: function get() {\n      return _atanh.atanh;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _atanh.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/await\", [\"exports\", \"ember-promise-helpers/helpers/await\"], function (_exports, _await) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _await.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nexport default Ember.Helper.extend({\n    compute([person, promiseArray]) {\n        return DS.PromiseObject.create({\n            promise: promiseArray.then(sequenceList => {\n                const people = sequenceList.filter(listItem => listItem.person === person);\n                return people.get('length') === 0;\n            })\n        });\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    session: Ember.inject.service(),\n    permissionsService: Ember.inject.service('permissions'),\n\n    permissions: null,\n\n    compute([entity, fieldPath]) {\n        if (!entity || !fieldPath) {\n            return false;\n        }\n\n        const permissionsService = this.get('permissionsService');\n        return permissionsService.get('canEditProfiles');\n    }\n});\n","define(\"connections-ui/helpers/cancel-all\", [\"exports\", \"ember-concurrency/helpers/cancel-all\"], function (_exports, _cancelAll) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"cancelAll\", {\n    enumerable: true,\n    get: function get() {\n      return _cancelAll.cancelAll;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _cancelAll.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/cbrt\", [\"exports\", \"ember-math-helpers/helpers/cbrt\"], function (_exports, _cbrt) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"cbrt\", {\n    enumerable: true,\n    get: function get() {\n      return _cbrt.cbrt;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _cbrt.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/ceil\", [\"exports\", \"ember-math-helpers/helpers/ceil\"], function (_exports, _ceil) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"ceil\", {\n    enumerable: true,\n    get: function get() {\n      return _ceil.ceil;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _ceil.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function (params) {\n    const time = params[0];\n    return time.format('LLLL');\n});\n","define(\"connections-ui/helpers/clz32\", [\"exports\", \"ember-math-helpers/helpers/clz32\"], function (_exports, _clz) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"clz32\", {\n    enumerable: true,\n    get: function get() {\n      return _clz.clz32;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _clz.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/cos\", [\"exports\", \"ember-math-helpers/helpers/cos\"], function (_exports, _cos) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"cos\", {\n    enumerable: true,\n    get: function get() {\n      return _cos.cos;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _cos.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/cosh\", [\"exports\", \"ember-math-helpers/helpers/cosh\"], function (_exports, _cosh) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"cosh\", {\n    enumerable: true,\n    get: function get() {\n      return _cosh.cosh;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _cosh.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { dasherize } = Ember.String;\n\nexport function cssClassify([string]) {\n    if (string) {\n        string = string.replace(/[,\\(\\)]/g, '');\n        return dasherize(string);\n    }\n    return '';\n}\n\nexport default Ember.Helper.helper(cssClassify);\n","define(\"connections-ui/helpers/dasherize\", [\"exports\", \"ember-purecloud-components/helpers/dasherize\"], function (_exports, _dasherize) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"dasherize\", {\n    enumerable: true,\n    get: function get() {\n      return _dasherize.dasherize;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _dasherize.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/div\", [\"exports\", \"ember-math-helpers/helpers/div\"], function (_exports, _div) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _div.default;\n    }\n  });\n  Object.defineProperty(_exports, \"div\", {\n    enumerable: true,\n    get: function get() {\n      return _div.div;\n    }\n  });\n});\n","define(\"connections-ui/helpers/ember-power-select-is-group\", [\"exports\", \"ember-power-select/helpers/ember-power-select-is-group\"], function (_exports, _emberPowerSelectIsGroup) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectIsGroup.default;\n    }\n  });\n  Object.defineProperty(_exports, \"emberPowerSelectIsGroup\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectIsGroup.emberPowerSelectIsGroup;\n    }\n  });\n});\n","define(\"connections-ui/helpers/ember-power-select-is-selected\", [\"exports\", \"ember-power-select/helpers/ember-power-select-is-selected\"], function (_exports, _emberPowerSelectIsSelected) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectIsSelected.default;\n    }\n  });\n  Object.defineProperty(_exports, \"emberPowerSelectIsSelected\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectIsSelected.emberPowerSelectIsSelected;\n    }\n  });\n});\n","define(\"connections-ui/helpers/ember-power-select-true-string-if-present\", [\"exports\", \"ember-power-select/helpers/ember-power-select-true-string-if-present\"], function (_exports, _emberPowerSelectTrueStringIfPresent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectTrueStringIfPresent.default;\n    }\n  });\n  Object.defineProperty(_exports, \"emberPowerSelectTrueStringIfPresent\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectTrueStringIfPresent.emberPowerSelectTrueStringIfPresent;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { emojifyString } from 'ember-purecloud-components/utils/emoji';\n\nconst { Handlebars, Helper } = Ember;\n\nexport default Helper.helper(function (params) {\n    let text = _.head(params);\n    if (text) {\n        text = emojifyString(Handlebars.Utils.escapeExpression(text));\n        return Ember.String.htmlSafe(text);\n    }\n    return text;\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nEmber.Handlebars.helper('highlight', function (context, options) {\n    return _.isEmpty(options.context) ? options.fn(this) : null;\n});\n","define(\"connections-ui/helpers/eq\", [\"exports\", \"ember-truth-helpers/helpers/equal\"], function (_exports, _equal) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _equal.default;\n    }\n  });\n  Object.defineProperty(_exports, \"equal\", {\n    enumerable: true,\n    get: function get() {\n      return _equal.equal;\n    }\n  });\n});\n","define(\"connections-ui/helpers/equals\", [\"exports\", \"fixtable-ember/helpers/equals\"], function (_exports, _equals) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _equals.default;\n    }\n  });\n  Object.defineProperty(_exports, \"equals\", {\n    enumerable: true,\n    get: function get() {\n      return _equals.equals;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default Ember.Helper.helper(function (params = []) {\n    return _.escape(params[0]);\n});\n","define(\"connections-ui/helpers/exp\", [\"exports\", \"ember-math-helpers/helpers/exp\"], function (_exports, _exp) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _exp.default;\n    }\n  });\n  Object.defineProperty(_exports, \"exp\", {\n    enumerable: true,\n    get: function get() {\n      return _exp.exp;\n    }\n  });\n});\n","import Ember from 'ember';\nimport escape from 'connections-ui/utils/escape';\n\nconst { Helper } = Ember;\n\nexport default Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute([text]) {\n        if (!text) {\n            text = '';\n        }\n\n        // Check for promise\n        if (typeof text !== 'string' && typeof text.then === 'function' && !text.get('content')) {\n            text.then(() => this.recompute());\n        } else if (typeof text === 'object' && typeof text.get === 'function') {\n            text = text.get('content') || '';\n        }\n\n        // Check if we've got a POJO\n        if (typeof text === 'object' && typeof text.get !== 'function') {\n            return this.get('intl')\n                .t('entity.fieldTypes.location.address', {\n                    street1: text.street1,\n                    street2: text.street2,\n                    city: text.city,\n                    state: text.state,\n                    country: text.country,\n                    zipcode: text.zipcode\n                })\n                .toString();\n        }\n        return Ember.String.htmlSafe(escape(text).replace(/\\n/g, '<br>'));\n    }\n});\n","define(\"connections-ui/helpers/expm1\", [\"exports\", \"ember-math-helpers/helpers/expm1\"], function (_exports, _expm) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _expm.default;\n    }\n  });\n  Object.defineProperty(_exports, \"expm1\", {\n    enumerable: true,\n    get: function get() {\n      return _expm.expm1;\n    }\n  });\n});\n","import Ember from 'ember';\nimport FieldConfig from '../field-config/field-config';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params, namedArgs) {\n        const facet = namedArgs.facet;\n        const facetName = facet.facetName;\n        const splitName = facetName.split('.');\n        const section = splitName[0];\n        const field = splitName[1];\n\n        if (section && field) {\n            const owner = Ember.getOwner(this);\n            let fieldObj = FieldConfig.getFieldConfig('person', owner).getSectionByKey(section).getFieldByKey(field);\n\n            if (fieldObj === undefined) {\n                const section = FieldConfig.getFieldConfig('group', owner).getSectionByKey(section);\n                if (!!section) {\n                    fieldObj = section.getFieldByKey(field);\n                } else {\n                    return field;\n                }\n            }\n\n            if (fieldObj !== undefined) {\n                const intl = this.get('intl');\n                const path = fieldObj.getFieldPath();\n                const lookupPath = path.replace(/\\./g, '_');\n                let i18nKey;\n\n                if (facet.total > 1) {\n                    i18nKey = `directedSearch_${lookupPath}_plural`;\n                } else {\n                    i18nKey = `directedSearch_${lookupPath}_singular`;\n                }\n\n                if (intl.query(i18nKey)) {\n                    return intl.lookup(i18nKey);\n                } else {\n                    return fieldObj.get('i18nLabel');\n                }\n            }\n        }\n\n        return facetName;\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params, namedArgs) {\n        const facet = namedArgs.facet;\n        let term = namedArgs.term;\n        let facetName = facet.facetName;\n        if (term && facetName === 'general.groupType') {\n            facetName = facetName.replace(/[\\. ]/g, '_');\n            term = term.replace(/[\\. ]/g, '_');\n            const intl = this.get('intl');\n            const i18nKey = ['group', facetName, 'value', term].join('_');\n            if (intl.query(i18nKey)) {\n                return intl.lookup(i18nKey);\n            }\n        }\n        return term;\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function ([arr]) {\n    if (arr && arr.length) {\n        return arr[0];\n    }\n\n    return {};\n});\n","import Ember from 'ember';\nimport { emojifyString } from 'ember-purecloud-components/utils/emoji';\n\nconst _flairRegEx = new RegExp(/^(flair:)(#[0-9a-f]{3}:|#[0-9a-f]{6}:){0,1}(.+)/i); // flair:[#hex:]message\n\nexport default Ember.Helper.extend({\n    compute(params, namedArgs) {\n        const status = params[0];\n        const hideIfText = namedArgs.hideIfText;\n\n        let color = '#aaaaaa';\n\n        let match = _flairRegEx.exec(status);\n        if (match) {\n            if (match[2]) {\n                color = match[2].substring(0, match[2].length - 1);\n            }\n            let emojiText = emojifyString(Ember.Handlebars.Utils.escapeExpression(match[3]));\n            return `<div class=\"flair\" style=\"background-color: ${color}\"> ${emojiText} </div>`;\n        } else if (hideIfText) {\n            return '';\n        } else {\n            return emojifyString(Ember.Handlebars.Utils.escapeExpression(status));\n        }\n    }\n});\n","define(\"connections-ui/helpers/floor\", [\"exports\", \"ember-math-helpers/helpers/floor\"], function (_exports, _floor) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _floor.default;\n    }\n  });\n  Object.defineProperty(_exports, \"floor\", {\n    enumerable: true,\n    get: function get() {\n      return _floor.floor;\n    }\n  });\n});\n","define(\"connections-ui/helpers/format-date\", [\"exports\", \"ember-intl/helpers/format-date\"], function (_exports, _formatDate) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatDate.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    compute: function (params) {\n        let bytes = params[0];\n        let units = ['bytes', 'KB', 'MB', 'GB', 'TB'];\n        for (var i = units.length - 1; i >= 0; i--) {\n            var converted = bytes / Math.pow(1000, i);\n            if (converted >= 1 && converted < 1000) {\n                var decimals = i === 0 ? 0 : 1;\n                return `${converted.toFixed(decimals)} ${units[i]}`;\n            }\n        }\n    }\n});\n","define(\"connections-ui/helpers/format-html-message\", [\"exports\", \"ember-intl/helpers/format-html-message\"], function (_exports, _formatHtmlMessage) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatHtmlMessage.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function (params) {\n    const link = params[0];\n    return link.replace('http://', '').replace('https://', '').replace('www.', '');\n});\n","define(\"connections-ui/helpers/format-message\", [\"exports\", \"ember-intl/helpers/format-message\"], function (_exports, _formatMessage) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatMessage.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/format-number\", [\"exports\", \"ember-intl/helpers/format-number\"], function (_exports, _formatNumber) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatNumber.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/format-relative\", [\"exports\", \"ember-intl/helpers/format-relative\"], function (_exports, _formatRelative) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatRelative.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/format-time\", [\"exports\", \"ember-intl/helpers/format-time\"], function (_exports, _formatTime) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatTime.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/fround\", [\"exports\", \"ember-math-helpers/helpers/fround\"], function (_exports, _fround) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fround.default;\n    }\n  });\n  Object.defineProperty(_exports, \"fround\", {\n    enumerable: true,\n    get: function get() {\n      return _fround.fround;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst fullNameHelper = Ember.Helper.extend({\n    intl: Ember.inject.service(),\n    names: Ember.inject.service(),\n\n    compute(params) {\n        const externalProfile = params[0];\n        if (externalProfile) {\n            return this.get('names').fullName(externalProfile) || Ember.get(externalProfile, 'firstName');\n        }\n        return this.get('intl').lookup('purecloud.unknown');\n    }\n});\n\nexport default fullNameHelper;\n","define(\"connections-ui/helpers/gcd\", [\"exports\", \"ember-math-helpers/helpers/gcd\"], function (_exports, _gcd) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _gcd.default;\n    }\n  });\n  Object.defineProperty(_exports, \"gcd\", {\n    enumerable: true,\n    get: function get() {\n      return _gcd.gcd;\n    }\n  });\n});\n","define(\"connections-ui/helpers/get-select-options\", [\"exports\", \"fixtable-ember/helpers/get-select-options\"], function (_exports, _getSelectOptions) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _getSelectOptions.default;\n    }\n  });\n  Object.defineProperty(_exports, \"getSelectOptions\", {\n    enumerable: true,\n    get: function get() {\n      return _getSelectOptions.getSelectOptions;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    session: Ember.inject.service(),\n    store: Ember.inject.service(),\n    name: '',\n    compute(params) {\n        const groupId = params[0];\n        if (!this.get('name')) {\n            if (this.get('store').hasRecordForId('group', groupId)) {\n                let group = this.get('store').recordForId('group', groupId);\n                if (group && group.get('name')) {\n                    this.set('name', group.get('name'));\n                    this.recompute();\n                }\n            } else {\n                this.get('store')\n                    .find('group', groupId)\n                    .then(group => {\n                        this.set('name', group.get('name'));\n                        this.recompute();\n                    });\n            }\n        }\n\n        return this.get('name');\n    }\n});\n","define(\"connections-ui/helpers/gt\", [\"exports\", \"ember-truth-helpers/helpers/gt\"], function (_exports, _gt) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _gt.default;\n    }\n  });\n  Object.defineProperty(_exports, \"gt\", {\n    enumerable: true,\n    get: function get() {\n      return _gt.gt;\n    }\n  });\n});\n","define(\"connections-ui/helpers/gte\", [\"exports\", \"ember-truth-helpers/helpers/gte\"], function (_exports, _gte) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _gte.default;\n    }\n  });\n  Object.defineProperty(_exports, \"gte\", {\n    enumerable: true,\n    get: function get() {\n      return _gte.gte;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    compute(params) {\n        const group = params[0];\n        return !!Ember.get(group, 'contactInfo.groupNumber.firstObject.rel.e164');\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(params => {\n    const type = params[0];\n\n    switch (type) {\n        case 'faq':\n            return 'faq';\n        case 'article':\n            return 'article';\n        case 'glossary':\n            return 'glossary';\n        case 'video':\n            return 'video-camera';\n        case 'post':\n            return 'post';\n        case 'releasenote':\n            return 'releasenote';\n        case 'page':\n            return 'page';\n        default:\n            return '';\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function (params = []) {\n    return Ember.String.htmlSafe(params[0]);\n});\n","define(\"connections-ui/helpers/hypot\", [\"exports\", \"ember-math-helpers/helpers/hypot\"], function (_exports, _hypot) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _hypot.default;\n    }\n  });\n  Object.defineProperty(_exports, \"hypot\", {\n    enumerable: true,\n    get: function get() {\n      return _hypot.hypot;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst activityIcons = {\n    sms: 'ion-iphone',\n    voice: 'ion-ios-telephone',\n    email: 'ion-email',\n    chat: 'ion-chatboxes'\n};\n\nexport default Ember.Helper.helper(params => {\n    const activity = params[0];\n    return Ember.String.htmlSafe(`<i class='${activityIcons[activity.method]}'></i>`);\n});\n","define(\"connections-ui/helpers/ignore-children\", [\"exports\", \"ember-ignore-children-helper/helpers/ignore-children\"], function (_exports, _ignoreChildren) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _ignoreChildren.default;\n    }\n  });\n  Object.defineProperty(_exports, \"ignoreChildren\", {\n    enumerable: true,\n    get: function get() {\n      return _ignoreChildren.ignoreChildren;\n    }\n  });\n});\n","define(\"connections-ui/helpers/imul\", [\"exports\", \"ember-math-helpers/helpers/imul\"], function (_exports, _imul) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _imul.default;\n    }\n  });\n  Object.defineProperty(_exports, \"imul\", {\n    enumerable: true,\n    get: function get() {\n      return _imul.imul;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function (params) {\n    const string = typeof params[0] === 'undefined' ? '' : params[0];\n    return string.charAt(0);\n});\n","define(\"connections-ui/helpers/intl-get\", [\"exports\", \"ember-intl/helpers/intl-get\"], function (_exports, _intlGet) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _intlGet.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-after\", [\"exports\", \"ember-moment/helpers/is-after\"], function (_exports, _isAfter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isAfter.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-array\", [\"exports\", \"ember-truth-helpers/helpers/is-array\"], function (_exports, _isArray) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isArray.default;\n    }\n  });\n  Object.defineProperty(_exports, \"isArray\", {\n    enumerable: true,\n    get: function get() {\n      return _isArray.isArray;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-before\", [\"exports\", \"ember-moment/helpers/is-before\"], function (_exports, _isBefore) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isBefore.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-between\", [\"exports\", \"ember-moment/helpers/is-between\"], function (_exports, _isBetween) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isBetween.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-empty\", [\"exports\", \"ember-truth-helpers/helpers/is-empty\"], function (_exports, _isEmpty) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isEmpty.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { Helper } = Ember;\n\nexport default Helper.helper(function (params) {\n    const left = params[0];\n    const right = params[1];\n    return left === right;\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default Ember.Helper.helper(function (params) {\n    const user = params[0];\n    const entity = params[1];\n    const favorites = user.get('_favorites');\n    const isFavorite = !!favorites && !_.isEmpty(favorites.findBy('id', entity.get('id')));\n\n    if (isFavorite) {\n        return 'favorite';\n    } else {\n        return '';\n    }\n});\n","define(\"connections-ui/helpers/is-fulfilled\", [\"exports\", \"ember-promise-helpers/helpers/is-fulfilled\"], function (_exports, _isFulfilled) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isFulfilled.default;\n    }\n  });\n  Object.defineProperty(_exports, \"isFulfilled\", {\n    enumerable: true,\n    get: function get() {\n      return _isFulfilled.isFulfilled;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-pending\", [\"exports\", \"ember-promise-helpers/helpers/is-pending\"], function (_exports, _isPending) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isPending.default;\n    }\n  });\n  Object.defineProperty(_exports, \"isPending\", {\n    enumerable: true,\n    get: function get() {\n      return _isPending.isPending;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-rejected\", [\"exports\", \"ember-promise-helpers/helpers/is-rejected\"], function (_exports, _isRejected) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isRejected.default;\n    }\n  });\n  Object.defineProperty(_exports, \"isRejected\", {\n    enumerable: true,\n    get: function get() {\n      return _isRejected.isRejected;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-same-or-after\", [\"exports\", \"ember-moment/helpers/is-same-or-after\"], function (_exports, _isSameOrAfter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isSameOrAfter.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-same-or-before\", [\"exports\", \"ember-moment/helpers/is-same-or-before\"], function (_exports, _isSameOrBefore) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isSameOrBefore.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-same\", [\"exports\", \"ember-moment/helpers/is-same\"], function (_exports, _isSame) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isSame.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function ([routes, station]) {\n    if (!routes || !station) {\n        return false;\n    }\n    const routeIds = routes.filterBy('isStation').mapBy('station.id');\n    return routeIds.indexOf(station.get('id')) > -1;\n});\n","import Ember from 'ember';\n\nexport function joinStrings(params /*, hash*/) {\n    const [joinCharacter, ...rest] = params || [];\n    return rest.join(joinCharacter);\n}\n\nexport default Ember.Helper.helper(joinStrings);\n","define(\"connections-ui/helpers/l\", [\"exports\", \"ember-intl/helpers/l\"], function (_exports, _l) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _l.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/lcm\", [\"exports\", \"ember-math-helpers/helpers/lcm\"], function (_exports, _lcm) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _lcm.default;\n    }\n  });\n  Object.defineProperty(_exports, \"lcm\", {\n    enumerable: true,\n    get: function get() {\n      return _lcm.lcm;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    presence: Ember.inject.service(),\n\n    compute(params) {\n        return this.get('presence').localizePresence(...params);\n    }\n});\n","define(\"connections-ui/helpers/log-e\", [\"exports\", \"ember-math-helpers/helpers/log-e\"], function (_exports, _logE) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _logE.default;\n    }\n  });\n  Object.defineProperty(_exports, \"logE\", {\n    enumerable: true,\n    get: function get() {\n      return _logE.logE;\n    }\n  });\n});\n","define(\"connections-ui/helpers/log10\", [\"exports\", \"ember-math-helpers/helpers/log10\"], function (_exports, _log) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _log.default;\n    }\n  });\n  Object.defineProperty(_exports, \"log10\", {\n    enumerable: true,\n    get: function get() {\n      return _log.log10;\n    }\n  });\n});\n","define(\"connections-ui/helpers/log1p\", [\"exports\", \"ember-math-helpers/helpers/log1p\"], function (_exports, _log1p) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _log1p.default;\n    }\n  });\n  Object.defineProperty(_exports, \"log1p\", {\n    enumerable: true,\n    get: function get() {\n      return _log1p.log1p;\n    }\n  });\n});\n","define(\"connections-ui/helpers/log2\", [\"exports\", \"ember-math-helpers/helpers/log2\"], function (_exports, _log) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _log.default;\n    }\n  });\n  Object.defineProperty(_exports, \"log2\", {\n    enumerable: true,\n    get: function get() {\n      return _log.log2;\n    }\n  });\n});\n","define(\"connections-ui/helpers/lt\", [\"exports\", \"ember-truth-helpers/helpers/lt\"], function (_exports, _lt) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _lt.default;\n    }\n  });\n  Object.defineProperty(_exports, \"lt\", {\n    enumerable: true,\n    get: function get() {\n      return _lt.lt;\n    }\n  });\n});\n","define(\"connections-ui/helpers/lte\", [\"exports\", \"ember-truth-helpers/helpers/lte\"], function (_exports, _lte) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _lte.default;\n    }\n  });\n  Object.defineProperty(_exports, \"lte\", {\n    enumerable: true,\n    get: function get() {\n      return _lte.lte;\n    }\n  });\n});\n","define(\"connections-ui/helpers/max\", [\"exports\", \"ember-math-helpers/helpers/max\"], function (_exports, _max) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _max.default;\n    }\n  });\n  Object.defineProperty(_exports, \"max\", {\n    enumerable: true,\n    get: function get() {\n      return _max.max;\n    }\n  });\n});\n","import Ember from 'ember';\nimport moment from 'moment';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n    compute(date) {\n        let locale = this.get('intl.isoLocale');\n        if (moment(date, 'YYYY-MM-DD').isSame(new Date(), 'day')) {\n            return `TODAY: ${moment(date, 'YYYY-MM-DD').locale(locale).format('dddd MMMM DD')}`;\n        } else {\n            return moment(date, 'YYYY-MM-DD').locale(locale).format('MMMM DD');\n        }\n    }\n});\n","define(\"connections-ui/helpers/min\", [\"exports\", \"ember-math-helpers/helpers/min\"], function (_exports, _min) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _min.default;\n    }\n  });\n  Object.defineProperty(_exports, \"min\", {\n    enumerable: true,\n    get: function get() {\n      return _min.min;\n    }\n  });\n});\n","define(\"connections-ui/helpers/mod\", [\"exports\", \"ember-math-helpers/helpers/mod\"], function (_exports, _mod) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _mod.default;\n    }\n  });\n  Object.defineProperty(_exports, \"mod\", {\n    enumerable: true,\n    get: function get() {\n      return _mod.mod;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-add\", [\"exports\", \"ember-moment/helpers/moment-add\"], function (_exports, _momentAdd) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentAdd.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-calendar\", [\"exports\", \"ember-moment/helpers/moment-calendar\"], function (_exports, _momentCalendar) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentCalendar.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-diff\", [\"exports\", \"ember-moment/helpers/moment-diff\"], function (_exports, _momentDiff) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentDiff.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-duration\", [\"exports\", \"ember-moment/helpers/moment-duration\"], function (_exports, _momentDuration) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentDuration.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-format\", [\"exports\", \"ember-moment/helpers/moment-format\"], function (_exports, _momentFormat) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentFormat.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-from-now\", [\"exports\", \"ember-moment/helpers/moment-from-now\"], function (_exports, _momentFromNow) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentFromNow.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-from\", [\"exports\", \"ember-moment/helpers/moment-from\"], function (_exports, _momentFrom) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentFrom.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-subtract\", [\"exports\", \"ember-moment/helpers/moment-subtract\"], function (_exports, _momentSubtract) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentSubtract.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-to-date\", [\"exports\", \"ember-moment/helpers/moment-to-date\"], function (_exports, _momentToDate) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentToDate.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-to-now\", [\"exports\", \"ember-moment/helpers/moment-to-now\"], function (_exports, _momentToNow) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentToNow.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-to\", [\"exports\", \"ember-moment/helpers/moment-to\"], function (_exports, _momentTo) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentTo.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-unix\", [\"exports\", \"ember-moment/helpers/unix\"], function (_exports, _unix) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _unix.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment\", [\"exports\", \"ember-moment/helpers/moment\"], function (_exports, _moment) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _moment.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/mult\", [\"exports\", \"ember-math-helpers/helpers/mult\"], function (_exports, _mult) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _mult.default;\n    }\n  });\n  Object.defineProperty(_exports, \"mult\", {\n    enumerable: true,\n    get: function get() {\n      return _mult.mult;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { markdownToHtml } from '../utils/markdown';\n\nexport default Ember.Helper.helper(function (params) {\n    if (params && params[0]) {\n        return Ember.String.htmlSafe(markdownToHtml(params[0]));\n    }\n    return '';\n});\n","define(\"connections-ui/helpers/not-eq\", [\"exports\", \"ember-truth-helpers/helpers/not-equal\"], function (_exports, _notEqual) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _notEqual.default;\n    }\n  });\n  Object.defineProperty(_exports, \"notEq\", {\n    enumerable: true,\n    get: function get() {\n      return _notEqual.notEq;\n    }\n  });\n});\n","define(\"connections-ui/helpers/not\", [\"exports\", \"ember-truth-helpers/helpers/not\"], function (_exports, _not) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _not.default;\n    }\n  });\n  Object.defineProperty(_exports, \"not\", {\n    enumerable: true,\n    get: function get() {\n      return _not.not;\n    }\n  });\n});\n","define(\"connections-ui/helpers/now\", [\"exports\", \"ember-moment/helpers/now\"], function (_exports, _now) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _now.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/or\", [\"exports\", \"ember-truth-helpers/helpers/or\"], function (_exports, _or) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _or.default;\n    }\n  });\n  Object.defineProperty(_exports, \"or\", {\n    enumerable: true,\n    get: function get() {\n      return _or.or;\n    }\n  });\n});\n","define(\"connections-ui/helpers/perform\", [\"exports\", \"ember-concurrency/helpers/perform\"], function (_exports, _perform) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _perform.default;\n    }\n  });\n  Object.defineProperty(_exports, \"perform\", {\n    enumerable: true,\n    get: function get() {\n      return _perform.perform;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { inject } = Ember;\n\nexport default Ember.Helper.extend({\n    phoneIntegrations: inject.service(),\n\n    onIntegrationConfigChange: Ember.observer('phoneIntegrations.integrationConfigs.[]', function () {\n        this.recompute();\n    }),\n\n    compute([person]) {\n        if (person.integrationContactInfo === undefined) {\n            return [];\n        }\n        const phoneIntegrations = this.get('phoneIntegrations');\n        const integrationConfigs = phoneIntegrations.get('integrationConfigs');\n        return integrationConfigs.filter(\n            config =>\n                !!person.integrationContactInfo(config.key) &&\n                (config.includeBadge === undefined ||\n                    (config.includeBadge !== undefined && config.includeBadge === true))\n        );\n    }\n});\n","import Ember from 'ember';\nimport { pluralize } from 'ember-inflector';\n\nexport default Ember.Helper.helper(function (params) {\n    const count = params[1] || 1;\n    const text = params[0];\n    if (count !== 1) {\n        return pluralize(text);\n    }\n    return text;\n});\n","import pluralize from 'ember-inflector/lib/helpers/pluralize';\nexport default pluralize;\n","define(\"connections-ui/helpers/pow\", [\"exports\", \"ember-math-helpers/helpers/pow\"], function (_exports, _pow) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _pow.default;\n    }\n  });\n  Object.defineProperty(_exports, \"pow\", {\n    enumerable: true,\n    get: function get() {\n      return _pow.pow;\n    }\n  });\n});\n","define(\"connections-ui/helpers/promise-all\", [\"exports\", \"ember-promise-helpers/helpers/promise-all\"], function (_exports, _promiseAll) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _promiseAll.default;\n    }\n  });\n  Object.defineProperty(_exports, \"promiseAll\", {\n    enumerable: true,\n    get: function get() {\n      return _promiseAll.promiseAll;\n    }\n  });\n});\n","define(\"connections-ui/helpers/promise-hash\", [\"exports\", \"ember-promise-helpers/helpers/promise-hash\"], function (_exports, _promiseHash) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _promiseHash.default;\n    }\n  });\n  Object.defineProperty(_exports, \"promiseHash\", {\n    enumerable: true,\n    get: function get() {\n      return _promiseHash.promiseHash;\n    }\n  });\n});\n","define(\"connections-ui/helpers/promise-rejected-reason\", [\"exports\", \"ember-promise-helpers/helpers/promise-rejected-reason\"], function (_exports, _promiseRejectedReason) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _promiseRejectedReason.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/random\", [\"exports\", \"ember-math-helpers/helpers/random\"], function (_exports, _random) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _random.default;\n    }\n  });\n  Object.defineProperty(_exports, \"random\", {\n    enumerable: true,\n    get: function get() {\n      return _random.random;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { markdownToHtml } from '../utils/markdown';\n\nexport function renderMarkdown(params /*, hash*/) {\n    if (params && params.length > 0) {\n        return Ember.String.htmlSafe(markdownToHtml(params[0]));\n    }\n    return '';\n}\n\nexport default Ember.Helper.helper(renderMarkdown);\n","define(\"connections-ui/helpers/round\", [\"exports\", \"ember-math-helpers/helpers/round\"], function (_exports, _round) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _round.default;\n    }\n  });\n  Object.defineProperty(_exports, \"round\", {\n    enumerable: true,\n    get: function get() {\n      return _round.round;\n    }\n  });\n});\n","define(\"connections-ui/helpers/route-action\", [\"exports\", \"ember-route-action-helper/helpers/route-action\"], function (_exports, _routeAction) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _routeAction.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport moment from '../utils/dates';\n\nexport default Ember.Helper.helper(function (params) {\n    const time = params[0];\n    return moment(time).format('h:mm a');\n});\n","import Ember from 'ember';\nimport { emojifyStringUnicode } from 'ember-purecloud-components/utils/emoji';\n\nexport default Ember.Helper.helper(params => {\n    const emoji = params[0];\n    const isUnicode = params.length > 1 ? params[1] : false;\n    const isUnicodeLookAhead = params[1] === 'isUnicodeLookAhead' ? true : false;\n    if (isUnicodeLookAhead) {\n        return emojifyStringUnicode(`:${emoji}:`);\n    }\n    return /:\\w+:/.test(emoji) || isUnicode ? emoji : `:${emoji}:`;\n});\n","define(\"connections-ui/helpers/sign\", [\"exports\", \"ember-math-helpers/helpers/sign\"], function (_exports, _sign) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sign.default;\n    }\n  });\n  Object.defineProperty(_exports, \"sign\", {\n    enumerable: true,\n    get: function get() {\n      return _sign.sign;\n    }\n  });\n});\n","define(\"connections-ui/helpers/sin\", [\"exports\", \"ember-math-helpers/helpers/sin\"], function (_exports, _sin) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sin.default;\n    }\n  });\n  Object.defineProperty(_exports, \"sin\", {\n    enumerable: true,\n    get: function get() {\n      return _sin.sin;\n    }\n  });\n});\n","import singularize from 'ember-inflector/lib/helpers/singularize';\nexport default singularize;\n","import Ember from 'ember';\nimport orderBy from 'lodash/orderBy';\nimport moment from '../utils/dates';\n\nexport function sortFieldData([data], { group }) {\n    let key = group.key;\n    if (key === 'workHistory' || key === 'education') {\n        return orderBy(\n            data,\n            function (fieldData) {\n                let value = fieldData.get('value.value.startDate');\n                if (value) {\n                    let { month, year } = value;\n                    if (month) {\n                        month -= 1;\n                    }\n\n                    return moment({ month, year }).valueOf();\n                }\n            },\n            ['desc']\n        );\n    }\n\n    return data;\n}\n\nexport default Ember.Helper.helper(sortFieldData);\n","define(\"connections-ui/helpers/sqrt\", [\"exports\", \"ember-math-helpers/helpers/sqrt\"], function (_exports, _sqrt) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sqrt.default;\n    }\n  });\n  Object.defineProperty(_exports, \"sqrt\", {\n    enumerable: true,\n    get: function get() {\n      return _sqrt.sqrt;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n    compute([value, placeholder] /*, hash*/) {\n        if (typeof value === 'string') {\n            return value;\n        }\n        if (!value) {\n            return '';\n        }\n        if (Ember.get(value, 'promise')) {\n            if (Ember.get(value, 'isFulfilled')) {\n                return Ember.get(value, 'content');\n            }\n            return placeholder || this.get('intl').t('common.loading');\n        }\n        return 'stringOrPromiseError';\n    }\n});\n","define(\"connections-ui/helpers/sub\", [\"exports\", \"ember-math-helpers/helpers/sub\"], function (_exports, _sub) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sub.default;\n    }\n  });\n  Object.defineProperty(_exports, \"sub\", {\n    enumerable: true,\n    get: function get() {\n      return _sub.sub;\n    }\n  });\n});\n","define(\"connections-ui/helpers/sum\", [\"exports\", \"ember-math-helpers/helpers/sum\"], function (_exports, _sum) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sum.default;\n    }\n  });\n  Object.defineProperty(_exports, \"sum\", {\n    enumerable: true,\n    get: function get() {\n      return _sum.sum;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n    compute: function (params, hash) {\n        return this.get('intl').lookup(params[0], hash);\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params) {\n        var field = params[0];\n        var tag = field;\n        if (field) {\n            var section = field.replace('.', '_');\n            var key = section.substring(section.indexOf('_') + 1);\n            tag = this.get('intl').lookup(`person_${section}_labelKey_${key}`);\n        }\n\n        return tag;\n    }\n});\n","define(\"connections-ui/helpers/tan\", [\"exports\", \"ember-math-helpers/helpers/tan\"], function (_exports, _tan) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tan.default;\n    }\n  });\n  Object.defineProperty(_exports, \"tan\", {\n    enumerable: true,\n    get: function get() {\n      return _tan.tan;\n    }\n  });\n});\n","define(\"connections-ui/helpers/tanh\", [\"exports\", \"ember-math-helpers/helpers/tanh\"], function (_exports, _tanh) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tanh.default;\n    }\n  });\n  Object.defineProperty(_exports, \"tanh\", {\n    enumerable: true,\n    get: function get() {\n      return _tanh.tanh;\n    }\n  });\n});\n","define(\"connections-ui/helpers/task\", [\"exports\", \"ember-concurrency/helpers/task\"], function (_exports, _task) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _task.default;\n    }\n  });\n  Object.defineProperty(_exports, \"task\", {\n    enumerable: true,\n    get: function get() {\n      return _task.task;\n    }\n  });\n});\n","import Ember from 'ember';\nimport moment from '../utils/dates';\n\nconst { run, inject, addObserver, removeObserver, Helper } = Ember;\n\nfunction padZero(num) {\n    return num.toString().length === 1 ? `0${num}` : num;\n}\n\n// clone of duration format\n\nexport default Helper.extend({\n    clock: inject.service(),\n\n    willDestroy() {\n        removeObserver(this, 'clock.second', this, this._scheduleRecompute);\n        this._super(...arguments);\n    },\n\n    compute(params, { startTime, endTime, durationInMs }) {\n        const shouldTick = (startTime || endTime) && !durationInMs;\n\n        this.set('startTime', startTime);\n        this.set('endTime', endTime);\n        this.set('durationInMs', durationInMs);\n\n        if (shouldTick) {\n            this._setupObserver();\n        }\n\n        return this._formatDuration();\n    },\n\n    _formatDuration: function () {\n        const startTime = this.get('startTime');\n        const endTime = this.get('endTime');\n\n        let durationInMs;\n        if (startTime && endTime) {\n            durationInMs = endTime.diff(startTime);\n        } else if (startTime) {\n            durationInMs = moment().diff(startTime);\n        } else if (endTime) {\n            durationInMs = endTime.diff(moment());\n        } else {\n            durationInMs = this.get('durationInMs');\n        }\n        durationInMs = durationInMs > 0 ? durationInMs : 0; // Do not show negative durations.\n        const duration = moment.duration(durationInMs);\n        const days = duration.days();\n\n        let hours = duration.hours() + days * 24;\n        let minutes = '';\n        if (hours) {\n            hours = `${hours}:`;\n            minutes = duration.minutes() ? `${padZero(duration.minutes())}:` : '00:';\n        } else {\n            hours = '';\n            minutes = duration.minutes() ? `${duration.minutes()}:` : '0:';\n        }\n\n        const seconds = duration.seconds() ? `${padZero(duration.seconds())}` : '00';\n\n        return `${hours}${minutes}${seconds}`;\n    },\n\n    _setupObserver() {\n        addObserver(this, 'clock.second', this, this._scheduleRecompute);\n        this.get('clock.second'); // start observation\n    },\n\n    _scheduleRecompute() {\n        run.next(this, this.recompute);\n    }\n});\n","import Ember from 'ember';\n\nconst titleForEntityPropertyHelper = Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params) {\n        const entity = params[0];\n        const entityType = params[1];\n        const entityPropertyType = params[2];\n        if (entityType === 'phone') {\n            return entity.getPhoneTitleFor(entityPropertyType);\n        }\n        if (entityType === 'email') {\n            return entity.getEmailTitleFor(entityPropertyType);\n        }\n        return '';\n    }\n});\n\nexport default titleForEntityPropertyHelper;\n","define(\"connections-ui/helpers/trunc\", [\"exports\", \"ember-math-helpers/helpers/trunc\"], function (_exports, _trunc) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _trunc.default;\n    }\n  });\n  Object.defineProperty(_exports, \"trunc\", {\n    enumerable: true,\n    get: function get() {\n      return _trunc.trunc;\n    }\n  });\n});\n","define(\"connections-ui/helpers/unix\", [\"exports\", \"ember-moment/helpers/unix\"], function (_exports, _unix) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _unix.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/utc\", [\"exports\", \"ember-moment/helpers/utc\"], function (_exports, _utc) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _utc.default;\n    }\n  });\n  Object.defineProperty(_exports, \"utc\", {\n    enumerable: true,\n    get: function get() {\n      return _utc.utc;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params) {\n        const intl = this.get('intl');\n        const value = params[0];\n        const type = params[1];\n        if (type === 'location') {\n            return intl.lookup('geolocation.formattedLocationName', value);\n        }\n        if (!value || !value.value) {\n            return '';\n        }\n        if (type === 'email') {\n            return value.value;\n        }\n        if (type === 'voice' || type === 'sms') {\n            const number = value.value.number;\n            const ext = value.value.extension;\n            const html = `<span class='number'>${number}</span>`;\n            const extLabel = intl.lookup('entity.fieldTypes.phone.extension');\n            return Ember.String.htmlSafe(\n                ext ? `${html} <span>${extLabel}</span> <span class='extension'>${ext}</span>` : html\n            );\n        }\n        return '';\n    }\n});\n","define(\"connections-ui/helpers/xor\", [\"exports\", \"ember-truth-helpers/helpers/xor\"], function (_exports, _xor) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _xor.default;\n    }\n  });\n  Object.defineProperty(_exports, \"xor\", {\n    enumerable: true,\n    get: function get() {\n      return _xor.xor;\n    }\n  });\n});\n","export var EVENTS = {\n    INCOMING_CALL: 'incomingCall',\n    TERMINATED_CALL: 'terminatedCall',\n    MISSED_CALL: 'missedCall',\n    STOPPED_RINGING: 'stoppedRinging',\n    PHONE_CONNECTED: 'phoneConnected',\n    WEBRTC_CONNECTION_INCOMING: 'webrtcConnectionIncoming',\n    WEBRTC_CONNECTION_ANSWERED: 'webrtcConnectionAnswered',\n    WEBRTC_CONNECTION_DECLINED: 'webrtcConnectionDeclined',\n    WEBRTC_CONNECTION_STARTED: 'webrtcConnectionStarted',\n    WEBRTC_CONNECTION_ENDED: 'webrtcConnectionEnded'\n};\n","define(\"connections-ui/index\", [\"exports\", \"ember-uuid\"], function (_exports, _emberUuid) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"parse\", {\n    enumerable: true,\n    get: function get() {\n      return _emberUuid.parse;\n    }\n  });\n  Object.defineProperty(_exports, \"unparse\", {\n    enumerable: true,\n    get: function get() {\n      return _emberUuid.unparse;\n    }\n  });\n  Object.defineProperty(_exports, \"v1\", {\n    enumerable: true,\n    get: function get() {\n      return _emberUuid.v1;\n    }\n  });\n  Object.defineProperty(_exports, \"v4\", {\n    enumerable: true,\n    get: function get() {\n      return _emberUuid.v4;\n    }\n  });\n});\n","import initialize from 'ember-modal-dialog/initializers/add-modals-container';\n\nexport default {\n  name: 'add-modals-container',\n  initialize: initialize\n};\n","import initializerFactory from 'ember-cli-app-version/initializer-factory';\nimport config from '../config/environment';\n\nlet name, version;\nif (config.APP) {\n  name = config.APP.name;\n  version = config.APP.version;\n}\n\nexport default {\n  name: 'App Version',\n  initialize: initializerFactory(name, version)\n};\n","import ApplicationService from '../services/application';\n\nexport default {\n    name: 'setupApplicationService',\n    after: 'orgspan',\n    initialize(application) {\n        application.register('service:application', ApplicationService);\n        application.inject('controller', 'applicationService', 'service:application');\n        application.inject('route', 'applicationService', 'service:application');\n        application.inject('component', 'applicationService', 'service:application');\n        application.inject('model', 'applicationService', 'service:application');\n    }\n};\n","import Ember from 'ember';\nimport UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin';\nimport AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';\nimport AuthenticatedAuthorizedRouteMixin from '../mixins/authenticated-authorized-route-mixin';\n\nexport default {\n    name: 'authenticationSetup',\n    after: 'orgspan',\n    before: 'authenticators',\n\n    initialize: function () {\n        /*\n         * Protecting ALL routes with ember-simple-auth by default\n         *\n         * Use unprotected or unauthenticated route mixins to relax\n         * permissions on your routes\n         */\n        Ember.Route.reopen(AuthenticatedAuthorizedRouteMixin);\n\n        UnauthenticatedRouteMixin.reopen({\n            beforeModel() {\n                if (this.get('session.isAuthenticated')) {\n                    return this._super(...arguments);\n                }\n\n                /*\n                Intentionally not calling super or doing anthing.  This should\n                be the termination of the route hierarchy.  If not, you\n                run into the default Ember route which we just set as an\n                authenticated-authorized route.\n                */\n            }\n        });\n\n        AuthenticatedRouteMixin.reopen({\n            beforeModel() {\n                if (!this.get('session.isAuthenticated')) {\n                    return this._super(...arguments);\n                }\n\n                /*\n                Intentionally not calling super or doing anthing.  This should\n                be the termination of the route hierarchy.  If not, you\n                run into the default Ember route which we just set as an\n                authenticated-authorized route.\n                */\n            }\n        });\n    }\n};\n","import Ember from 'ember';\nimport config from '../config/environment';\nimport netUtils from '../utils/net';\n\nfunction loadOauthProps() {\n    const { oauthProps } = config;\n    if (oauthProps && typeof oauthProps === 'object' && !Object.prototype.hasOwnProperty.call(oauthProps, 'clientId')) {\n        try {\n            const { runtime } = netUtils.getEnvDetails();\n            // Authenticator will handle `null` from a UI perspective\n            return runtime.name in oauthProps ? oauthProps[runtime.name] : null;\n        } catch (e) {\n            return null;\n        }\n    }\n    return oauthProps;\n}\n\nexport function deprecateJqueryCookie() {\n    const jQueryCookieDeprecation = {\n        id: 'directory-core.deprecate-jquery-cookie',\n        until: '8.0.0',\n        url: 'https://bitbucket.org/inindca/connections-ui/src/develop/DEPRECATIONS.md#markdown-header-jquery-cookie'\n    };\n\n    if (Ember.$.cookie) {\n        const cookie = Ember.$.cookie;\n        Ember.$.cookie = function _overrideCookie(name, value) {\n            let message = 'Please use `service:ember-cookies`.read(name) instead of jQuery.$.cookie';\n            if (value) {\n                message = 'Please use `service:ember-cookies`.write(name, value, [opts]) instead of jQuery.$.cookie';\n            }\n            Ember.deprecate(message, false, jQueryCookieDeprecation);\n            return cookie.apply(Ember.$, arguments);\n        };\n    }\n\n    if (Ember.$.removeCookie) {\n        const removeCookie = Ember.$.removeCookie;\n        Ember.$.removeCookie = function _overrideRemoveCookie() {\n            const message = 'Please use `service:ember-cookies`.clear(name) instead of jQuery.$.removeCookie';\n            Ember.deprecate(message, false, jQueryCookieDeprecation);\n            return removeCookie.apply(Ember.$, arguments);\n        };\n    }\n}\n\nexport default {\n    name: 'authenticators',\n    before: 'ember-simple-auth',\n    after: 'setupSessionService',\n    initialize: function (application) {\n        deprecateJqueryCookie();\n\n        application.register('authenticator:oauthProps', Ember.Object.extend(loadOauthProps() || {}));\n        application.inject('authenticator:directory', 'oauthProps', 'authenticator:oauthProps');\n    }\n};\n","import ChatService from '../services/chat';\n\nexport default {\n    name: 'setupChatService',\n    after: 'setupPhoneService',\n    initialize: function (application) {\n        application.register('service:chat', ChatService, { singleton: true, initialize: true });\n        application.inject('service:chat', 'store', 'service:store');\n        application.inject('service:chat', 'session', 'service:session');\n        application.inject('service:chat', 'preferences', 'service:preferences');\n        application.inject('service:chat', 'applicationService', 'service:application');\n        application.inject('service:chat', 'phoneService', 'service:phone');\n\n        application.inject('controller', 'chatService', 'service:chat');\n        application.inject('route', 'chatService', 'service:chat');\n        application.inject('component', 'chatService', 'service:chat');\n    }\n};\n","import Clock from '../services/clock';\n\nexport default {\n  name: 'clock',\n  initialize: function() {\n    var app = arguments[1] || arguments[0];\n    app.register('clock:main', Clock);\n    app.inject('controller', 'clock', 'clock:main');\n    app.inject('component', 'clock', 'clock:main');\n  }\n};\n","export { default, initialize } from 'ember-component-css/initializers/component-styles';\n\nimport Ember from 'ember';\n\nimport StyleNamespacingExtras from '../mixins/style-namespacing-extras';\n\n// eslint-disable-next-line ember/new-module-imports\nEmber.Component.reopen(StyleNamespacingExtras);\n","import ContainerDebugAdapter from 'ember-resolver/resolvers/classic/container-debug-adapter';\n\nexport default {\n  name: 'container-debug-adapter',\n\n  initialize() {\n    let app = arguments[1] || arguments[0];\n\n    app.register('container-debug-adapter:main', ContainerDebugAdapter);\n    app.inject('container-debug-adapter:main', 'namespace', 'application:main');\n  }\n};\n","/*\n  This initializer is here to keep backwards compatibility with code depending\n  on the `data-adapter` initializer (before Ember Data was an addon).\n\n  Should be removed for Ember Data 3.x\n*/\n\nexport default {\n  name: 'data-adapter',\n  before: 'store',\n  initialize() {}\n};\n","import WebrtcSdkService from '../services/device-profiles-v2';\n\nexport default {\n    name: 'setupDeviceProfilesService',\n    after: 'setupWebrtcSdkService',\n    initialize: function (application) {\n        application.register('service:device-profiles-v2', WebrtcSdkService);\n        application.inject('controller', 'device-profiles-v2', 'service:device-profiles-v2');\n        application.inject('route', 'device-profiles-v2', 'service:device-profiles-v2');\n        application.inject('component', 'device-profiles-v2', 'service:device-profiles-v2');\n    }\n};\n","define(\"connections-ui/initializers/ember-concurrency\", [\"exports\", \"ember-concurrency/initializers/ember-concurrency\"], function (_exports, _emberConcurrency) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberConcurrency.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function get() {\n      return _emberConcurrency.initialize;\n    }\n  });\n});\n","import {initializer as initialize} from 'ember-data-change-tracker';\n\nexport default {\n  name: 'ember-data-change-tracker',\n  after: 'ember-data',\n  initialize\n};\n","import setupContainer from 'ember-data/setup-container';\nimport 'ember-data';\n\n/*\n\n  This code initializes Ember-Data onto an Ember application.\n\n  If an Ember.js developer defines a subclass of DS.Store on their application,\n  as `App.StoreService` (or via a module system that resolves to `service:store`)\n  this code will automatically instantiate it and make it available on the\n  router.\n\n  Additionally, after an application's controllers have been injected, they will\n  each have the store made available to them.\n\n  For example, imagine an Ember.js application with the following classes:\n\n  App.StoreService = DS.Store.extend({\n    adapter: 'custom'\n  });\n\n  App.PostsController = Ember.Controller.extend({\n    // ...\n  });\n\n  When the application is initialized, `App.ApplicationStore` will automatically be\n  instantiated, and the instance of `App.PostsController` will have its `store`\n  property set to that instance.\n\n  Note that this code will only be run if the `ember-application` package is\n  loaded. If Ember Data is being used in an environment other than a\n  typical application (e.g., node.js where only `ember-runtime` is available),\n  this code will be ignored.\n*/\n\nexport default {\n  name: 'ember-data',\n  initialize: setupContainer\n};\n","import ENV from '../config/environment';\nimport Configuration from 'ember-simple-auth/configuration';\nimport setupSession from 'ember-simple-auth/initializers/setup-session';\nimport setupSessionService from 'ember-simple-auth/initializers/setup-session-service';\n\nexport default {\n  name: 'ember-simple-auth',\n\n  initialize(registry) {\n    const config = ENV['ember-simple-auth'] || {};\n    config.baseURL = ENV.rootURL || ENV.baseURL;\n    Configuration.load(config);\n\n    setupSession(registry);\n    setupSessionService(registry);\n  }\n};\n","define(\"connections-ui/initializers/engines\", [\"exports\", \"ember-engines/initializers/engines\"], function (_exports, _engines) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _engines.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function get() {\n      return _engines.initialize;\n    }\n  });\n});\n","import Ember from 'ember';\nimport config from '../config/environment';\n\nexport function initialize() {\n  var application = arguments[1] || arguments[0];\n  if (config.exportApplicationGlobal !== false) {\n    var theGlobal;\n    if (typeof window !== 'undefined') {\n        theGlobal = window;\n    } else if (typeof global !== 'undefined') {\n        theGlobal = global\n    } else if (typeof self !== 'undefined') {\n        theGlobal = self;\n    } else {\n       // no reasonable global, just bail\n       return;\n    }\n\n    var value = config.exportApplicationGlobal;\n    var globalName;\n\n    if (typeof value === 'string') {\n      globalName = value;\n    } else {\n      globalName = Ember.String.classify(config.modulePrefix);\n    }\n\n    if (!theGlobal[globalName]) {\n      theGlobal[globalName] = application;\n\n      application.reopen({\n        willDestroy: function() {\n          this._super.apply(this, arguments);\n          delete theGlobal[globalName];\n        }\n      });\n    }\n  }\n}\n\nexport default {\n  name: 'export-application-global',\n\n  initialize: initialize\n};\n","import throttled from \"rate-limit-computed/throttled\";\nimport debounced from \"rate-limit-computed/debounced\";\n\nexport default {\n  name: 'extend-ember-computed',\n  initialize: function() {\n    Ember.computed.throttle = throttled;\n    Ember.computed.debounce = debounced;\n  }\n};\n","import FieldConfig from '../field-config/field-config';\n\nimport PersonFieldConfig from '../field-config/entities/person';\nimport GroupFieldConfig from '../field-config/entities/group';\nimport OrgFieldConfig from '../field-config/entities/org';\nimport ExternalContactFieldConfig from '../field-config/entities/external-contact';\n\nfunction _register(application, id, config) {\n    application.register(id, config);\n}\n\nfunction initialize(application) {\n    _register(application, 'field-config:base', FieldConfig);\n    _register(application, 'field-config:person', PersonFieldConfig);\n    _register(application, 'field-config:group', GroupFieldConfig);\n    _register(application, 'field-config:org', OrgFieldConfig);\n    _register(application, 'field-config:externalContact', ExternalContactFieldConfig);\n}\n\nexport default {\n    name: 'setupFieldConfig',\n    after: 'orgspan',\n    initialize\n};\n","/*\n  This initializer is here to keep backwards compatibility with code depending\n  on the `injectStore` initializer (before Ember Data was an addon).\n\n  Should be removed for Ember Data 3.x\n*/\n\nexport default {\n  name: 'injectStore',\n  before: 'store',\n  initialize() {}\n};\n","import Ember from 'ember';\nimport config from '../config/environment';\n\nconst MainInitializer = {\n    name: 'orgspan',\n    after: 'ember-data',\n\n    initialize: function (application) {\n        // TODO: THIS IS BAD...remove later\n        window.Orgspan = application;\n\n        application.inject('component', 'store', 'service:store');\n\n        /*\n         * Ember is supposed to noop Ember.deprecate calls in production builds:\n         * http://emberjs.com/api/classes/Ember.html#method_deprecate\n         * However, this is a WIP:\n         * https://github.com/ember-cli/rfcs/pull/50\n         *\n         * Until this RFC is implemented, kill the deprecation chain which will\n         * result in noop (e.g. no logging) in non-dev environments.\n         */\n        if (config.environment !== 'development') {\n            // Register an empty function to break the deprecation chain call\n            Ember.Debug.registerDeprecationHandler(function () {});\n        }\n    }\n};\n\nif (config.environment === 'test') {\n    MainInitializer.after = ['ember-data'];\n}\n\nexport default MainInitializer;\n","import Provider from '../media-providers/provider';\nimport ZoomProvider from '../media-providers/zoom';\nimport PureCloudProvider from '../media-providers/purecloud';\nimport TeamsProvider from '../media-providers/teams';\n\nfunction _register(application, id, config) {\n    application.register(id, config, { singleton: false });\n}\n\nfunction initialize(application) {\n    _register(application, 'media-provider:base', Provider);\n    _register(application, 'media-provider:zoom', ZoomProvider);\n    _register(application, 'media-provider:purecloud', PureCloudProvider);\n    _register(application, 'media-provider:teams', TeamsProvider);\n}\n\nexport default {\n    name: 'setupMediaProviders',\n    after: 'orgspan',\n    initialize\n};\n","import PhoneService from '../services/phone';\n\nexport default {\n    name: 'setupPhoneService',\n    after: 'setupSessionService',\n    initialize: function (application) {\n        application.register('service:phone', PhoneService, { singleton: true, initialize: true });\n        application.inject('service:phone', 'store', 'service:store');\n        application.inject('service:phone', 'session', 'service:session');\n        application.inject('service:phone', 'preferences', 'service:preferences');\n        application.inject('service:phone', 'applicationService', 'service:application');\n\n        application.inject('route', 'phoneService', 'service:phone');\n        application.inject('component', 'phoneService', 'service:phone');\n    }\n};\n","import PreferencesService from '../services/preferences';\n\nexport default {\n    name: 'setupPreferencesService',\n    before: 'setupApplicationService',\n    initialize(application) {\n        application.register('service:preferences', PreferencesService);\n        application.inject('controller', 'preferences', 'service:preferences');\n        application.inject('route', 'preferences', 'service:preferences');\n        application.inject('component', 'preferences', 'service:preferences');\n    }\n};\n","define(\"connections-ui/initializers/route-styles\", [\"exports\", \"ember-component-css/initializers/route-styles\"], function (_exports, _routeStyles) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _routeStyles.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function get() {\n      return _routeStyles.initialize;\n    }\n  });\n});\n","import ApplicationService from 'connections-ui/services/application';\nimport netUtils from '../utils/net';\nimport { isTesting } from 'connections-ui/utils/testing';\n\nexport default {\n    name: 'service-discovery',\n\n    initialize: function (application) {\n        application.deferReadiness();\n        if (isTesting) {\n            ApplicationService.reopen({\n                authUri: null\n            });\n        } else {\n            const instanceProperties = {};\n            const runtimePublicDomainName = netUtils.getEnvDetails().runtime\n                ? netUtils.getEnvDetails().runtime.publicDomainName\n                : null;\n            if (runtimePublicDomainName) {\n                instanceProperties.authUri = 'https://login.' + runtimePublicDomainName;\n                instanceProperties.purecloudV2BaseUri = 'https://api.' + runtimePublicDomainName;\n                instanceProperties.cobrowseUri = 'https://cobrowse.' + runtimePublicDomainName;\n                instanceProperties.purecloudAppsUri = 'https://apps.' + runtimePublicDomainName + '/';\n                instanceProperties.streamingServiceUri = 'wss://streaming.' + runtimePublicDomainName;\n            } else {\n                instanceProperties.authUri = null;\n            }\n            ApplicationService.reopen(instanceProperties);\n            application.advanceReadiness();\n        }\n    }\n};\n","import SessionService from '../services/session';\n\nexport default {\n    name: 'setupSessionService',\n    after: 'setupApplicationService',\n    initialize(application) {\n        application.register('service:session', SessionService);\n        application.inject('service:session', 'application', 'service:application');\n        application.inject('controller', 'session', 'service:session');\n        application.inject('route', 'session', 'service:session');\n        application.inject('component', 'session', 'service:session');\n        application.inject('adapter', 'session', 'service:session');\n    }\n};\n","import { loadTheme, setThemeClass } from '../utils/theme-loader';\n\nexport default {\n    name: 'set-application-theme',\n    before: 'orgspan',\n    /**\n     * Sets the theme to an out-of-the-box supported theme until FT's load in, and then will update the theme\n     * of the application to the actual cached theme if the FT is supported in the Environment. That way the\n     * theme will never show until it's confirmed to be supported no matter the value of the theme cookie.\n     */\n    initialize: () => setThemeClass(loadTheme())\n};\n","const require = window.requirejs;\n\nexport function initialize(instance) {\n    const regex = /^ember-webrtc-components\\/components\\/([\\w\\-/]+)\\/component/;\n    const packages = Object.keys(require._eak_seen);\n    const paths = packages.filter(path => regex.test(path));\n    paths.forEach(path => {\n        const matches = path.match(regex);\n        const name = matches && matches.length && matches[matches.length - 1];\n        instance.register(`component:${name}`, require(path).default);\n    });\n}\n\nexport default {\n    name: 'setup-webrtc-components',\n    initialize\n};\n","/*\n  This initializer is here to keep backwards compatibility with code depending\n  on the `store` initializer (before Ember Data was an addon).\n\n  Should be removed for Ember Data 3.x\n*/\n\nexport default {\n  name: 'store',\n  after: 'ember-data',\n  initialize() {}\n};\n","/*\n  This initializer is here to keep backwards compatibility with code depending\n  on the `transforms` initializer (before Ember Data was an addon).\n\n  Should be removed for Ember Data 3.x\n*/\n\nexport default {\n  name: 'transforms',\n  before: 'store',\n  initialize() {}\n};\n","import WebrtcSdkService from '../services/webrtc-sdk';\nimport 'genesys-cloud-webrtc-sdk';\n\nexport default {\n    name: 'setupWebrtcSdkService',\n    after: 'setupSessionService',\n    initialize: function (application) {\n        application.register('service:webrtc-sdk', WebrtcSdkService);\n        application.inject('controller', 'webrtc-sdk', 'service:webrtc-sdk');\n        application.inject('route', 'webrtc-sdk', 'service:webrtc-sdk');\n        application.inject('component', 'webrtc-sdk', 'service:webrtc-sdk');\n    }\n};\n","import WebrtcService from 'ember-webrtc-components/services/webrtc';\n\nexport default {\n    name: 'setupWebrtcService',\n    after: 'setupChatService',\n    initialize: function (application) {\n        application.register('service:webrtc', WebrtcService, { singleton: true, initialize: true });\n        application.inject('service:webrtc', 'store', 'service:store');\n        application.inject('service:webrtc', 'session', 'service:session');\n        application.inject('service:webrtc', 'preferences', 'service:preferences');\n        application.inject('service:webrtc', 'applicationService', 'service:application');\n        application.inject('service:webrtc', 'phoneService', 'service:phone');\n        application.inject('service:webrtc', 'chatService', 'service:chat');\n\n        application.inject('controller', 'webrtcService', 'service:webrtc');\n        application.inject('route', 'webrtcService', 'service:webrtc');\n        application.inject('component', 'webrtcService', 'service:webrtc');\n    }\n};\n","import WebrtcSettings from '../services/webrtc-settings';\n\nexport default {\n    name: 'setupWebrtcSettingsService',\n    before: 'setupApplicationService',\n    initialize(application) {\n        application.register('service:webrtc-settings', WebrtcSettings);\n        application.inject('controller', 'webrtc-settings', 'service:webrtc-settings');\n        application.inject('route', 'webrtc-settings', 'service:webrtc-settings');\n        application.inject('component', 'webrtc-settings', 'service:webrtc-settings');\n    }\n};\n","export function initialize(instance) {\n    instance.lookup('controller:application');\n}\n\nexport default {\n    name: 'attach-application-controller',\n    initialize\n};\n","export default {\n    name: 'attach-application-session',\n    initialize(instance) {\n        const application = instance.lookup('application:main');\n        application.set('session', instance.lookup('service:session'));\n    }\n};\n","define(\"connections-ui/instance-initializers/backburner-debug\", [\"exports\", \"ember-purecloud-components/instance-initializers/backburner-debug\"], function (_exports, _backburnerDebug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _backburnerDebug.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function get() {\n      return _backburnerDebug.initialize;\n    }\n  });\n});\n","define(\"connections-ui/instance-initializers/conversation-service\", [\"exports\", \"ember-purecloud-components/instance-initializers/conversation-service\"], function (_exports, _conversationService) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _conversationService.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function get() {\n      return _conversationService.initialize;\n    }\n  });\n});\n","export function initialize(applicationInstance) {\n    applicationInstance.lookup('service:embedded');\n}\n\nexport default {\n    name: 'embedded',\n    initialize: initialize\n};\n","import initializeStoreService from 'ember-data/instance-initializers/initialize-store-service';\n\nexport default {\n  name: \"ember-data\",\n  initialize: initializeStoreService\n};\n","/* globals requirejs, Intl */\n\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\n\nimport Ember from 'ember';\nimport ENV from '../config/environment';\nimport links from 'ember-intl/utils/links';\n\nconst { warn } = Ember;\n\nfunction filterBy(type) {\n  return Object.keys(requirejs._eak_seen).filter((key) => {\n    return key.indexOf(`${ENV.modulePrefix}\\/${type}\\/`) === 0;\n  });\n}\n\nexport function instanceInitializer(instance) {\n  let service;\n\n  if (typeof instance.lookup === 'function') {\n    service = instance.lookup('service:intl');\n  } else {\n    service = instance.container.lookup('service:intl');\n  }\n\n  if (typeof Intl === 'undefined') {\n    warn(`[ember-intl] Intl API is unavailable in this environment.\\nSee: ${links.polyfill}`, false, {\n      id: 'ember-intl-undefined-intljs'\n    });\n  }\n\n  const cldrs = filterBy('cldrs');\n\n  if (!cldrs.length) {\n    warn('[ember-intl] project is missing CLDR data\\nIf you are asynchronously loading translation, see: ${links.asyncTranslations}.', false, {\n      id: 'ember-intl-missing-cldr-data'\n    });\n  } else {\n    cldrs.map((moduleName) => requirejs(moduleName, null, null, true)['default'])\n      .forEach((locale) => locale.forEach(service.addLocaleData));\n  }\n\n  filterBy('translations').forEach((moduleName) => {\n    const localeSplit = moduleName.split('\\/');\n    const localeName = localeSplit[localeSplit.length - 1];\n    service.addTranslations(localeName, requirejs(moduleName, null, null, true)['default']);\n  });\n}\n\nexport default {\n  name: 'ember-intl',\n  initialize: instanceInitializer\n}\n","import setupSessionRestoration from 'ember-simple-auth/instance-initializers/setup-session-restoration';\n\nexport default {\n  name: 'ember-simple-auth',\n\n  initialize(instance) {\n    setupSessionRestoration(instance);\n  }\n};\n","import LazyRenderWrapper from 'ember-tooltips/components/lazy-render-wrapper';\n\nexport function initialize() {\n    // this can be removed after ember-tooltips version is bumped to 3.0.\n    // 2.5 defaults this property to off.\n    LazyRenderWrapper.reopen({\n        enableLazyRendering: true\n    });\n}\n\nexport default {\n    name: 'ember-tooltips',\n    initialize\n};\n","import EntityContactGroupComponent from '../components/entity-contact-group-v2/component';\nimport EntityImageDefaults from 'connections-ui/mixins/entity-image-defaults';\n\nexport function initialize() {\n    EntityContactGroupComponent.reopen(EntityImageDefaults);\n}\n\nexport default {\n    name: 'entity-contact-group-v2',\n    initialize\n};\n","import Ember from 'ember';\nimport EntityFavoriteComponent from 'ember-purecloud-components/components/entity-favorite/component';\n\nexport function initialize() {\n    EntityFavoriteComponent.reopen({\n        favorites: Ember.inject.service(),\n        toggleFavorite(entity) {\n            this.get('favorites').toggleFavorite(entity);\n        }\n    });\n}\n\nexport default {\n    name: 'entity-favorite',\n    initialize\n};\n","import EntityHoverCard from '../components/entity-hover-card-v2/component';\nimport EntityImageDefaults from 'connections-ui/mixins/entity-image-defaults';\n\nexport function initialize() {\n    EntityHoverCard.reopen(EntityImageDefaults);\n}\n\nexport default {\n    name: 'entity-hover-card-v2',\n    initialize\n};\n","import EntityImageComponent from '../components/entity-image-v2/component';\nimport EntityImageDefaults from 'connections-ui/mixins/entity-image-defaults';\n\nexport function initialize() {\n    EntityImageComponent.reopen(EntityImageDefaults);\n}\n\nexport default {\n    name: 'entity-image-v2',\n    initialize\n};\n","import Ember from 'ember';\nimport EntityLocationComponent from 'ember-purecloud-components/components/entity-location/component';\n\nexport function initialize() {\n    EntityLocationComponent.reopen({\n        session: Ember.inject.service(),\n        geolocation: Ember.inject.service(),\n\n        self: Ember.computed.reads('session.person'),\n        isGeolocationEnabled: Ember.computed.reads('geolocation.isEnabled')\n    });\n}\n\nexport default {\n    name: 'entity-location',\n    initialize\n};\n","import Validators from '../components/entity-fields/validators';\n\nexport function initialize(application) {\n    Validators.reopen(application.ownerInjection());\n}\n\nexport default {\n    name: 'inject-owner',\n    initialize\n};\n","import manifest from '../config/asset-manifest';\n\n/**\n * Initializes the AssetLoader service with a generated asset-manifest.\n */\nexport function initialize(instance) {\n  const service = instance.lookup('service:asset-loader');\n  service.pushManifest(manifest);\n}\n\nexport default {\n  name: 'load-asset-manifest',\n  initialize\n};\n","import Ember from 'ember';\nimport PresenceLabelComponent from 'ember-purecloud-components/components/presence-label/component';\n\nexport function initialize() {\n    PresenceLabelComponent.reopen({\n        chat: Ember.inject.service(),\n        isChatEnabled: Ember.computed.reads('chat.enabled')\n    });\n}\n\nexport default {\n    name: 'presence-label',\n    initialize\n};\n","export default {\n  name: 'setupRecordingService',\n  initialize (instance) {\n    instance.lookup('service:recording');\n  }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default {\n    name: 'reopen-component',\n\n    initialize(instance) {\n        const session = instance.lookup('service:session');\n        const preferences = instance.lookup('service:preferences');\n\n        Ember.Component.reopen({\n            bubbleAction(data) {\n                try {\n                    this.triggerAction(data);\n                } catch (e) {\n                    // Turn on to debug component stack\n                    // Ember.Logger.warn(e.message, e.stack);\n                }\n\n                const parentView = this.get('parentView');\n                if (parentView && parentView.bubbleAction) {\n                    parentView.bubbleAction(data);\n                }\n            }\n        });\n\n        Ember.Component.reopen({\n            init() {\n                this._super();\n\n                var services = this.get('needsServices');\n                if (!services) {\n                    services = [];\n                }\n\n                var current = this.get('services');\n                if (!current) {\n                    current = {};\n                }\n\n                _.each(services, function (name) {\n                    var service = instance.lookup('service:' + name);\n                    Ember.set(current, name, service);\n                });\n\n                this.set('services', current);\n\n                if (!this.get('session')) {\n                    this.set('session', session);\n                }\n\n                if (!this.get('preferences')) {\n                    this.set('preferences', preferences);\n                }\n            }\n        });\n    }\n};\n","import Ember from 'ember';\nconst { inject, observer, Route } = Ember;\n\nexport default {\n    name: 'reopen-route',\n\n    initialize() {\n        Route.reopen({\n            intl: inject.service(),\n            application: inject.service(),\n\n            routeTitle: '',\n\n            updateRouteTitle: observer(\n                'routeName',\n                'routeTitle',\n                'application.{orgName,currentRouteName}',\n                function () {\n                    let parts = [];\n                    let routeName = this.get('routeName');\n                    let routeTitle = this.get('routeTitle');\n                    let appRoute = this.get('application.currentRouteName') || '';\n                    let orgName = this.get('application.orgName');\n\n                    if (!routeTitle || appRoute.indexOf(routeName) === -1) {\n                        return;\n                    }\n\n                    parts.push(typeof routeTitle === 'function' ? routeTitle.call(this) : routeTitle);\n\n                    if (orgName) {\n                        parts.push(orgName);\n                    }\n\n                    window.top.document.title = parts.join(' - ');\n                }\n            )\n        });\n    }\n};\n","import Ember from 'ember';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport HostedContext from '../utils/hosted-context';\nimport { parseRuntimeCustom } from '../utils/net';\n\nexport default {\n    name: 'set-application-service-values',\n    initialize(instance) {\n        const application = instance.lookup('application:main');\n        const service = instance.lookup('service:application');\n        service.setProperties(application.getProperties('urlprefix', 'semver', 'version', 'context'));\n        const context = HostedContext.create(instance.ownerInjection());\n        service.set('hostedContext', context);\n        service.set('store', instance.lookup('service:store'));\n        if (isTesting) {\n            // Runtime will not resolve in testing mode, so anything that uses it will need to mock it in the tests.\n            service.set('runtime', null);\n        } else {\n            try {\n                const runtime = parseRuntimeCustom();\n                if (runtime) service.set('runtime', parseRuntimeCustom());\n                else {\n                    throw new Error('Failed to parse URL into a known runtime environment. Check URL and utils/net.js');\n                }\n            } catch (error) {\n                Ember.Logger.error(error);\n                // Setting the errorState on the applicaiton service will route to the maintenance mode page.\n                service.set('errorState', { type: 'invalidEnv' });\n                service.set('runtime', null);\n            }\n        }\n        application.set('applicationService', service);\n    }\n};\n","export default {\n    name: 'set-application-values',\n    initialize(instance) {\n        const application = instance.lookup('application:main');\n        application.set('instance', instance);\n        application.set('ajax', instance.lookup('ajax:application'));\n        application.set('permissions', instance.lookup('permissions:application'));\n\n        // Probably shouldn't access these this way...might be one of those separation of concerns problems\n        application.set('store', instance.lookup('service:store'));\n        application.set('router', instance.lookup('router:main'));\n    }\n};\n","import Ember from 'ember';\nimport { initializeMarkdownRendering } from '../utils/markdown';\nimport { initializeEmojiRendering } from 'ember-purecloud-components/utils/emoji';\n\nexport default {\n    name: 'setup-application',\n    initialize: function (instance) {\n        const application = instance.lookup('application:main');\n        // looking up sound service here loads all of the sounds and creates handlers for onplay and onstop events.\n        // see PCDWEBK-3861 for more info.\n        const sound = instance.lookup('service:sound'); // eslint-disable-line no-unused-vars\n\n        Ember.$(window).on('beforeunload', function (event) {\n            return Ember.run(() => {\n                // mailto: links cause beforeunload to fire.\n                let isLink = false;\n                let $target = Ember.$(Ember.get(event, 'target.activeElement'));\n                let href = $target.attr('href');\n                if (!href) {\n                    $target = Ember.$($target).closest('a');\n                    href = $target.attr('href');\n                }\n                if (href) {\n                    isLink = href.indexOf('mailto') > -1 || href.indexOf('tel') > -1;\n                }\n                if (isLink) {\n                    return;\n                }\n\n                try {\n                    const pigeonService = instance.lookup('service:pigeon');\n                    if (pigeonService) {\n                        // Avoid reconnecting upon a refresh.\n                        pigeonService.reconnect = function () {};\n                        pigeonService.disconnect();\n                    }\n                } catch (e) {\n                    Ember.Logger.error('Could not find pigeon service', { error: e });\n                }\n            });\n        });\n\n        const urlPrefix = application.get('urlprefix');\n\n        initializeEmojiRendering(urlPrefix);\n\n        const isApplicationRoute = function (href) {\n            return !!/^\\/?#\\/.*\\/[a-f0-9]{24}/.test(href) || !!/^\\/?#\\/.*\\/[a-z0-9-]{36}$/i.test(href);\n        };\n\n        initializeMarkdownRendering(isApplicationRoute);\n    }\n};\n","export default {\n    name: 'setup-apps-api-handlers',\n    initialize(instance) {\n        let apiHandlers = [];\n        let apiHandlerKeys = instance.lookup('apps-api-handler:keys');\n        if (apiHandlerKeys && apiHandlerKeys.length) {\n            apiHandlerKeys.forEach(currHandlerKey => {\n                apiHandlers.push(instance.lookup(currHandlerKey));\n            });\n        }\n\n        instance.lookup('service:apps').set('globalApiHandlers', apiHandlers);\n    }\n};\n","import Ember from 'ember';\n\nexport function initialize(instance) {\n    const stashLogger = instance.lookup('service:stash-logger');\n    Ember.Logger = stashLogger;\n    Ember.onerror = function (error) {\n        const status = error ? Ember.get(error, 'status') : null;\n        if (status === 200) {\n            return null;\n        } else if (status === 418) {\n            const applicationService = instance.lookup('service:application');\n            const session = applicationService.get('session');\n            if (session) {\n                session.logout();\n            }\n        }\n\n        // Sometimes Ember RSVP triggers the onError, and sometimes it doesn't,\n        // so this will prevent the same error being logged multiple times\n        if (error._logged === true || error === 'Request Cancelled') {\n            return;\n        }\n\n        if (typeof error === 'object') {\n            error._logged = true;\n        }\n\n        return stashLogger.error(`Global Error Caught: ${error}`);\n    };\n\n    Ember.RSVP.on('error', function (error) {\n        if (!error) {\n            return; // https://github.com/simplabs/ember-simple-auth/issues/439\n        }\n        if (!instance.isDestroyed) {\n            Ember.onerror(error);\n        }\n    });\n\n    const nrOnError = window.onerror;\n    window.onerror = function () {\n        if (nrOnError) {\n            nrOnError.apply(nrOnError, arguments);\n        }\n        stashLogger.error(arguments);\n        return true; // stash logger will handle and log it\n    };\n}\n\nexport default {\n    name: 'setup-error-handling',\n    initialize: initialize\n};\n","function hasQueryParam(param) {\n    const search = window.location.search;\n\n    if (!search) {\n        return false;\n    }\n\n    const params = new URLSearchParams(window.location.search);\n\n    return params.get(param) === 'true';\n}\n\nexport function initialize(instance) {\n    ['disableSoftphone', 'disableProactiveDevicePermissions'].forEach(param => {\n        if (hasQueryParam(param)) {\n            const webrtc = instance.lookup('service:webrtc');\n            webrtc.logger.info(`Setting webrtc.${param} to true based on query param`);\n            webrtc.set(param, true);\n        }\n    });\n}\n\nexport default {\n    name: 'webrtc',\n    initialize\n};\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst TARGET_PRESENCE = Object.freeze({\n    BUSY: 'busy',\n    MEETING: 'meeting',\n    OFFLINE: 'offline'\n});\n\nexport default Ember.Object.extend(LoggerMixin, {\n    intl: Ember.inject.service(),\n    application: Ember.inject.service(),\n    mediaProviders: Ember.inject.service(),\n\n    // Required props\n\n    /**\n     * User associated with this media provider instance (usually the current UI session user)\n     */\n    user: null,\n\n    /**\n     * Type of media provider\n     * Currently only \"video\"\n     */\n    type: null,\n\n    /**\n     * Unique id among the video provider implementations\n     */\n    id: null,\n\n    /**\n     * Label for the media provider (can be a computed property)\n     */\n    label: null,\n\n    /**\n     * Used to store stateful data that can be used in the UI\n     */\n    data: null,\n\n    /**\n     * Path to an image used to launch a video chat inside of the video panel\n     */\n    launchVideoImage: Ember.computed(function () {\n        return '';\n    }),\n\n    disabled: Ember.computed(\n        'user',\n        'room.oneToOneTarget',\n        'room.oneToOneTarget.activities.{presence}',\n        'user.activities.{presence}',\n        function () {\n            let presence = this.getTargetPresence();\n            return (\n                presence === TARGET_PRESENCE.BUSY ||\n                presence === TARGET_PRESENCE.MEETING ||\n                presence === TARGET_PRESENCE.OFFLINE\n            );\n        }\n    ),\n\n    disabledMessage: Ember.computed('disabled', 'user.name', 'room.oneToOneTarget.name', function () {\n        let presence = this.getTargetPresence();\n        let name = this.get('user.name') || this.get('room.oneToOneTarget.name');\n        if (presence === TARGET_PRESENCE.OFFLINE) {\n            return this.get('intl').t('ewc.userOffline', { name });\n        }\n        if (presence === TARGET_PRESENCE.BUSY || presence === TARGET_PRESENCE.MEETING) {\n            return this.get('intl').t('ewc.userBusy', { name });\n        }\n        return this.get('intl').t('common.disabled');\n    }),\n\n    getTargetPresence() {\n        let user = this.get('user');\n        let room = this.get('room');\n\n        if (user) {\n            const gcPresence = user.get('primaryPresence');\n            if (gcPresence) {\n                return (Ember.get(gcPresence, 'presenceDefinition.systemPresence') || '').toLowerCase();\n            }\n        }\n        if (room && room.get('oneToOneTarget')) {\n            const profile = room.get('oneToOneTarget');\n            const chatUserPresence = profile.get('primaryPresence');\n            if (chatUserPresence) {\n                return (Ember.get(chatUserPresence, 'presenceDefinition.systemPresence') || '').toLowerCase();\n            }\n        }\n        return '';\n    },\n\n    // Optional props\n\n    /**\n     * Optional chat room\n     * If you have a media provider that associates itself with a room (video),\n     * you can set this property to hold that state\n     */\n    room: null,\n\n    /**\n     * Optional handler (can be async)\n     * If the provider needs to handle user action (clicking something in the interface)\n     * then you can provider that function here\n     */\n    action: () => {},\n\n    /**\n     * Optional data loader\n     */\n    loadData: () => {},\n\n    /**\n     * Optional handler\n     * If your media provider action could not be run, this handler will be called\n     * It can be used to show an error notification\n     */\n    showRunErrorNotification: () => {},\n\n    /**\n     * Indicates if this provider is available as a feature to the current user.\n     * Implementations can utilize feature toggles, org settings, user access controls, etc.\n     * as needed.\n     *\n     * Used to provide access to various parts of the UI for a media provider\n     * Currently mostly used for chat widget rendering and video dropdowns\n     */\n    haveAccess: Ember.computed(function () {\n        return true;\n    }),\n\n    isActive: Ember.computed('id', 'mediaProviders.activeProvider', function () {\n        const active = this.get('mediaProviders.activeProvider');\n        return active && active.get('id') === this.get('id');\n    }),\n\n    notification: Ember.computed(function () {\n        return null;\n    }),\n\n    // Internal API below\n\n    /**\n     * Check if we can run an action based on current provider state\n     * For example, you cannot join a second video call while on video\n     */\n    canRunAction(options) {\n        if (this.type !== 'video') {\n            return true;\n        }\n\n        if (this.get('mediaProviders.usingVideoProvider') || this.get('webrtc.activeRoom.showingVideo')) {\n            if (options.allowMultipleMeetings) {\n                return true;\n            }\n            this.logger.warn('Media Provider: Cannot run video action while on video', {\n                provider: this\n            });\n            return false;\n        } else if (this.get('application.isPopout')) {\n            this.logger.warn('Media Provider: Cannot run video action while in popout', {\n                provider: this\n            });\n            return false;\n        }\n\n        return true;\n    },\n\n    /**\n     * Grabs the jid for a user or room. Method is used in the purecloud, teams, and zoom provider\n     * classes.\n     * @param {*} options\n     * @returns string (jid) or undefined\n     */\n    getJid(options) {\n        let user = this.get('user');\n        if (!user && options) {\n            user = options.user;\n        }\n        let jid;\n        if (user) {\n            // user could be different types of entities, so access jid both ways\n            jid = user.get('chat.jabberId') || user.get('jid');\n        } else if (this.get('room')) {\n            jid = this.get('room.jid');\n        }\n        return jid;\n    },\n\n    init() {\n        this._super(...arguments);\n\n        const originalAction = this.action;\n        this.action = async function action(options = {}) {\n            const _options = Object.assign(options, {\n                user: this.get('user')\n            });\n\n            if (!this.canRunAction(options) && this.showRunErrorNotification) {\n                this.showRunErrorNotification(options);\n                return;\n            }\n\n            if (this.get('haveEmbeddedClientAccess')) {\n                this.get('mediaProviders').set('activeProvider', this);\n            }\n            try {\n                await originalAction.apply(this, [_options]);\n            } catch (err) {\n                this.get('mediaProviders').set('activeProvider', null);\n                this.logger.error('Media Provider: Error running video action', {\n                    err,\n                    provider: this.get('id')\n                });\n            }\n        }.bind(this);\n    }\n});\n","import Ember from 'ember';\nimport Provider from './provider';\n\nexport const PROVIDER_ID = 'purecloud';\n\nexport default Provider.extend({\n    intl: Ember.inject.service(),\n    chat: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    application: Ember.inject.service(),\n    mediaProviders: Ember.inject.service(),\n\n    id: PROVIDER_ID,\n    data: {},\n    type: 'video',\n    component: 'webrtc-panel',\n\n    init() {\n        this._super(...arguments);\n\n        this.get('webrtc.activeRoom.showingVideo');\n    },\n\n    launchVideoImage: Ember.computed('application.urlprefix', function () {\n        return `${this.get('application.urlprefix')}assets/images/svg/Genesys_Cloud-Expanded-landscape-color.svg`;\n    }),\n\n    haveAccess: Ember.computed('user.profile.content', 'room', 'webrtc.videoCallCapable', function () {\n        if (!this.get('webrtc.videoCallCapable')) {\n            return false;\n        }\n\n        let user = this.get('room.oneToOneTarget') || this.get('user.profile.content');\n        if (!user) {\n            // GC video should just generally always be available\n            return true;\n        }\n\n        return !user.get('isOffline');\n    }),\n\n    action(options) {\n        let jid = this.getJid(options);\n        this.get('application').openChatRoomWithVideo(jid, false);\n    },\n\n    label: Ember.computed(function () {\n        return this.get('intl').t('mediaProviders.purecloud.label').toString();\n    }),\n\n    showingVideoChanged: Ember.observer('webrtc.activeRoom.showingVideo', function () {\n        if (!this.get('webrtc.activeRoom.showingVideo') && this.get('isActive')) {\n            this.set('mediaProviders.activeProvider', null);\n        }\n    })\n});\n","import Ember from 'ember';\nimport LoggerMixin from '../mixins/logger';\nimport Provider from './provider';\n\nexport default Provider.extend(LoggerMixin, {\n    apps: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    mediaProviders: Ember.inject.service(),\n\n    /**\n     * Teams provider id.\n     * Will be used in chat service's sendVideoProviderNotification method. 'id' will\n     * be the stanza name which will render the teams-notification component for Teams in ember-chat-components.\n     */\n    id: 'teams',\n    type: 'video',\n    /**\n     * web-directory component that will render the Teams client app in an iframe that we will use\n     * for communicating from web-directory -> Teams client app. Will allow us to create Teams meetings\n     * from '/teams' command and the media-providers/video-dropdown component. This component is rendered\n     * in the video-panel\n     */\n    component: 'teams-panel',\n\n    settings: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('settings', {});\n    },\n\n    useCollaborateChat: Ember.computed.readOnly('session.useCollaborateChat'),\n\n    /**\n     * Provider launch image. Would be rendered in webrtc panel.\n     * Note: we are not currently supporting 3rd Party embedded video, therefore, this\n     * property is not technically needed but may be required in the future.\n     */\n    launchVideoImage: Ember.computed(function () {\n        return 'https://inin-static-assets.s3.amazonaws.com/msteams-integration/msteams-icon.png';\n    }),\n\n    /**\n     * Provider label\n     */\n    label: Ember.computed(function () {\n        return this.get('intl').t('mediaProviders.teams.label').toString();\n    }),\n\n    profile: Ember.computed(\n        'user.profile.content',\n        'user.profile.content.preferences.preferences.@each.value',\n        function () {\n            return this.get('user.profile.content');\n        }\n    ),\n\n    haveAccess: Ember.computed.readOnly('permissions.canViewTeamsMeetings'),\n\n    /**\n     * This is remnant from Zoom provider. Leaving it here and defaulting as false as we\n     * may implement a MS Teams Meeting embedded within Genesys Cloud.\n     */\n    haveEmbeddedClientAccess: false,\n\n    /**\n     * Data is used in chat service's sendVideoProviderNotification method to build stanza.\n     * This is set during runtime.\n     */\n    data: Ember.computed('profile', 'user.id', function () {\n        return {};\n    }),\n\n    notification: Ember.computed('data', function () {\n        let key = 'mediaProviders.teams.defaultNotification';\n        return this.get('intl')\n            .t(key, { meetingUrl: this.get('data.url') })\n            .toString();\n    })\n});\n","export function queryParamsToObject(params) {\n    if (!params) {\n        return {};\n    }\n\n    return params.split('&').reduce((acc, param) => {\n        let keyValue = param.split('=');\n        if (keyValue.length === 2) {\n            let [key, value] = keyValue;\n            acc[key] = value;\n        }\n        return acc;\n    }, {});\n}\n\nexport function buildAuthUrl(baseUrl, authConfig) {\n    let query = Object.keys(authConfig)\n        .map(key => {\n            let value = authConfig[key];\n            return `${key}=${value}`;\n        })\n        .join('&');\n    return `${baseUrl}?${query}`;\n}\n\nexport function performIframeAuth(authUrl, authConfig) {\n    return new Promise((resolve, reject) => {\n        let url = buildAuthUrl(authUrl, authConfig);\n\n        let iframe = document.createElement('iframe');\n        iframe.style = 'height:0;width:0;position:absolute;z-index:0';\n        iframe.src = url;\n        document.body.appendChild(iframe);\n\n        let timer, cancelTimer;\n\n        timer = setInterval(function () {\n            try {\n                if (iframe) {\n                    let hash = iframe.contentWindow.location.hash;\n                    let search = iframe.contentWindow.location.search;\n                    if (hash) {\n                        let params = queryParamsToObject(hash.substring(1));\n                        let accessToken = params['access_token'];\n                        if (accessToken) {\n                            document.body.removeChild(iframe);\n                            clearInterval(timer);\n                            clearTimeout(cancelTimer);\n                            resolve(accessToken);\n                        }\n                    }\n                    if (search) {\n                        let params = queryParamsToObject(search.substring(1));\n                        let code = params['code'];\n                        if (code) {\n                            clearInterval(timer);\n                            clearTimeout(cancelTimer);\n                            document.body.removeChild(iframe);\n                            resolve(code);\n                        }\n                    }\n                }\n            } catch (e) {\n                // Ignore for now\n            }\n        }, 20);\n\n        // After 5 seconds, if we havent resolved, exit\n        // A properly authed client shouldnt take long on the redirect\n        cancelTimer = setTimeout(function () {\n            window.clearTimeout(cancelTimer);\n            window.clearInterval(timer);\n            reject(new Error('Timeout'));\n        }, 5000);\n    });\n}\n","import Ember from 'ember';\nimport Provider from './provider';\n\nexport default Provider.extend({\n    apps: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    mediaProviders: Ember.inject.service(),\n\n    id: 'zoom',\n    type: 'video',\n    component: 'zoom-panel',\n\n    settings: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('settings', {});\n    },\n\n    launchVideoImage: Ember.computed(function () {\n        return 'https://inin-static-assets.s3.amazonaws.com/zoom-integration/zoom-lg.png';\n    }),\n\n    label: Ember.computed(function () {\n        return this.get('intl').t('mediaProviders.zoom.label').toString();\n    }),\n\n    profile: Ember.computed(\n        'user.profile.content',\n        'user.profile.content.preferences.preferences.@each.value',\n        function () {\n            return this.get('user.profile.content');\n        }\n    ),\n\n    haveAccess: Ember.computed.readOnly('permissions.canViewZoomMeetings'),\n    useCollaborateChat: Ember.computed.readOnly('session.useCollaborateChat'),\n\n    haveEmbeddedClientAccess: false,\n\n    // Data is used by the chat widget sender to build stanza\n    // This is set during runtime\n    data: Ember.computed('profile', 'user.id', function () {\n        return {};\n    }),\n\n    notification: Ember.computed('data', function () {\n        let key = 'mediaProviders.zoom.defaultNotification';\n        return this.get('intl')\n            .t(key, { meetingUrl: this.get('data.url') })\n            .toString();\n    })\n});\n","import Ember from 'ember';\nimport netUtils from 'ember-purecloud-components/utils/net';\n\nconst { inject } = Ember;\nconst INTERNAL_DL_MATCHER = /\\/api\\/v[12]\\/downloads\\/([\\w-+]+).*$/i;\n\nexport default Ember.Mixin.create({\n    session: inject.service(),\n    logger: inject.service('stash-logger'),\n    application: inject.service(),\n\n    embeddedUrl: function (imageUrl) {\n        const url = imageUrl;\n        const isLocal = this.get('application.runtime.local');\n\n        if (!url || isLocal) {\n            return url;\n        }\n\n        try {\n            // Only transform internal PC urls\n            if (!netUtils.isExternalDomain(url)) {\n                const matches = INTERNAL_DL_MATCHER.exec(url);\n                if (matches && matches[1]) {\n                    const id = matches[1];\n                    return `${this.get('application').pcV2Uri([\n                        'api/v2/apps/downloads',\n                        id\n                    ])}?contentDisposition=INLINE`;\n                }\n            }\n        } catch (error) {\n            // Failed to check URL, returning unmodified url below\n            this.get('logger').info(`ACD embeddedUrl`, {\n                error,\n                imageUrl: url\n            });\n            return url;\n        }\n        return url;\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from 'connections-ui/utils/dates';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nexport default Ember.Mixin.create(LoggerMixin, {\n    notification: Ember.inject.service('notification-proxy'),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    personGuid: Ember.computed.reads('session.person.guid'),\n\n    // TODO: Ultimately, we need to store these values somewhere other\n    // than the model. We may introduce a persistance service that will\n    // allow us to store interaction properties by id and persist them\n    // back to the public API via the preference API.\n    modelSet(model, property, value) {\n        if (model && !Ember.get(model, 'isDestroyed') && !Ember.get(model, 'isDestroying')) {\n            model.set(property, value);\n        }\n    },\n\n    _displayApiError(error, fallbackMessageKey) {\n        const code = _.get(error, 'responseJSON.code');\n        const key = code && `error.${code}`;\n        this._displayError(key && this.get('intl').exists(key) ? key : fallbackMessageKey);\n    },\n\n    _displayError(messageKey, messageKeyOption) {\n        const message = this.get('intl').t(messageKey, messageKeyOption).toString();\n        this.get('notification').error(null, message, {});\n    },\n\n    _displayNotification(titleKey, messageKey) {\n        let title = null;\n        let message = null;\n\n        if (titleKey) {\n            title = this.get('intl').t(titleKey).toString();\n        }\n\n        if (messageKey) {\n            message = this.get('intl').t(messageKey).toString();\n        }\n\n        this.get('notification').info(title, message);\n    },\n\n    _isInDOM() {\n        const isDestroyed =\n            this.get('isDestroyed') ||\n            this.get('isDestroying') ||\n            !this.get('interaction') ||\n            this.get('interaction.isDestroyed') ||\n            this.get('interaction.isDestroying');\n\n        if (isDestroyed) {\n            return false;\n        } else if (this.get('interaction.isCall')) {\n            const conversation = this.get('interaction.conversation');\n            const conversationIsDestroyed =\n                !conversation || conversation.get('isDestroying') || conversation.get('isDestroyed');\n            if (conversationIsDestroyed) {\n                return false;\n            }\n        }\n\n        return true;\n    },\n\n    getInteractionTypeFromCP(interaction) {\n        let type = {\n            isCall: false,\n            isFax: false,\n            isChat: false,\n            isEmail: false,\n            isCallback: false,\n            isSms: false\n        };\n        const myselfAgent = _.findLast(interaction.participants, party => {\n            let partyIsUser = _.has(party, 'userId') ? party.userId === this.get('personGuid') : false;\n            let partyIsAgent = _.has(party, 'purpose') ? party.purpose.toLowerCase() === 'agent' : false;\n            return partyIsUser && partyIsAgent;\n        });\n        type.isCallback = myselfAgent ? _.has(myselfAgent, 'callbacks') && myselfAgent.callbacks.length : false;\n        type.isCall = _.some(interaction.participants, party => !_.isEmpty(party.calls));\n        type.isFax = _.some(interaction.participants, party =>\n            _.has(party, 'purpose') ? party.purpose === 'fax' : false\n        );\n        type.isChat = _.some(interaction.participants, party => !_.isEmpty(party.chats));\n        type.isEmail = _.some(interaction.participants, party => !_.isEmpty(party.emails));\n        type.isSms = _.some(interaction.participants, party => !_.isEmpty(party.messages));\n\n        return type;\n    },\n\n    handleMissedTimedBoxTimer(ctx, payload, Interaction, conversationModel) {\n        try {\n            const tmpInteractionModel = Interaction.create(payload, Ember.getOwner(ctx).ownerInjection());\n\n            if (tmpInteractionModel && conversationModel) {\n                Ember.set(tmpInteractionModel, 'conversation', conversationModel);\n            }\n\n            const interactionHasMissedTimer = Ember.get(tmpInteractionModel, 'hasMissedTimer');\n\n            if (tmpInteractionModel && interactionHasMissedTimer) {\n                const titleKey = 'purecloud.acdInteraction.aftercallworkTitleMessage';\n                const messageKey = 'purecloud.acdInteraction.aftercallworkTimerExpiredBodyMessage';\n                this._displayNotification(titleKey, messageKey);\n            }\n            if (tmpInteractionModel) {\n                Ember.run.later(() => {\n                    tmpInteractionModel.destroy();\n                });\n            }\n        } catch (error) {\n            this.logger.info('ACD: handleMissedBoxTimer error', { error });\n        }\n    },\n\n    windowInFocus() {\n        var hosted;\n        hosted = this.get('applicationService.hostedContext');\n        if (hosted != null ? hosted.isHosted() : void 0) {\n            return hosted.applicationHasFocus();\n        } else {\n            return document.hasFocus();\n        }\n    },\n\n    timeDiff(timeCreated) {\n        const diff = moment().diff(timeCreated);\n        if (diff < 500) {\n            this.logger.info('ACD: interaction create destroy diff', { diff });\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst { computed } = Ember;\n\nfunction maybeLowerCase(str) {\n    return str && str.toLowerCase();\n}\n\nexport default Ember.Mixin.create({\n    notes: null,\n    selectedWrapupCode: null,\n    wrapupNotSaved: true,\n    oldWrapupCode: null,\n    skipAfterCallWork: false,\n    isAfterCallWorkTimerExpired: false,\n\n    isWrapupCodeSet: computed.notEmpty('selectedWrapupCode'),\n    isNotesSet: computed.notEmpty('notes'),\n    activeCallWorkCompleted: computed.reads('participantForCurrentUser.wrapup.code'),\n\n    activeCallWorkNeeded: computed('activeCallWorkCompleted', 'participantForCurrentUser.wrapupRequired', function () {\n        return !this.get('activeCallWorkCompleted') && this.get('participantForCurrentUser.wrapupRequired');\n    }),\n\n    canUseCommunicationACW: false,\n\n    canAgentRequestACW: computed.and('canUseCommunicationACW', 'useCommunicationACW', 'isWrapupPromptAgentRequested'),\n\n    useCommunicationACW: computed('canUseCommunicationACW', 'isWrapupPromptAgentRequested', function () {\n        if (this.get('canUseCommunicationACW') && this.get('isWrapupPromptAgentRequested')) {\n            return true;\n        }\n\n        return this.get('canUseCommunicationACW');\n    }),\n\n    isAfterCallWorkCompleted: computed(\n        'participantForCurrentUser.wrapup',\n        'participantForCurrentUser.wrapupRequired',\n        'skipAfterCallWork',\n        'isCommunicationAfterCallWorkCompleted',\n        'useCommunicationACW',\n        function () {\n            if (this.get('useCommunicationACW')) {\n                return this.get('isCommunicationAfterCallWorkCompleted');\n            }\n\n            if (!this.get('participantForCurrentUser.wrapupRequired')) {\n                return true;\n            } else if (this.get('participantForCurrentUser.wrapup') || this.get('skipAfterCallWork')) {\n                return true;\n            }\n            return false;\n        }\n    ),\n\n    communicationMedia: computed(\n        'participantForCurrentUser.calls.firstObject.wrapup',\n        'participantForCurrentUser.chats.firstObject.wrapup',\n        'participantForCurrentUser.emails.firstObject.wrapup',\n        'participantForCurrentUser.messages.firstObject.wrapup',\n        'participantForCurrentUser.callbacks.firstObject.wrapup',\n        'isChat',\n        'isCall',\n        'isCallback',\n        'isEmail',\n        'isSms',\n        function () {\n            let communicationObj = null;\n            if (this.get('isCall')) {\n                communicationObj = this.get('participantForCurrentUser.calls.firstObject');\n            } else if (this.get('isChat')) {\n                communicationObj = this.get('participantForCurrentUser.chats.firstObject');\n            } else if (this.get('isEmail')) {\n                communicationObj = this.get('participantForCurrentUser.emails.firstObject');\n            } else if (this.get('isSms')) {\n                communicationObj = this.get('participantForCurrentUser.messages.firstObject');\n            } else if (this.get('isCallback')) {\n                communicationObj = this.get('participantForCurrentUser.callbacks.firstObject');\n            }\n            return communicationObj;\n        }\n    ),\n\n    isCommunicationAfterCallWorkCompleted: computed(\n        'communicationMedia.wrapup',\n        'participantForCurrentUser.wrapupRequired',\n        'skipAfterCallWork',\n        'canAgentRequestACW',\n        function () {\n            if (this.get('canAgentRequestACW')) {\n                if (!this.get('communicationMedia.afterCallWorkRequired')) {\n                    return true;\n                }\n            } else if (!this.get('participantForCurrentUser.wrapupRequired')) {\n                return true;\n            }\n\n            return !!this.get('communicationMedia.wrapup') || this.get('skipAfterCallWork');\n        }\n    ),\n\n    isCommunicationAfterCallWorkRequested: computed.bool('connectedCommunication.afterCallWorkRequired'),\n\n    isAfterCallWorkMandatory: computed(\n        'isCall',\n        'conversation.isAfterCallWorkMandatory',\n        'isCallback',\n        'participantForCurrentUser.wrapupPrompt',\n        'isNonDiscretionaryCompletion',\n        'canUseCommunicationACW',\n        'dialerPreview',\n        function () {\n            const wrapupPrompt = (this.get('participantForCurrentUser.wrapupPrompt') || '').toLowerCase();\n            if (this.get('isCallback')) {\n                return wrapupPrompt === 'mandatory' || this.get('dialerPreview');\n            } else if (this.get('isCall')) {\n                return this.get('conversation.isAfterCallWorkMandatory');\n            } else {\n                if (this.get('canUseCommunicationACW')) {\n                    return wrapupPrompt === 'mandatory' || this.get('isNonDiscretionaryCompletion');\n                }\n                return wrapupPrompt === 'mandatory' || wrapupPrompt === 'timeout' || wrapupPrompt === 'forcedtimeout';\n            }\n        }\n    ),\n\n    isAfterCallWorkForcedTimeout: computed(\n        'isCall',\n        'conversation.isAfterCallWorkForcedTimeout',\n        'participantForCurrentUser.wrapupPrompt',\n        'canUseCommunicationACW',\n        function () {\n            if (this.get('isCall')) {\n                return this.get('conversation.isAfterCallWorkForcedTimeout');\n            } else {\n                if (this.get('canUseCommunicationACW')) {\n                    const prompt = (this.get('participantForCurrentUser.wrapupPrompt') || '').toLowerCase();\n                    return this.get('participantForCurrentUser.wrapupTimeoutMs') && prompt === 'forcedtimeout';\n                } else {\n                    return false;\n                }\n            }\n        }\n    ),\n\n    isAfterCallWorkTimeout: computed(\n        'isCall',\n        'conversation.isAfterCallWorkTimeout',\n        'participantForCurrentUser.wrapupPrompt',\n        'canUseCommunicationACW',\n        function () {\n            if (this.get('isCall')) {\n                return this.get('conversation.isAfterCallWorkTimeout');\n            } else {\n                if (this.get('canUseCommunicationACW')) {\n                    const prompt = (this.get('participantForCurrentUser.wrapupPrompt') || '').toLowerCase();\n                    return this.get('participantForCurrentUser.wrapupTimeoutMs') && prompt === 'timeout';\n                } else {\n                    return false;\n                }\n            }\n        }\n    ),\n\n    isNonDiscretionaryCompletion: computed(\n        'isCall',\n        'conversation.isNonDiscretionaryCompletion',\n        'isWrapupPromptAgentRequested',\n        'isAfterCallWorkForcedTimeout',\n        'isAfterCallWorkTimeout',\n        'canUseCommunicationACW',\n        function () {\n            if (this.get('isCall')) {\n                return this.get('conversation.isNonDiscretionaryCompletion');\n            } else {\n                if (this.get('canUseCommunicationACW')) {\n                    return (\n                        this.get('isAfterCallWorkForcedTimeout') ||\n                        this.get('isAfterCallWorkTimeout') ||\n                        this.get('isWrapupPromptAgentRequested')\n                    );\n                } else {\n                    return false;\n                }\n            }\n        }\n    ),\n\n    isWrapupPromptAgentRequested: computed('participantForCurrentUser.wrapupPrompt', function () {\n        const wrapupPrompt = maybeLowerCase(this.get('participantForCurrentUser.wrapupPrompt'));\n        return wrapupPrompt === 'agentrequested';\n    }),\n\n    hasMissedTimer: computed('participantForCurrentUser.wrapup.code', 'isNonDiscretionaryCompletion', function () {\n        return (\n            this.get('participantForCurrentUser.wrapup.code') === 'ININ-WRAP-UP-TIMEOUT' &&\n            this.get('isNonDiscretionaryCompletion')\n        );\n    })\n});\n","import { computed, get } from '@ember/object';\nimport Mixin from '@ember/object/mixin';\nimport { inject } from '@ember/service';\nimport findLast from 'lodash/findLast';\nimport last from 'lodash/last';\nimport reject from 'lodash/reject';\nimport { getTrueCustomerIfMultipleCustomersExist } from 'connections-ui/utils/acd';\n\nconst MACHINE_PARTICIPANTS = ['acd', 'ivr', 'dialer.system'];\n\nconst CUSTOMER_PARTICIPANTS = ['manual', 'inbound', 'dialer', 'customer', 'external'];\n\nconst MEDIA_TYPES = ['chats', 'calls', 'callbacks', 'emails', 'screenshares', 'cobrowsesessions', 'videos'];\n\nexport default Mixin.create({\n    session: inject('session'),\n\n    isCustomerParticipant(participant) {\n        return CUSTOMER_PARTICIPANTS.includes(participant.purpose);\n    },\n\n    isMachineParticipant(participant) {\n        return MACHINE_PARTICIPANTS.includes(participant.purpose);\n    },\n\n    isAgentParticipant(participant) {\n        return participant.purpose === 'agent';\n    },\n\n    isCurrentUserOrMachineParticipant(participant) {\n        return (\n            ((participant.purpose === 'user' || participant.purpose === 'agent') &&\n                participant.userId === this.get('participantForCurrentUser.userId')) ||\n            participant.userId === this.get('session.person.guid') ||\n            this.isMachineParticipant(participant)\n        );\n    },\n\n    /**\n     * Determines who the host participant should be based on the participant array order\n     * and if the participant is an agent and is also human and connected.\n     *\n     * Currently returning `null` to eliminate any role assumptions for participants.\n     * Keeping this around to expand upon when the backend implements participant roles\n     * for a conversation.\n     */\n    hostParticipant: computed('allHumanConnectedParticipants.[]', function () {\n        return null;\n\n        // TODO: Update when the backend provides the participant roles\n        // const participants = this.get('allHumanConnectedParticipants') || [];\n        // for (const participant of participants) {\n        //     const isAgent = participant.purpose === 'agent';\n        //     if (isAgent) {\n        //         return participant;\n        //     }\n        // }\n    }),\n\n    // Human Participants with purpose 'manual', 'inbound', 'dialer', 'customer', or 'external\n    customerParticipants: computed('participants.@each.purpose', function () {\n        const participants = this.get('participants') || [];\n        return participants.filter(participant => this.isCustomerParticipant(participant));\n    }),\n\n    agentParticipants: computed('participants.@each.purpose', function () {\n        const participants = this.get('participants') || [];\n        return participants.filter(participant => this.isAgentParticipant(participant));\n    }),\n\n    // Human participants that are not the current user\n    otherParticipants: computed('participants.@each.{purpose,userId}', function () {\n        return reject(this.get('participants'), participant => {\n            return this.isCurrentUserOrMachineParticipant(participant);\n        });\n    }),\n\n    // Connected Human Participants and customers (regardless of connection status)\n    otherConnectedParticipants: computed('otherParticipants.@each.endTime', function () {\n        return reject(this.get('otherParticipants'), participant => {\n            // Reject participant if disconnected or a monitoring\n            // participant and not a customer.\n            const isDisconnected = !!participant.endTime;\n\n            // TODO: The public api will eventually filter these out.\n            // This can be removed when that is done.\n            const isMonitored = !!participant.monitoredParticipantId;\n            const isCoached = !!participant.coachedParticipantId;\n            const isBarged = !!participant.bargedParticipantId;\n\n            return isDisconnected || isMonitored || isCoached || isBarged;\n        });\n    }),\n\n    // Connected Human Participants and customers (regardless of connection status)\n    allHumanConnectedParticipants: computed('participants.@each.{purpose,userId,endTime}', function () {\n        return reject(this.get('participants'), participant => {\n            const isDisconnected = !!participant.endTime;\n            const isMonitored = !!participant.monitoredParticipantId;\n            const isCoached = !!participant.coachedParticipantId;\n            return isDisconnected || isMonitored || isCoached || this.isMachineParticipant(participant);\n        });\n    }),\n\n    /**\n     * All participants that should be showing up in a potential conference.\n     * Note that the participant that is being connecting should not show up if they are being connected\n     * through and queue that is also connected.\n     */\n    allConferenceParticipants: computed(\n        'participants.[]',\n        'participants.@each.{purpose,userId,endTime,queueId,coachedParticipantId,monitoredParticipantId}',\n        function () {\n            const participants = this.get('participants') || [];\n            const connectingQueue = new Map();\n            return participants.filter(participant => {\n                if (this.isMachineParticipant(participant)) {\n                    // Filter out any callback typed machine participants\n                    if (participant['callbacks']) {\n                        return false;\n                    } else if (participant.endTime) {\n                        connectingQueue.delete(participant.queueId);\n                    } else if (!connectingQueue.has(participant.queueId)) {\n                        connectingQueue.set(participant.queueId, participant);\n                        return true;\n                    }\n                }\n\n                if (participant.endTime || participant.monitoredParticipantId || participant.coachedParticipantId) {\n                    return false;\n                } else if (connectingQueue.has(participant.queueId)) {\n                    return false;\n                }\n\n                return true;\n            });\n        }\n    ),\n\n    participantForCustomer: computed(\n        'participants.@each.{purpose,userId,endTime,monitoredParticipantId,coachedParticipantId,bargedParticipantId}',\n        'session.person.guid',\n        'onConsult',\n        'consultParticipant',\n        'otherConnectedParticipants.[]',\n        'isDisconnected',\n        'isTerminated',\n        'isCall',\n        function () {\n            const consultParticipantId = this.get('consultParticipantId');\n            if (consultParticipantId) {\n                const participants = this.get('participants') || [];\n                const trueCustomerParticipant = participants.findBy('id', consultParticipantId);\n                if (trueCustomerParticipant) {\n                    return trueCustomerParticipant;\n                }\n            }\n\n            if (this.get('onConsult') && this.get('consultParticipant')) {\n                return this.get('consultParticipant');\n            }\n\n            let participantCaller = null;\n\n            const customer = findLast(this.get('participants'), participant => {\n                const isCurrentUser = this.get('session.person.guid') === participant.userId;\n\n                /**\n                 * Solely used for determining the edge-case of a queue calling a queue.\n                 * We do not want to return the current user\n                 */\n                // TODO: Remove the `else if` portion of this statement when the `if` feature toggle is removed.\n                if (!isCurrentUser) {\n                    if (\n                        (this.get('session.features.interactionNameQueueCallingQueue') &&\n                            participant.purpose === 'acd' &&\n                            get(participant, 'calls.firstObject.direction') === 'inbound') ||\n                        (participant.purpose === 'agent' &&\n                            get(participant, 'calls.firstObject.direction') === 'outbound')\n                    ) {\n                        participantCaller = participant;\n                    }\n                }\n\n                const isExternalCustomer = CUSTOMER_PARTICIPANTS.includes(participant.purpose);\n                const isInternalCustomer = !isCurrentUser && participant.purpose === 'user';\n\n                return (\n                    !participant.monitoredParticipantId &&\n                    !participant.coachedParticipantId &&\n                    !participant.bargedParticipantId &&\n                    (isExternalCustomer || isInternalCustomer)\n                );\n            });\n\n            if (customer && customer.endTime) {\n                const nextConnectedParticipant = this.get('otherConnectedParticipants.firstObject');\n                const isDisconnected = this.get('isDisconnected') || this.get('isTerminated');\n\n                if (nextConnectedParticipant && !isDisconnected) {\n                    return nextConnectedParticipant;\n                }\n            }\n\n            /**\n             * If we still don't have a customer at this point\n             * then consider the scenario where this may be an agent\n             * calling a queue on behalf of a queue so we are identifying\n             * the caller as the `customer`\n             */\n            if (!customer && this.get('isCall') && participantCaller) {\n                return participantCaller;\n            }\n\n            if (customer) {\n                /**\n                 * if there are multiple customers in the participants list the customer returned above is likely incorrect\n                 * if it is not a user participant. In that case the getTrueCustomerIfMultipleCustomersExist will return the\n                 * last connected true customer participant - if there is only one customer participant - getTrueCustomerIfMultipleCustomersExist\n                 * returns nothing and the value of customer falls through\n                 */\n                const customerParticipant = getTrueCustomerIfMultipleCustomersExist(this);\n                if (customer.purpose !== 'user' && customerParticipant) {\n                    return customerParticipant;\n                }\n            }\n\n            return customer;\n        }\n    ),\n\n    /**\n     * Returns all of the active participants. Active is described as trying to connect or connected.\n     * It does not include any participants who have an endTime.\n     * The id's returned supported external, user, or queue with a regular `id` fallback.\n     *\n     * [ACE-3276] If an incoming customer who is not associated with an external contact yet may not have\n     * any other form of id other than the base `id` or `queueId` it came from.\n     */\n    activeParticipantIds: computed('participants.[]', function () {\n        const participants = this.get('participants') || [];\n        return participants.reduce((filtered, participant) => {\n            const { endTime, externalContactId, userId, queueId, id, purpose } = participant;\n            if (!endTime) {\n                if (['agent', 'user'].includes(purpose) && userId) {\n                    filtered.push(userId);\n                } else if (['acd'].includes(purpose) && queueId) {\n                    filtered.push(queueId);\n                } else if (CUSTOMER_PARTICIPANTS.includes(purpose) && externalContactId) {\n                    filtered.push(externalContactId);\n                } else {\n                    filtered.push(id);\n                }\n            }\n            return filtered;\n        }, []);\n    }),\n\n    participantsForCurrentUser: computed('participants.@each.{purpose,userId}', 'session.person.guid', function () {\n        const participants = this.get('participants') || [];\n        return participants.filter(participant => {\n            const purpose = participant.purpose;\n            const participantUserId = participant.userId;\n            const userId = this.get('session.person.guid');\n            return userId === participantUserId && (purpose === 'user' || purpose === 'agent');\n        });\n    }),\n\n    getFirstStuckParticipant: function () {\n        const currentUserParticipants = this.get('participantsForCurrentUser');\n\n        const stuckParticipant = currentUserParticipants.find(participant => {\n            const hasActivePrimary = this._doesParticipantHaveActivePrimaryMedia(participant);\n            const hasActiveSessionShare = this._doesParticipantHaveActiveSessionShare(participant);\n            return !hasActivePrimary && hasActiveSessionShare;\n        });\n        return stuckParticipant;\n    },\n\n    participantForCurrentUser: computed('participantsForCurrentUser.@each.wrapup', function () {\n        const currentUserParticipants = this.get('participantsForCurrentUser');\n\n        // alerting interactions\n\n        const lastAlertingParticipant = findLast(currentUserParticipants, participant => {\n            return findLast(MEDIA_TYPES, type => {\n                if (participant[type]) {\n                    return findLast(participant[type], media => {\n                        return media.state.toLowerCase() === 'alerting';\n                    });\n                }\n            });\n        });\n\n        if (lastAlertingParticipant) {\n            return lastAlertingParticipant;\n        }\n\n        // non-disconnected interactions\n\n        const lastNonDisconnectedParticipant = findLast(currentUserParticipants, participant => {\n            return findLast(MEDIA_TYPES, type => {\n                if (participant[type]) {\n                    return findLast(participant[type], media => {\n                        return (\n                            media.state.toLowerCase() !== 'disconnected' && media.state.toLowerCase() !== 'terminated'\n                        );\n                    });\n                }\n            });\n        });\n\n        if (lastNonDisconnectedParticipant) {\n            return lastNonDisconnectedParticipant;\n        }\n\n        // disconnected interactions\n\n        const lastCurrentUserNeedingWrapup = findLast(currentUserParticipants, participant => {\n            return participant.wrapupRequired && !participant.wrapup;\n        });\n\n        // If everyone has a wrapup code\n        if (!lastCurrentUserNeedingWrapup) {\n            return last(currentUserParticipants);\n        }\n\n        // If participant needs wrapup\n        // return lastCurrentUserNeedingWrapup;\n\n        // If we reach this point then this means that:\n        // 1) All agent participants have wrapped up and therefore should be disconnected\n        // 2) All agent participants have no active callbacks\n        // In this case we are (may be) dealing with a stuck interaction that conversation service still believes is active.\n\n        // Let's get the first participant for the agent with a stuck interaction\n        // TODO: confirm that first object is latest added by conversation service.\n        return lastCurrentUserNeedingWrapup || this.getFirstStuckParticipant();\n    }),\n\n    participantsForACD: computed('participants.@each.purpose', function () {\n        const participants = this.get('participants') || [];\n        return participants.filter(participant => participant.purpose === 'acd');\n    }),\n\n    participantForQueue: computed.alias('participantsForACD.lastObject'),\n\n    dialerParticipant: computed('participants.@each.purpose', function () {\n        const participants = this.get('participants') || [];\n        return participants.find(participant => participant.purpose === 'dialer');\n    }),\n\n    /**\n     * Iterates through the participants in reverse to find the last/newest participant that is\n     * considered either a machine or agent. Used to determine if the interaction is being transferred.\n     * The return breaks the for loop in this instance to it will only iterates as long as it needs to.\n     */\n    transferringToParticipant: computed('participants.[]', 'activeAttendedTransfer', function () {\n        const activeTransfer = this.get('activeAttendedTransfer');\n        const destination = activeTransfer ? activeTransfer.destination : null;\n        if (!destination) return null;\n\n        const participants = this.get('participants') || [];\n        // we want to look at the participants in reverse order to find newest reference\n        for (let i = participants.length - 1; i >= 0; i--) {\n            const participant = participants[i];\n            if (participant.userId === destination.userId) {\n                return participant;\n            }\n        }\n        // participant not found.\n        return null;\n    })\n});\n","import Ember from 'ember';\nimport { isRoomJid } from 'ember-purecloud-components/utils/jid-helpers';\nimport isEmpty from 'lodash/isEmpty';\nimport maxBy from 'lodash/maxBy';\nimport moment from 'connections-ui/utils/dates';\n\nconst { computed } = Ember;\n\nconst PROVIDER_MEDIATYPE = {\n    COBROWSE: 'PureCloud Co-browse',\n    SCREENSHARE: 'PureCloud WebRTC screen-share',\n    VIDEO: 'PureCloud WebRTC video'\n};\n\nfunction aggregateMedia(screenShares, cobrowsesessions, videos) {\n    // Ensure provider is identified in array items.\n    // This step could be skipped if backend does not remove provider info\n    (screenShares || []).forEach(mediaObj => {\n        if (!mediaObj.mediaType) {\n            mediaObj.mediaType = PROVIDER_MEDIATYPE.SCREENSHARE;\n        }\n    });\n\n    (cobrowsesessions || []).forEach(mediaObj => {\n        if (!mediaObj.mediaType) {\n            mediaObj.mediaType = PROVIDER_MEDIATYPE.COBROWSE;\n        }\n    });\n\n    (videos || []).forEach(mediaObj => {\n        if (!mediaObj.mediaType) {\n            mediaObj.mediaType = PROVIDER_MEDIATYPE.VIDEO;\n        }\n    });\n\n    let allMedia = [];\n    if (screenShares) {\n        allMedia = allMedia.concat(screenShares);\n    }\n    if (cobrowsesessions) {\n        allMedia = allMedia.concat(cobrowsesessions);\n    }\n    if (videos) {\n        allMedia = allMedia.concat(videos);\n    }\n\n    return allMedia;\n}\n\nfunction getMediaObject(mediaArray) {\n    // This function identifies the current active media\n    // object from mediaArray mediaArray is expected to contain\n    // the secondary media types within a participant i.e screenShares,\n    // cobrowseSessions, videos etc.\n\n    // Get media with latest connected Time\n    const mediaWithlatestConnectedTime = maxBy(mediaArray, function (mediaObj) {\n        if (mediaObj && mediaObj.connectedTime) {\n            return moment(mediaObj.connectedTime).unix();\n        }\n        return 0;\n    });\n\n    // Get media with latest disconnected time\n    const mediaWithlatestDisconnectedTime = maxBy(mediaArray, function (mediaObj) {\n        if (mediaObj && mediaObj.disconnectedTime) {\n            return moment(mediaObj.disconnectedTime).unix();\n        }\n        return 0;\n    });\n\n    // Get latest active media\n    const maxConnectedTime = moment(\n        mediaWithlatestConnectedTime && mediaWithlatestConnectedTime.connectedTime\n            ? mediaWithlatestConnectedTime.connectedTime\n            : 0\n    );\n    const maxDisconnectedTime = moment(\n        mediaWithlatestDisconnectedTime && mediaWithlatestDisconnectedTime.disconnectedTime\n            ? mediaWithlatestDisconnectedTime.disconnectedTime\n            : 0\n    );\n\n    const activeMedia = maxConnectedTime.isAfter(maxDisconnectedTime)\n        ? mediaWithlatestConnectedTime\n        : mediaWithlatestDisconnectedTime;\n\n    return activeMedia;\n}\n\nexport default Ember.Mixin.create({\n    ajax: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    sessionShareCode: null,\n    isSessionCodeRequired: false,\n\n    isSessionSharing: false,\n    isRequestingEndSessionShare: false,\n\n    sessionShareDisconnectTimer: null,\n    sessionShareExplicitlyInitiated: false,\n    sessionShareActiveOnLoad: false,\n    isCobrowseV2Disconnected: false,\n    isCobrowseV2: false,\n\n    // feature toggles & permissions\n\n    canScreenShareOnCall: computed.and('isCall', 'permissions.canViewAcdScreenShare'),\n    canScreenShareOnChat: computed.and('isChat', 'permissions.canViewAcdScreenShare'),\n    canCobrowseOnCall: computed.and('isCall', 'permissions.canViewAcdCoBrowseForCall'),\n    canCobrowseOnChat: computed.and('isChat', 'permissions.canViewAcdCoBrowseForChat'),\n\n    // State\n\n    isRequestingScreenShareOrCoBrowse: false,\n    isRequestingVideo: false,\n\n    sessionShareState: computed.reads('mostRecentAgentSessionShare.state'),\n    customerShareState: computed.reads('mostRecentCustomerSessionShare.state'),\n    hasSessionShareCode: computed.notEmpty('sessionShareCode'),\n    sessionShareActive: computed.or('isRequestingSessionShare', 'hasSessionShareCode', 'isSessionSharing'),\n    isRequestingSessionShare: computed.or('isRequestingScreenShareOrCoBrowse', 'isRequestingVideo'),\n\n    isSessionShareConnected: computed('sessionShareState', 'isV2Provider', function () {\n        const state = this.get('sessionShareState') || '';\n        return state.toLowerCase() === 'connected';\n    }),\n\n    isSessionShareDisconnected: computed('sessionShareState', 'isRequestingNewSessionShare', function () {\n        const state = this.get('sessionShareState') || '';\n        return state.toLowerCase() === 'disconnected' && !this.get('isRequestingNewSessionShare');\n    }),\n\n    isCustomerInSessionShare: computed('customerShareState', 'isSessionSharing', function () {\n        let state = this.get('customerShareState') || '';\n        return this.get('isSessionSharing') && state.toLowerCase() === 'connected';\n    }),\n\n    isCustomerDisconnectedFromSharedSession: computed('customerShareState', 'isSessionSharing', function () {\n        let state = this.get('customerShareState') || '';\n        return this.get('isSessionSharing') && state.toLowerCase() === 'disconnected';\n    }),\n\n    isAgentDisconnectedFromSharedSession: computed(\n        'sessionShareState',\n        'isSessionSharing',\n        'isRequestingNewSessionShare',\n        function () {\n            const state = this.get('sessionShareState') || '';\n            return (\n                this.get('isSessionSharing') &&\n                state.toLowerCase() === 'disconnected' &&\n                !this.get('isRequestingNewSessionShare')\n            );\n        }\n    ),\n\n    isWaitingForAgentToConnect: computed(\n        'isSessionShareConnected',\n        'isAgentDisconnectedFromSharedSession',\n        'sessionShareState',\n        'isV2Provider',\n        function () {\n            return !this.get('isSessionShareConnected') && !this.get('isAgentDisconnectedFromSharedSession');\n        }\n    ),\n\n    isWaitingForCustomerToConnect: computed(\n        'isSessionCodeRequired',\n        'isCustomerInSessionShare',\n        'isCustomerDisconnectedFromSharedSession',\n        'isV2Provider',\n        function () {\n            return (\n                this.get('isSessionCodeRequired') &&\n                !this.get('isCustomerInSessionShare') &&\n                !this.get('isCustomerDisconnectedFromSharedSession')\n            );\n        }\n    ),\n\n    hasCustomerJoinedSessionShareRoom: computed('customerShareState', function () {\n        const state = this.get('customerShareState') || '';\n        return state.toLowerCase() === 'connected';\n    }),\n\n    hasAgentJoinedSessionShareRoom: computed('sessionShareState', function () {\n        const state = this.get('sessionShareState') || '';\n        return state.toLowerCase() === 'connected';\n    }),\n\n    sessionShareRoomJid: computed('mostRecentCustomerSessionShare.context', function () {\n        const context = this.get('mostRecentCustomerSessionShare.context');\n        if (context && context.indexOf(':') >= 0) {\n            return context.substring(context.indexOf(':') + 1);\n        } else if (context && isRoomJid(context)) {\n            return context;\n        }\n        return null;\n    }),\n\n    // media objects\n\n    mostRecentAgentSessionShare: computed(\n        'participantForCurrentUser.{videos.[],screenShares.[],screenshares.[],cobrowsesessions.[]}',\n        function () {\n            let screenShares =\n                this.get('participantForCurrentUser.screenShares') ||\n                this.get('participantForCurrentUser.screenshares');\n            let cobrowsesessions = this.get('participantForCurrentUser.cobrowsesessions');\n            let videos = this.get('participantForCurrentUser.videos');\n\n            let allMedia = aggregateMedia(screenShares, cobrowsesessions, videos);\n\n            if (!isEmpty(allMedia)) {\n                const mediaObject = getMediaObject(allMedia);\n                this.get('logger').info('getMediaObject for agent', mediaObject);\n                return mediaObject;\n            }\n            return null;\n        }\n    ),\n\n    mostRecentCustomerSessionShare: computed(\n        'participantForCustomer.{videos.[],screenShares.[],screenshares.[],cobrowsesessions.[]}',\n        function () {\n            let screenShares =\n                this.get('participantForCustomer.screenShares') || this.get('participantForCustomer.screenshares');\n            let cobrowsesessions = this.get('participantForCustomer.cobrowsesessions');\n            let videos = this.get('participantForCustomer.videos');\n\n            let allMedia = aggregateMedia(screenShares, cobrowsesessions, videos);\n\n            if (!isEmpty(allMedia)) {\n                const mediaObject = getMediaObject(allMedia);\n                this.get('logger').info('getMediaObject for customer', mediaObject);\n                return mediaObject;\n            }\n            return null;\n        }\n    ),\n\n    // type\n\n    sessionShareType: computed('isScreenShare', 'isVideoShare', 'isCoBrowse', function () {\n        if (this.get('isScreenShare')) {\n            return 'screen-share';\n        } else if (this.get('isVideoShare')) {\n            return 'video';\n        } else if (this.get('isCoBrowse')) {\n            return 'co-browse';\n        }\n        return null;\n    }),\n\n    canScreenShare: computed.or('canScreenShareOnCall', 'canScreenShareOnChat'),\n    canCobrowse: computed.or('canCobrowseOnCall', 'canCobrowseOnChat'),\n\n    mediaTypeIsScreenShare: computed.equal('mostRecentCustomerSessionShare.mediaType', PROVIDER_MEDIATYPE.SCREENSHARE),\n    mediaTypeIsCobrowse: computed.equal('mostRecentCustomerSessionShare.mediaType', PROVIDER_MEDIATYPE.COBROWSE),\n    mediaTypeIsVideo: computed.equal('mostRecentCustomerSessionShare.mediaType', PROVIDER_MEDIATYPE.VIDEO),\n\n    isScreenShare: computed(\n        'isRequestingScreenShareOrCoBrowse',\n        'isRequestingVideo',\n        'canScreenShare',\n        'mediaTypeIsScreenShare',\n        function () {\n            if (this.get('isRequestingScreenShareOrCoBrowse')) {\n                return true;\n            }\n\n            if (this.get('isRequestingVideo')) {\n                return false;\n            }\n\n            return this.get('canScreenShare') && this.get('mediaTypeIsScreenShare');\n        }\n    ),\n\n    isCoBrowse: computed(\n        'isRequestingVideo',\n        'isRequestingScreenShareOrCoBrowse',\n        'mediaTypeIsCobrowse',\n        'canCobrowse',\n        function () {\n            if (this.get('isRequestingScreenShareOrCoBrowse') || this.get('isRequestingVideo')) {\n                return false;\n            }\n\n            return this.get('canCobrowse') && this.get('mediaTypeIsCobrowse');\n        }\n    ),\n\n    isVideoShare: computed('isRequestingVideo', 'isRequestingScreenShareOrCoBrowse', 'mediaTypeIsVideo', function () {\n        return this.get('isRequestingVideo') && !this.get('isRequestingScreenShareOrCoBrowse');\n    }),\n\n    // permission errors\n\n    hasScreenSharePermissionError: computed.or(\n        'hasCobrowsePermissionError',\n        'hasVideoPermissionError',\n        'hasShareError'\n    ),\n\n    hasCobrowsePermissionError: computed('mediaTypeIsCobrowse', 'canCobrowse', function () {\n        if (this.get('mediaTypeIsCobrowse') && !this.get('canCobrowse')) {\n            this.get('logger').error(\n                'ERROR: setSessionShareType: Co-Browse: Permissions or feature toggle missing to process acd co-browse events.',\n                this.get('id')\n            );\n            return true;\n        }\n        return false;\n    }),\n\n    hasVideoPermissionError: computed('mediaTypeIsVideo', function () {\n        if (this.get('mediaTypeIsVideo')) {\n            this.get('logger').error(\n                'ERROR: setSessionShareType: Video: Permissions or feature toggle missing to process acd video events.',\n                this.get('id')\n            );\n            return true;\n        }\n        return false;\n    }),\n\n    hasShareError: computed('mediaTypeIsScreenShare', 'canScreenShare', function () {\n        if (this.get('mediaTypeIsScreenShare') && !this.get('canScreenShare')) {\n            this.get('logger').error(\n                'ERROR: setSessionShareType: Screen-share: Permissions or feature toggle missing to process acd screen-share events.',\n                this.get('id')\n            );\n            return true;\n        }\n        return false;\n    }),\n\n    // Timers\n\n    sessionShareConnectedTime: computed(\n        'mostRecentAgentSessionShare.connectedTime',\n        'participantForCurrentUser.connectedTime',\n        function () {\n            if (this.get('mostRecentAgentSessionShare.connectedTime')) {\n                return moment(this.get('mostRecentAgentSessionShare.connectedTime'));\n            } else if (this.get('participantForCurrentUser.connectedTime')) {\n                return moment(this.get('participantForCurrentUser.connectedTime'));\n            }\n            return moment();\n        }\n    ),\n\n    sessionShareDuration: computed('mostRecentAgentSessionShare.{disconnectedTime,connectedTime}', function () {\n        const connectedTime = this.get('mostRecentAgentSessionShare.connectedTime');\n        const endTime = this.get('mostRecentAgentSessionShare.disconnectedTime') || moment();\n        if (connectedTime && endTime) {\n            return moment(endTime).diff(moment(connectedTime));\n        }\n        return null;\n    })\n});\n","import Ember from 'ember';\n\nexport default Ember.Mixin.create({\n    intl: Ember.inject.service(),\n    _privacyStatement: Ember.computed('applicationService.locale', function () {\n        return this.get('intl').t('chrome.privacyStatement');\n    }),\n\n    _securityDisclaimer: Ember.computed('applicationService.locale', function () {\n        return this.get('intl').t('signIn.securityDisclaimer');\n    })\n});\n","import Ember from 'ember';\nimport AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';\n\nexport default Ember.Mixin.create(AuthenticatedRouteMixin, {\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    beforeModel: function (transition) {\n        var result = this._super(transition);\n\n        if (transition.isActive) {\n            // Authenticated by Simple Auth\n            result = Ember.RSVP.resolve(result).then(() => {\n                // Authorizing the route\n                if (!this.get('session.hasAppAccess')) {\n                    transition.abort();\n                    this.transitionTo('no-access');\n                    return Ember.RSVP.reject();\n                }\n\n                return true;\n            });\n        }\n\n        return result;\n    }\n});\n","import Ember from 'ember';\n\nconst BatchDataRequestsMixin = Ember.Mixin.create({\n    batchDataRequests: Ember.inject.service(),\n\n    getUser(id) {\n        return this.get('batchDataRequests').getUser(id);\n    },\n\n    refreshUser(id) {\n        return this.get('batchDataRequests').refreshUser(id);\n    },\n\n    getChatUser(jid) {\n        return this.get('batchDataRequests').getChatUser(jid);\n    },\n\n    getGroup(jid) {\n        return this.get('batchDataRequests').getGroup(jid);\n    }\n});\n\nexport default BatchDataRequestsMixin;\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport ChatRoom from '../models/chat-room';\nimport {\n    getEntityObjectId,\n    isPersonJid,\n    isGroupJid,\n    isSupervisorJid\n} from 'ember-purecloud-components/utils/jid-helpers';\n\nconst { RSVP, getOwner } = Ember;\n\nexport default Ember.Mixin.create({\n    presenceSubscription: Ember.inject.service(),\n    batchDataRequests: Ember.inject.service(),\n\n    // this is set in chat service\n    useChatBetaCleanUp: false,\n\n    initRoomCaching: Ember.on('init', function () {\n        return this.set('rooms', Ember.Object.create());\n    }),\n\n    getChatRoom(jid) {\n        return new RSVP.Promise(resolve => {\n            const objectId = getEntityObjectId(jid);\n            let room = this.get(`rooms.${objectId}`);\n            if (room) {\n                if (this.get('useChatBetaCleanUp')) {\n                    const isGroupRoom = !isPersonJid(room.get('jid'));\n                    const passedInJidIsPerson = isPersonJid(jid) && !isSupervisorJid(jid);\n                    if (passedInJidIsPerson && isGroupRoom) {\n                        this.logger.debug(\n                            `<cache-chat-rooms-mixin> Found incorrect chat room with jid\n                            ${room.get('jid')}. Closing the room. Passed in jid is ${jid}`\n                        );\n                        // bad jid from early chat beta\n                        // need to leave the room so it will be deleted on realtime side\n                        this.closeActiveRoom(room);\n\n                        // create the correct 1-1 chat room and store in `rooms` dictionary\n                        const personRoom = ChatRoom.create({ jid, objectId }, getOwner(this).ownerInjection());\n                        Ember.set(this.rooms, objectId, personRoom, true);\n\n                        // shouldn't need to run this feature toggle check but to be safe\n                        if (this.get('useCollaborateChat')) {\n                            return resolve(this.setupRoomContextV2(personRoom));\n                        }\n                        return resolve(this.setupRoomContext(personRoom));\n                    }\n                }\n                return resolve(room);\n            }\n\n            room = ChatRoom.create({ jid, objectId }, getOwner(this).ownerInjection());\n            Ember.set(this.rooms, objectId, room, true);\n\n            return resolve(this.setupRoomContext(room));\n        });\n    },\n\n    setupRoomContext(room) {\n        const jid = room.get('jid');\n        room.set('muted', this.roomMuted(jid));\n\n        if (room.get('isSoftphoneRoom')) {\n            return Ember.RSVP.resolve(room);\n        }\n        if (isPersonJid(jid)) {\n            return this.addChatTargetAsParticipant(room);\n        }\n        if (isGroupJid(jid)) {\n            return this.loadGroup(room);\n        }\n        return Ember.RSVP.resolve(room);\n    },\n    setupRoomContextV2(room) {\n        const jid = room.get('jid');\n        room.set('muted', this.roomMuted(jid));\n\n        if (room.get('isSoftphoneRoom')) {\n            return Ember.RSVP.resolve(room);\n        }\n        if (isPersonJid(jid)) {\n            room.set('oneToOneTarget', jid);\n        }\n        if (isGroupJid(jid)) {\n            return this.loadGroup(room);\n        }\n        return Ember.RSVP.resolve(room);\n    },\n\n    addChatTargetAsParticipant(room) {\n        const jid = room.get('jid');\n        const user = this.get('session.person');\n        return this.get('batchDataRequests')\n            .getChatUser(jid)\n            .then(person => {\n                room.set('oneToOneTarget', person);\n                this.addParticipantToRoom(room, person);\n                this.addParticipantToRoom(room, user);\n                this.get('presenceSubscription').subscribeToPresence(person);\n                person.set('oneToOneRoom', room);\n                return room;\n            });\n    },\n\n    loadRoomSubject(room) {\n        if (room.isOneToOneRoom() || room.get('rawSubject')) {\n            return Ember.RSVP.resolve(room);\n        }\n\n        const roomJid = room.get('jid');\n        return this.getStreamingRoomInfo(roomJid).then(({ subject }) => {\n            this.updateRoomSubject(room, subject);\n            return room;\n        });\n    },\n\n    addRoomToCache(room) {\n        const objectId = getEntityObjectId(room.jid);\n        Ember.set(this.rooms, objectId, room, true);\n    },\n\n    addAllParticipantsToRoom(room, participantJids) {\n        const cachedParticipants = room.get('participants');\n\n        _.forEach(cachedParticipants, cachedParticipant => {\n            const cachedParticipantJid = cachedParticipant && cachedParticipant.get('jid');\n            if (participantJids.indexOf(cachedParticipantJid) === -1) {\n                this.removeParticipantFromRoom(room, cachedParticipant);\n            } else {\n                participantJids.removeObject(cachedParticipantJid);\n            }\n        });\n\n        _.forEach(participantJids, jid => {\n            this.get('batchDataRequests')\n                .getChatUser(jid)\n                .then(person => {\n                    return this.addParticipantToRoom(room, person);\n                });\n        });\n    },\n\n    loadGroup(room) {\n        if (!room.isGroupRoom()) {\n            return Ember.RSVP.resolve(room);\n        }\n\n        return this.get('batchDataRequests')\n            .getGroup(room.get('objectId'))\n            .then(group => {\n                room.set('group', group);\n                if (group && _.isEmpty(group.get('name'))) {\n                    this.loadRoomSubject(room);\n                }\n                return room;\n            });\n    }\n});\n","define(\"connections-ui/mixins/change-serializer\", [\"exports\", \"ember-data-change-tracker/mixins/keep-only-changed\"], function (_exports, _keepOnlyChanged) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _keepOnlyChanged.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport GithubItemModel from '../models/github-item';\n\nconst { computed, generateGuid } = Ember;\n\nconst imageRegex = /\\.(jpe?g|gifv?|png)(\\?.*)?(#.*)?$/i;\nconst timeStampRegex = /(\\d+h)?(\\d+m)?(\\d+s)?$/i;\n\nconst audioRegex = /\\.(mp3|aac|wav)(\\?.*)?(#.*)?$/i;\n\n/*\nhttps://media4.giphy.com/media/R06WhFXLF1Fmw/200w.gif\nhttp://i.giphy.com/R06WhFXLF1Fmw.gif\nhttp://giphy.com/embed/R06WhFXLF1Fmw\nhttp://giphy.com/gifs/christmas-cat-R06WhFXLF1Fmw\nhttp://giphy.com/gifs/R06WhFXLF1Fmw\n*/\nconst giphyRegex = /^https?:\\/\\/.*?giphy\\.com\\/.*?([0-9a-z]{13,}).*?$/i;\nconst giphyIdIndex = 1;\n\nconst imgurRegex = /^(http:\\/\\/)?.{1}\\.imgur\\.com\\/([0-9a-z]{0,})\\..*$/i;\n\n// regex for identifying youtube links\n// adapted from http://stackoverflow.com/a/10315969\n// + revised to include additional timestamp param\nconst youtubeRegex =\n    /^(?:https?:\\/\\/)?(?:www\\.|gaming\\.)?(?:youtu\\.be\\/|youtube\\.com\\/(?:embed\\/|v\\/|watch\\?v=|watch\\?.+&v=|))((\\w|-){11})(?:[&])?(?:t=)?([^&]+)?$/;\nconst youtubeIdIndex = 1; // identify the capture group position that contains the ID, convenient in case the regex changes\nconst youtubeTimeStampIndex = 3;\n\n// adapted from http://stackoverflow.com/questions/13286785/get-video-id-from-vimeo-url\n// + revised to include additional timestamp param\nconst vimeoRegex =\n    /https?:\\/\\/(?:www\\.|player\\.)?vimeo.com\\/(?:channels\\/(?:\\w+\\/)?|groups\\/([^/]*)\\/videos\\/|album\\/(\\d+)\\/video\\/|video\\/|)(\\d+)(?:$|\\/|\\?|#)?(?:t=)?([^&]+)?$/i;\nconst vimeoIdIndex = 3; // identify the capture group position that contains the ID, convenient in case the regex changes\nconst vimeoTimeStampIndex = 4;\n\nconst ghGistRegex = /http(?:s)?:\\/\\/gist.github\\.com\\/([a-zA-Z0-9_]+)\\/([a-zA-Z0-9]+)(?:\\.js)?/i;\nconst ghRepoRegex = /http(?:s)?:\\/\\/github\\.com\\/([a-zA-Z0-9_\\-.]+)\\/([a-zA-Z0-9\\-.]+)\\/?(?:\\/issues\\/[0-9]+)?$/i;\nconst twitterRegex = /http(?:s)?:\\/\\/(?:mobile.)?twitter\\.com\\/(?:#!\\/)?[a-zA-Z0-9_]+\\/status\\/([0-9]+)/i;\nconst googleSlidesRegex = /https?:\\/\\/docs.google.com\\/presentation\\/d\\/[a-zA-Z0-9_-]*\\//i;\nconst soundcloudRegex = /https?:\\/\\/soundcloud\\.com\\/(?!(stream|you)).+/i;\n\nfunction getImageShortName(url = '') {\n    const pattern = /([A-Z0-9_-]{1,}\\.(?:png|jpg|gif|jpeg))/i;\n    const match = pattern.exec(url);\n    if (match) {\n        return window.decodeURI(match.shift());\n    }\n    return window.decodeURI(url.split('/').pop());\n}\n\n// convert timestamp (1m30s) to parseable integer (90).\nfunction parseTimeStamp(timeStamp) {\n    if (timeStamp.indexOf('h') < 0 && timeStamp.indexOf('m') < 0 && timeStamp.indexOf('s') < 0) {\n        return parseInt(timeStamp);\n    }\n    timeStamp = timeStampRegex.exec(timeStamp);\n    timeStamp =\n        (timeStamp[1] ? parseInt(timeStamp[1]) * 360 : 0) +\n        (timeStamp[2] ? parseInt(timeStamp[2]) * 60 : 0) +\n        (timeStamp[3] ? parseInt(timeStamp[3]) : 0);\n    return timeStamp;\n}\n\nexport default Ember.Mixin.create({\n    intl: Ember.inject.service(),\n\n    mediaItems: computed('images', 'videos', 'gists', 'githubRepos', 'tweets', function () {\n        const images = this.get('images');\n        const videos = this.get('videos');\n        const giphies = this.get('giphies');\n        const audios = this.get('audios');\n        const gists = this.get('gists');\n        const repos = this.get('githubRepos');\n        const tweets = this.get('tweets');\n        const googleSlides = this.get('googleSlides');\n        const soundcloud = this.get('soundcloud');\n\n        return _.union(images, videos, giphies, gists, repos, tweets, googleSlides, soundcloud, audios).map(item => {\n            item.set(\n                'mediaRenderer',\n                'chat-panel/conversation/conversation-pane/messages/widgets/media-item/' + item.get('mediaType')\n            );\n            return item;\n        });\n    }),\n\n    getLinks() {\n        return this.get('links') || [];\n    },\n\n    /***********\n    exampleMediaType: computed('links', function () {\n        The 'links' property can sometimes be null/undefined, so use this.getLinks() to safely get a non-null array\n\n        map and filter links to match your media type\n        items are required have the following base properties:\n        {\n            mediaType,\n            title\n        }\n        other properties can be used to render the 'body' of the media\n    }),\n    ************/\n\n    images: computed('links', function () {\n        const links = _.filter(this.getLinks(), link => {\n            if (!link.match(imageRegex)) {\n                return false; // don't return any links not matching images\n            }\n            if (link.match(giphyRegex)) {\n                return false; // don't match giphy images here\n            }\n            if (link.startsWith('http://')) {\n                return link.match(imgurRegex); // if it's http, only return if it's imgur (can be upgraded to https)\n            }\n            return true; // all conditions met\n        });\n\n        return _.map(links, url => {\n            let gifv;\n            let match = imgurRegex.test(url);\n            if (url.endsWith('gifv')) {\n                gifv = {\n                    webm: url.replace('.gifv', '.webm'),\n                    mp4: url.replace('.gifv', '.mp4')\n                };\n            }\n            if (match) {\n                if (url.startsWith('http://')) {\n                    url = url.replace('http://', 'https://');\n                }\n            }\n            return Ember.Object.create({\n                mediaType: 'inline-image',\n                url,\n                gifv: gifv,\n                title: getImageShortName(url),\n                identifier: generateGuid(null, 'inline-image')\n            });\n        });\n    }),\n\n    videos: computed('links', function () {\n        const links = this.getLinks();\n\n        let youtubeLinks = links\n            .map(link => youtubeRegex.exec(link))\n            .filter(match => !!match)\n            .map(match => {\n                let id = match[youtubeIdIndex];\n                let timeStamp = match[youtubeTimeStampIndex]\n                    ? `?start=${parseTimeStamp(match[youtubeTimeStampIndex])}`\n                    : '';\n                return Ember.Object.create({\n                    mediaType: 'inline-video',\n                    title: this.get('intl').lookup('chat.inlineMedia.youtube').toString(),\n                    id: id,\n                    videoUrl: `https://www.youtube.com/embed/${id}${timeStamp}`\n                });\n            });\n\n        let vimeoLinks = links\n            .map(link => vimeoRegex.exec(link))\n            .filter(match => !!match)\n            .map(match => {\n                let id = match[vimeoIdIndex];\n                let timeStamp = match[vimeoTimeStampIndex] ? `#t=${parseTimeStamp(match[vimeoTimeStampIndex])}` : '';\n                return Ember.Object.create({\n                    mediaType: 'inline-video',\n                    title: this.get('intl').lookup('chat.inlineMedia.vimeo').toString(),\n                    id: id,\n                    videoUrl: `//player.vimeo.com/video/${id}${timeStamp}`\n                });\n            });\n\n        return _.union(youtubeLinks, vimeoLinks);\n    }),\n\n    giphies: computed('links', function () {\n        return this.getLinks()\n            .map(link => giphyRegex.exec(link))\n            .filter(match => !!match)\n            .map(match => {\n                const id = match[giphyIdIndex];\n                return Ember.Object.create({\n                    mediaType: 'inline-video',\n                    title: this.get('intl').lookup('chat.inlineMedia.giphy').toString(),\n                    id,\n                    videoUrl: `https://giphy.com/embed/${id}?html5=true`\n                });\n            });\n    }),\n\n    gists: computed('links', function () {\n        return this.getLinks()\n            .map(link => {\n                let matches = ghGistRegex.exec(link);\n                if (matches && (matches.length === 2 || matches.length === 3)) {\n                    let modelData = {\n                        mediaType: 'github-gist',\n                        username: matches[1],\n                        url: `https://gist.github.com/${matches[1]}/${matches[2]}.json?callback=?`\n                    };\n\n                    Ember.setOwner(modelData, Ember.getOwner(this));\n\n                    return GithubItemModel.create(modelData);\n                }\n                return undefined;\n            })\n            .filter(gist => !!gist);\n    }),\n\n    githubRepos: computed('links', function () {\n        return this.getLinks()\n            .map(link => {\n                let matches = ghRepoRegex.exec(link);\n                if (matches && (matches.length === 2 || matches.length === 3)) {\n                    let modelData = {\n                        mediaType: 'github-repo',\n                        username: matches[1],\n                        repo: matches[2],\n                        link: link,\n                        url: `https://api.github.com/repos/${matches[1]}/${matches[2]}`\n                    };\n\n                    Ember.setOwner(modelData, Ember.getOwner(this));\n\n                    return GithubItemModel.create(modelData);\n                }\n\n                return undefined;\n            })\n            .filter(repo => !!repo);\n    }),\n\n    tweets: computed('links', function () {\n        return this.getLinks()\n            .map(link => {\n                let matches = twitterRegex.exec(link);\n                if (matches && matches.length === 2) {\n                    return Ember.Object.create({\n                        mediaType: 'twitter-card',\n                        title: this.get('intl').lookup('chat.inlineMedia.tweet'),\n                        tweetId: matches[1],\n                        url: link,\n                        tweetInfo: null\n                    });\n                }\n                return undefined;\n            })\n            .filter(tweet => !!tweet);\n    }),\n\n    googleSlides: computed('links', function () {\n        return this.getLinks()\n            .map(link => googleSlidesRegex.exec(link))\n            .filter(match => !!match)\n            .map(match => {\n                let url = match[0];\n                return Ember.Object.create({\n                    mediaType: 'google-slides',\n                    title: this.get('intl').lookup('chat.inlineMedia.googleSlides').toString(),\n                    url: `${url}embed?start=false&loop=false&delayms=3000`\n                });\n            });\n    }),\n\n    soundcloud: computed('links', function () {\n        return this.getLinks()\n            .map(link => soundcloudRegex.exec(link))\n            .filter(match => !!match)\n            .map(match => {\n                let url = match[0];\n                return Ember.Object.create({\n                    mediaType: 'soundcloud',\n                    title: this.get('intl').lookup('chat.inlineMedia.soundcloud').toString(),\n                    url: url\n                });\n            });\n    }),\n\n    audios: computed('links', function () {\n        return this.getLinks()\n            .map(link => {\n                return {\n                    match: !!audioRegex.exec(link),\n                    link\n                };\n            })\n            .filter(res => res.match)\n            .map(res => {\n                return Ember.Object.create({\n                    mediaType: 'inline-audio',\n                    title: this.get('intl').lookup('chat.inlineMedia.audio').toString(),\n                    url: res.link\n                });\n            });\n    })\n});\n","import Ember from 'ember';\nimport { displayDateRelativeToToday } from '../utils/dates';\nimport { compareJids } from 'ember-purecloud-components/utils/jid-helpers';\nimport { getEntityObjectId } from 'ember-purecloud-components/utils/jid-helpers';\n\nexport default Ember.Mixin.create({\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    acdChatUser: Ember.computed.alias('room.acdCustomerParticipant'),\n\n    isYou: Ember.computed('chatUser.jid', 'session.person.jid', function () {\n        return compareJids(this.get('chatUser.jid'), this.get('session.person.jid'));\n    }),\n\n    isAcdChatUser: Ember.computed('chatUser.id', 'acdChatUser.id', function () {\n        const chatUserId = getEntityObjectId(this.get('chatUser.id'));\n        const acdChatUserId = getEntityObjectId(this.get('acdChatUser.id'));\n        return chatUserId === acdChatUserId;\n    }),\n\n    isLastMessage: Ember.computed('room.messages.lastObject.id', function () {\n        return this.get('id') === this.get('room.messages.lastObject.id');\n    }),\n\n    messageTime: Ember.computed('time', function () {\n        return displayDateRelativeToToday(this.get('time'), this.get('intl.isoLocale'));\n    }),\n\n    messageDisplay: Ember.computed('correction', function () {\n        const correction = this.get('correction');\n        if (correction) {\n            return correction;\n        } else {\n            return this;\n        }\n    }),\n\n    isCorrection: Ember.computed.bool('correction')\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst ChatEvents = Ember.Mixin.create(Ember.Evented, LoggerMixin, {\n    initialDataLoaded: false,\n    connected: false,\n    enabled: false,\n    historyDirty: false,\n    handleHiddenRooms: true,\n    hiddenRooms: {},\n    useChatSyncFix: false\n});\n\nexport default ChatEvents;\n","import Ember from 'ember';\nimport { compareJids } from 'ember-purecloud-components/utils/jid-helpers';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst MessageNotificationsMixin = Ember.Mixin.create(LoggerMixin, {\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    chat: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    preferences: Ember.inject.service(),\n\n    sendMentionNotification(room, person, message) {\n        // You shouldn't get a mention notification for yourself, which happens when sending a quote from another client\n        // like mobile\n        if (this.get('session.person.id') === person.get('id')) {\n            return;\n        }\n\n        if (this.shouldShowMentionNotification(room, message)) {\n            let roomName = room.getRawDisplaySubject();\n\n            const title = person.get('name');\n            const toastMessage = this.get('intl')\n                .lookup('notification.titles.chatMention', {\n                    roomName\n                })\n                .toString();\n            this.get('notification').info(title, toastMessage, {\n                icon: person.get('profilePicture.x128'),\n                tag: room.get('jid'),\n                hideAfter: 10,\n                soundId: 'chat',\n                shouldShowPopup: true,\n                shouldPlaySound: !this.get('preferences.chat.global.soundsMuted'),\n                target: this.get('applicationController'),\n                volume: this.getNotificationVolume(),\n                notificationOutputDeviceId: this.getNotificationOutputDeviceId()\n            });\n        }\n    },\n\n    sendNotification(message) {\n        if (this.shouldShowNotification(message)) {\n            let showPopup =\n                this.get('preferences.notifications.global.showGroupNotifications') ||\n                message.get('room').isOneToOneRoom();\n            let playSound = showPopup && !this.get('preferences.chat.global.soundsMuted');\n            let title = this.getNotificationTitle(message.get('room'), message.get('chatUser'), message);\n            let messageBody, raw;\n\n            if (message.widgetType === 'video-notification') {\n                const messageKey = `chat.video.chatNotifications.${message.get('widget.data.type')}`;\n                const intl = this.get('intl');\n                if (intl.exists(messageKey)) {\n                    messageBody = this.get('intl').lookup(messageKey);\n                    raw = this.get('intl').t(messageKey);\n                } else {\n                    messageBody = message.get('messageBody');\n                    raw = message.get('raw');\n                }\n            } else {\n                messageBody = message.get('messageBody');\n                raw = message.get('raw');\n            }\n\n            this.get('notification').info(title, messageBody, {\n                icon: message.get('chatUser.profilePicture.x128'),\n                rawMessage: raw,\n                tag: message.get('room.jid'),\n                hideAfter: 8,\n                soundId: 'chat',\n                shouldShowPopup: showPopup,\n                shouldPlaySound: playSound,\n                target: this.get('applicationController'),\n                volume: this.getNotificationVolume(),\n                notificationOutputDeviceId: this.getNotificationOutputDeviceId()\n            });\n        }\n    },\n\n    sendEngageNotification(message) {\n        let title = message.title;\n        let body = message.body;\n        let options = {\n            rawMessage: body,\n            hideAfter: message.hideAfter,\n            markdownToHtml: false,\n            shouldShowPopup: true,\n            shouldPlaySound: false,\n            clickHandler: message.clickHandler,\n            target: this.get('applicationController'),\n            volume: this.getNotificationVolume(),\n            notificationOutputDeviceId: this.getNotificationOutputDeviceId()\n        };\n\n        if (message.severity === 'error') {\n            this.get('notification').error(title, body, options);\n        } else {\n            this.get('notification').info(title, body, options);\n        }\n    },\n\n    shouldShowNotification(message) {\n        let isBusyUser = this.get('session.person.presence') === 'busy' && !message.get('room').isOneToOneRoom();\n        let isDuplicate = false;\n        if (message.duplicate) {\n            isDuplicate = message.get('duplicate');\n        }\n\n        let messageAlreadySeen = !message.get('unread');\n        let fromLoggedInUser = compareJids(message.get('chatUser.jid'), this.get('session.person.jid'));\n        let targetRoomIsMuted = false;\n        let roomIsVisible = false;\n        let windowFocused = this.windowInFocus();\n        let isSupervisorRoom = false;\n        targetRoomIsMuted = this.roomMuted(message.get('room.jid'));\n        isSupervisorRoom = message.get('room.isSupervisorRoom');\n\n        // Negative cases that block notifications are checked first.\n        if (\n            isBusyUser ||\n            isDuplicate ||\n            messageAlreadySeen ||\n            fromLoggedInUser ||\n            roomIsVisible ||\n            targetRoomIsMuted ||\n            isSupervisorRoom\n        ) {\n            return false;\n        } else if (!roomIsVisible || !windowFocused) {\n            //Then positive cases that indicate a notification should be shown are checked.\n            return true;\n        }\n\n        // The final default is to not show a notification\n        return false;\n    },\n\n    shouldShowMentionNotification(room) {\n        let targetRoomIsMuted = false;\n        let roomIsVisible = false;\n        let groupNotificationsEnabled = false;\n        let coveredByMessageNotification = false;\n\n        targetRoomIsMuted = this.roomMuted(room.get('jid'));\n        groupNotificationsEnabled = this.get('preferences.notifications.global.showGroupNotifications');\n        coveredByMessageNotification = groupNotificationsEnabled && !targetRoomIsMuted;\n\n        // Don't show a notification if the message is on screen already or if the notification will be covered\n        // by the message notification\n        if (roomIsVisible || coveredByMessageNotification) {\n            return false;\n        }\n\n        // Unlike messages the default for a mention notification is true\n        return true;\n    },\n\n    getNotificationTitle(room, chatUser) {\n        if (room.isOneToOneRoom()) {\n            return chatUser.get('name');\n        } else {\n            let personName = chatUser.get('name');\n            let roomName = room.getRawDisplaySubject();\n            return this.get('intl')\n                .lookup('notification.titles.chatRoomMessage', {\n                    personName: personName,\n                    roomName: roomName\n                })\n                .toString();\n        }\n    },\n\n    sendTestNotification() {\n        let title = this.get('intl').lookup('notification.titles.testNotification').toString();\n        let message = this.get('intl').lookup('notification.titles.testText').toString();\n        this.get('notification').info(title, message, {\n            icon: this.get('session.person.profilePicture.x128'),\n            tag: 'test-message',\n            hideAfter: 8,\n            soundId: 'chat',\n            shouldShowPopup: true,\n            shouldPlaySound: true,\n            target: this.get('applicationController'),\n            volume: this.getNotificationVolume(),\n            notificationOutputDeviceId: this.getNotificationOutputDeviceId(),\n            clickHandler: () => {}\n        });\n    },\n\n    getNotificationVolume() {\n        let volume = this.get('chat.chatNotificationVolume');\n        if (volume > 1) {\n            volume = volume / 100;\n        }\n        return volume;\n    },\n\n    getNotificationOutputDeviceId() {\n        return this.get('webrtc.notificationOutputDeviceId');\n    }\n});\n\nexport default MessageNotificationsMixin;\n","import Ember from 'ember';\nimport moment from 'moment';\nimport { markdownToHtml } from '../../utils/markdown';\nimport ChatMessage from '../../models/chat-message';\nimport uuid from 'uuid';\n\nexport default Ember.Mixin.create({\n    batchDataRequests: Ember.inject.service(),\n\n    messageDelayDefault: 200,\n    messageDelay: 200,\n    maxDelay: 25000,\n\n    _splitOverSizedMessage(message) {\n        //this regex pattern will try to split the message as close to 4000 characters as possible,\n        //if 4000 character falls on the middle of a word it will split before the word begins. If splitting\n        //isn't possible due to a long string of characters without a space it will just split at the 4,000\n        //character mark.\n        const pattern = /^(?:([\\s\\S]{1,4000}(?=[\\s]|$))|(?!([\\s\\S]{1,4000}(?=[\\s]|$)))[\\s\\S]{1,4000})/i;\n        var messageQueue = [];\n\n        while (message.length > 0) {\n            const result = pattern.exec(message);\n            messageQueue.push(result[0]);\n            message = message.slice(result[0].length);\n        }\n        return messageQueue;\n    },\n\n    _convertSplitMessagesToWidgets(room, messageQueue) {\n        const jid = room.get('jid');\n        const id = uuid.v4();\n        let index = 0;\n\n        return messageQueue.map(message => {\n            const stanza = {\n                name: 'multipart-message',\n                contents: JSON.stringify({\n                    id: id,\n                    index: index++,\n                    messageCount: messageQueue.length\n                })\n            };\n            return {\n                to: jid,\n                body: message,\n                children: [stanza]\n            };\n        });\n    },\n\n    sendSplitMessageQueue(room, messageQueue) {\n        let deferred = Ember.RSVP.defer();\n        this._delayedMessageSender(room, deferred, messageQueue, null);\n        deferred.promise.catch(unsentMessageQueue => {\n            this._addFailedMessagesToRoom(room, unsentMessageQueue);\n            deferred.resolve(null);\n        });\n        return deferred.promise;\n    },\n\n    _addFailedMessagesToRoom(room, unsentMessageQueue) {\n        unsentMessageQueue.forEach(splitWidget => {\n            const jid = room.get('jid');\n            const owner = Ember.getOwner(this);\n            const stanza = this._manuallyCreateStanzaForFailedMessage(splitWidget);\n\n            let message = ChatMessage.create(\n                {\n                    from: this.get('session.person.jid'),\n                    oid: uuid.v4(),\n                    time: moment(),\n                    stanza: stanza,\n                    links: [],\n                    raw: splitWidget.body,\n                    to: jid,\n                    widget: splitWidget,\n                    sendError: true\n                },\n                owner.ownerInjection()\n            );\n            message.set('messageBody', markdownToHtml(splitWidget.body));\n            this.checkForMentions(message);\n            this.get('batchDataRequests')\n                .getChatUser(message.get('from'))\n                .then(person => {\n                    message.set('chatUser', person);\n                    this.setMessageReadState(message);\n                    room.addMessage(message);\n                });\n        });\n    },\n\n    _manuallyCreateStanzaForFailedMessage(splitWidget) {\n        const childName = Ember.get(splitWidget, 'children.lastObject.name');\n        const childPayload = Ember.get(splitWidget, 'children.lastObject.contents');\n        return {\n            children: [\n                {\n                    name: childName,\n                    children: [childPayload]\n                }\n            ]\n        };\n    },\n\n    findMessageById(room, messageId) {\n        const messageCache = room.get('messageCache');\n        if (Object.prototype.hasOwnProperty.call(messageCache, messageId)) {\n            return messageCache.get(messageId);\n        }\n        return null;\n    },\n\n    _delayedMessageSender(room, deferred, messageQueue, pendingMessage) {\n        if (messageQueue.length === 0) {\n            deferred.resolve(null);\n            return;\n        }\n\n        if (this.get('messageDelay') >= this.get('maxDelay')) {\n            this.set('messageDelay', this.get('messageDelayDefault'));\n            let message = this.findMessageById(room, pendingMessage);\n            const splitWidget = messageQueue.shift();\n            message.setProperties({\n                sendError: true,\n                pending: false,\n                widget: splitWidget\n            });\n            deferred.reject(messageQueue);\n            return;\n        }\n\n        if (pendingMessage !== null) {\n            const failedMessage = messageQueue.get('firstObject');\n            const splitMessageData = JSON.parse(Ember.get(failedMessage, 'children.lastObject.contents'));\n            const splitMessageParent = room.get('splitMessageCache').get(splitMessageData.id);\n\n            if (splitMessageParent.get('messageArray.length') > 1) {\n                const message = this.findMessageById(room, pendingMessage);\n                splitMessageParent.get('messageArray').removeObject(message);\n            } else {\n                room.get('messages').removeObject(splitMessageParent);\n                const splitMessageCache = room.get('splitMessageCache');\n                delete splitMessageCache[splitMessageData.id];\n            }\n        }\n\n        this.sendMessageToRoom(room.get('jid'), null, messageQueue[0])\n            .then(() => {\n                messageQueue.shift();\n                this.set('messageDelay', this.get('messageDelayDefault'));\n                Ember.run.later(\n                    this,\n                    this._delayedMessageSender,\n                    room,\n                    deferred,\n                    messageQueue,\n                    null,\n                    this.get('messageDelay')\n                );\n            })\n            .catch(messageId => {\n                this.set('messageDelay', this.get('messageDelay') * 2);\n                Ember.run.later(\n                    this,\n                    this._delayedMessageSender,\n                    room,\n                    deferred,\n                    messageQueue,\n                    messageId,\n                    this.get('messageDelay')\n                );\n                return Ember.RSVP.reject();\n            });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed, inject, Mixin } = Ember;\n\nexport default Mixin.create({\n    chatService: inject.service('chat'),\n    oneToOneRoom: null,\n\n    presenceSubscriptionCounter: 0,\n\n    jid: computed('contactInfo.chat', function () {\n        const chatField = this.getFieldValue('contactInfo.chat');\n        if (chatField) {\n            return Ember.get(chatField, 'value.jid');\n        }\n        return null;\n    }),\n\n    // Deprecated: Please use entity-presence mixin properties where possible.\n    presence: computed.reads('activityPresence'),\n    chatStatus: computed.reads('primaryStatusMessage'),\n    hasChatStatus: computed.notEmpty('chatStatus'),\n\n    // TODO: these hasMedia computeds should move \"up\" a layer to \"participant\" - a new model layer for persons in rooms\n    hasMedia: computed('mediaPresence', function () {\n        const mediaInfo = this.get('mediaPresence.media');\n        return !!_.find(mediaInfo, media => media.audio || media.video || media.listener);\n    }),\n\n    hasMediaInActiveChatRoom: computed('hasMedia', 'chatService.activeRoom', function () {\n        return this.get('mediaPresence.roomJid') === this.get('chatService.activeRoom.jid');\n    })\n});\n","import ClickOutsideMixin from 'ember-click-outside/mixins/click-outside';\nexport default ClickOutsideMixin;\n","define(\"connections-ui/mixins/conversation-analysis\", [\"exports\", \"ember-webrtc-components/mixins/webrtc-conversation-analysis\"], function (_exports, _webrtcConversationAnalysis) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _webrtcConversationAnalysis.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst BASE_URI_V2 = 'api/v2/conversations';\n\nconst { inject, Mixin } = Ember;\n\nexport default Mixin.create({\n    session: inject.service(),\n    application: inject.service(),\n    acdNormalizedMessages: Ember.computed.bool('session.features.acdNormalizedMessages'),\n\n    pcUri: function () {\n        let application = this.get('application');\n        return application.pcV2Uri.apply(application, arguments);\n    },\n    baseUri: function () {\n        let application = this.get('application');\n        return application.pcV2Uri(BASE_URI_V2);\n    },\n    callsUri: function (id) {\n        return `${this.communicationUri(id, 'calls')}`;\n    },\n    createCommunicationUri: function (mediaType) {\n        return `${this.baseUri()}/${mediaType}`;\n    },\n    communicationUri: function (id, mediaType) {\n        return !_.isEmpty(mediaType) ? `${this.baseUri()}/${mediaType}/${id}` : `${this.baseUri()}/${id}`;\n    },\n    communicationsUri(id, participantId, mediaType, mediaId) {\n        return `${this.participantUri(id, participantId, mediaType)}/communications/${mediaId}`;\n    },\n    communicationsByTypeUri: function (mediaType) {\n        return this.baseUri() + '?communicationType=' + mediaType;\n    },\n    consultUri: function (id, participantId, mediaType, entity) {\n        if (this.get('session.features.acdTransferPermissions') && entity) {\n            entity = entity.toLowerCase() === 'person' ? 'agent' : entity;\n            return this.participantUri(id, participantId, mediaType) + '/consult' + `/${entity}`;\n        }\n        return this.participantUri(id, participantId, mediaType) + '/consult';\n    },\n    disconnectMediaTypeUri: function (id, mediaId, participantId, mediaType) {\n        const uri = `${BASE_URI_V2}/${mediaType}/${id}/participants/${participantId}/communications/${mediaId}`;\n        return this.get('application').pcV2Uri(uri);\n    },\n    getConversationUri: function (id) {\n        return this.communicationUri(id);\n    },\n    mediaRequestUri: function (id) {\n        return `${this.communicationUri(id, 'chats')}/mediarequests`;\n    },\n    monitorUri: function (id, participantId, mediaType) {\n        return this.participantUri(id, participantId, mediaType) + '/monitor';\n    },\n    participantUri: function (id, participantId, mediaType) {\n        return this.participantsUri(id, mediaType) + participantId;\n    },\n    participantsUri: function (id, mediaType) {\n        return this.communicationUri(id, mediaType) + '/participants/';\n    },\n    participantDetailsUri: function (id, participantId) {\n        return this.participantUri(id, participantId) + '/details';\n    },\n    participantWrapupUri: function (id, participantId, mediaType) {\n        return this.participantUri(id, participantId, mediaType) + '/wrapup';\n    },\n    sessionShareCodeUri: function (id, participantId, mediaType) {\n        return this.participantUri(id, participantId, mediaType) + '/codes';\n    },\n    expireSessionShareCodeUri: function (id, participantId, securityKey) {\n        return this.participantUri(id, participantId) + '/codes/' + securityKey;\n    },\n    participantWrapupCodesUri: function (id, participantId, mediaType) {\n        return this.participantUri(id, participantId, mediaType) + '/wrapupcodes';\n    },\n    participantCommunicationWrapupUri: function (id, participantId, mediaType, communicationId) {\n        return this.participantUri(id, participantId, mediaType) + '/communications/' + communicationId + '/wrapup';\n    },\n    replaceUri: function (id, participantId, query, mediaType, entity) {\n        if (query) {\n            return this.participantUri(id, participantId, mediaType) + '/replace' + this.getQueryStr(query);\n        } else {\n            if (this.get('session.features.acdTransferPermissions') && entity) {\n                entity = entity.toLowerCase() === 'person' ? 'agent' : entity;\n                return this.participantUri(id, participantId, mediaType) + '/replace' + `/${entity}`;\n            }\n            return this.participantUri(id, participantId, mediaType) + '/replace';\n        }\n    },\n    scheduleCallbackUri: function (id, participantId) {\n        return `${this.participantUri(id, participantId)}/callbacks`;\n    },\n    tagsUri: function (id) {\n        //Are we using this?\n        return this.communicationUri(id) + '/tags';\n    },\n    wrapUpUri: function (id, participantId) {\n        return this.participantUri(id, participantId) + '/wrapup';\n    },\n    wrapUpCodesUri: function (id) {\n        return this.communicationUri(id) + '/wrapupCodes';\n    },\n    messagesUri: function (id, mediaType) {\n        return `${this.communicationUri(id, mediaType)}/messages`;\n    },\n    sendChatMessageUri: function (conversationId, communicationId) {\n        return `${this.communicationUri(conversationId, 'chats')}/communications/${communicationId}/messages`;\n    },\n    sendTypingUri: function (conversationId, communicationId) {\n        return `${this.communicationUri(conversationId, 'chats')}/communications/${communicationId}/typing`;\n    },\n    sendMessagingTypingUri: function (conversationId, communicationId) {\n        return `${this.communicationUri(conversationId, 'messages')}/communications/${communicationId}/typing`;\n    },\n    draftUri: function (id, mediaType, query) {\n        if (query) {\n            return `${this.messagesUri(id, mediaType)}/draft${this.getQueryStr(query)}`;\n        } else {\n            return `${this.messagesUri(id, mediaType)}/draft`;\n        }\n    },\n    draftAttachmentUri: function (id, attachmentId, mediaType) {\n        return `${this.draftUri(id, mediaType)}/attachments/${attachmentId}`;\n    },\n    smsUri: function (id) {\n        return `${this.communicationUri(id, 'messages')}/messages`;\n    },\n    smsHistoryUri: function (id) {\n        return this.getConversationUri(id);\n    },\n    smsMessageDetailUri: function (id, messageId) {\n        // api/v2/conversations/messages/{conversationId}/messages/{messageId}/details\n        return `${this.smsUri(id)}/${messageId}/details/?useNormalizedMessage=${this.get('acdNormalizedMessages')}`;\n    },\n    smsMessageBatchUri: function (id) {\n        return `${this.smsUri(id)}/bulk?useNormalizedMessage=${this.get('acdNormalizedMessages')}`;\n    },\n    sendSMSMessageUri: function (id, communicationId) {\n        return `${this.communicationUri(\n            id,\n            'messages'\n        )}/communications/${communicationId}/messages?useNormalizedMessage=${this.get('acdNormalizedMessages')}`;\n    },\n    createMediaAttachmentUri: function (id, communicationId) {\n        return `${this.communicationUri(id, 'messages')}/communications/${communicationId}/messages/media`;\n    },\n    getMediaAttachmentUri: function (id, communicationId, mediaId) {\n        return `${this.communicationUri(id, 'messages')}/communications/${communicationId}/messages/media/${mediaId}`;\n    },\n    copyMediaAttachmentUri: function (conversationId) {\n        // api/v2/conversations/emails/{conversationId}/messages/draft/attachments/copy\n        return `${this.communicationUri(conversationId, 'emails')}/messages/draft/attachments/copy`;\n    },\n    requestACWUri: function (interactionId, participantId, agentCommunicationId) {\n        // api/v2/conversations/aftercallwork/{conversationId}/participants/{participantId}/communications/{communicationId}\n        return `${this.communicationUri(\n            ''\n        )}aftercallwork/${interactionId}/participants/${participantId}/communications/${agentCommunicationId}`;\n    },\n    getSupportedContentUri: function (subType, id) {\n        return `${this.baseUri()}/messaging/integrations/${subType}/${id}?expand=supportedContent`;\n    },\n\n    getDeploymentConfigUri: function (deploymentId, getSupportedContent = false) {\n        if (getSupportedContent) {\n            return `${this.pcUri()}api/v2/webdeployments/deployments/${deploymentId}/configurations?expand=supportedContent`;\n        }\n        return `${this.pcUri()}api/v2/webdeployments/deployments/${deploymentId}/configurations?type=active`;\n    },\n\n    getIntegrationConfigUri: function (subMessageType, integrationId) {\n        return `${this.baseUri()}/messaging/integrations/${subMessageType}/${integrationId}?expand=messagingSetting`;\n    },\n\n    getConversationSummaryFeedbackUri: function (conversationId, summaryId) {\n        return `${this.baseUri()}/${conversationId}/summaries/${summaryId}/feedback`;\n    },\n\n    getQueryStr: function (parameters) {\n        var query = '';\n        var arrayParameterCollection = {};\n        var params;\n\n        if (parameters && !_.isEmpty(parameters)) {\n            // Get all parameters that are simple key-value pairs and where the value is\n            // NOT an array\n            params = _.reduce(\n                parameters,\n                function (result, value, key) {\n                    if (Array.isArray(parameters[key])) {\n                        arrayParameterCollection[key] = value;\n                    } else {\n                        result[key] = value;\n                    }\n\n                    return result;\n                },\n                {}\n            );\n\n            // serialize the parameters\n            query = '?' + $.param(params);\n\n            _.forIn(arrayParameterCollection, function (arr, key) {\n                // convert the array values into query parameters that will result in:\n                //   ?key=value1&key=value2&...\n                _.each(arr, function (item) {\n                    if (query === '?') {\n                        query += key + '=' + item;\n                    } else {\n                        query += '&' + key + '=' + item;\n                    }\n                });\n            });\n        }\n        return query;\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Mixin.create({\n    // TODO: Fill in this stub for answer a chat\n    // with code that will actually answer a chat.\n    answerChat: function (conversation) {\n        return Ember.RSVP.resolve(conversation);\n    }\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { inject } = Ember;\nconst { Promise } = Ember.RSVP;\n\nexport default Ember.Mixin.create(LoggerMixin, {\n    session: inject.service(),\n    ajax: inject.service(),\n\n    defaultLogLevel: 'debug',\n\n    /*\n     * Proxies AJAX requests as raw requests capturing\n     * response codes, correlations, etc. and loggin them\n     * out to SumoLogic automatically. Failed requests\n     * Promises will always resolved with the response,\n     * payload, and jqXHR object.\n     *\n     * @param {string} url - The request url path.\n     * @param {object} options - The request options.\n     * @param {string} type - The type of request to be made.\n     *\n     * @returns {Promise} Result of Ajax request\n     */\n    makeRequest(url, options = {}, type = 'get') {\n        const userId = this.get('session.person.guid');\n        const logger = this.logger;\n\n        if (type !== 'raw') {\n            options.method = (options.method || type).toUpperCase();\n            options.cache = false;\n        } else if (type === 'raw') {\n            options.method = (options.method || 'get').toUpperCase();\n        }\n\n        if (options.method && options.method.toLowerCase() !== 'get') {\n            options.dataType = options.dataType || 'json';\n        }\n\n        if (\n            options.data &&\n            options.dataType &&\n            options.dataType.toLowerCase() === 'json' &&\n            typeof options.data !== 'string' &&\n            options.method.toLowerCase() !== 'get'\n        ) {\n            options.contentType = 'application/json; charset=UTF-8';\n            options.data = JSON.stringify(options.data);\n        }\n\n        /*\n         * Logs the request at a specific log level\n         *\n         * @param {string} path - The request url path.\n         * @param {object} options - The request options.\n         * @param {object} payload - The response payload.\n         * @param {int} status - The response status code.\n         * @param {string} correlation - The correlation guid of the response.\n         * @param {strign} logLevel - The level to emit the log with.\n         */\n        const logRequest = (path, options, payload, status, correlation, logLevel) => {\n            const log = {\n                namespace: 'conversations',\n                message: 'User request',\n                path: path,\n                options: options,\n                response: { status, correlation },\n                user: userId\n            };\n\n            if (payload) {\n                log.response.payload = payload;\n            }\n\n            logger[logLevel]('Conversation Request:', { log });\n        };\n\n        /*\n         * Parses the response from the request to send to logRequest.\n         *\n         * @param {object} jqXHR - The jqXHR object.\n         * @param {object} payload - The response payload.\n         * @param {boolean} isError - Flag used to set appropriate log level.\n         */\n        const captureRequest = (request, isError) => {\n            const jqXHR = request.jqXHR;\n            const payload = request.payload;\n            if (jqXHR) {\n                const statusCode = jqXHR.status;\n                const correlationId = jqXHR.getResponseHeader('ININ-Correlation-id');\n                const logLevel = isError ? 'error' : this.get('defaultLogLevel');\n                logRequest(url, options, payload, statusCode, correlationId, logLevel);\n            }\n        };\n\n        /*\n         * Resolves a provies based on the response of a request.\n         *\n         * @param {object} response - Response from jqXHR request.\n         * @param {boolean} error - Flag use to resolve/reject promise.\n         *\n         * @returns {Promise} Promise resolve/rejecting jqXHR response.\n         */\n        const resolveRequest = (response, error) => {\n            const resolution = !!error ? 'reject' : 'resolve';\n            if (type === 'raw' || !!error) {\n                return Promise[resolution](response);\n            }\n            return Promise[resolution](response.response);\n        };\n\n        /*\n         * Determines if jqXHR response error is merely a parse error\n         * of an empty string returned by publicAPI.\n         *\n         * @param {response} - Response object from request.\n         */\n        const isSuccessResponse = response => {\n            if (response) {\n                const status = response.status || response.jqXHR.status;\n                if (status === 200 || status === 202) {\n                    return true;\n                }\n            }\n            return false;\n        };\n\n        return this.get('ajax')\n            .raw(url, options)\n            .then(response => {\n                captureRequest(response);\n                return resolveRequest(response);\n            })\n            .catch(response => {\n                // Swallow errors if jQuery is just failing to\n                // parse an empty respone as a valid JSON object.\n                if (isSuccessResponse(response)) {\n                    captureRequest(response);\n                    return resolveRequest(response);\n                }\n                captureRequest(response, true);\n                return resolveRequest(response, true);\n            });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldConfig from '../field-config/field-config';\n\nconst { inject, Mixin } = Ember;\n\nfunction newPublicApiGroupData(name, type, vis) {\n    return {\n        name: name,\n        type: type.includes('groups.') ? type.split('.')[1] : type,\n        visibility: vis.toLowerCase(),\n        rulesVisible: true\n    };\n}\n\nexport default Mixin.create({\n    intl: inject.service(),\n    ajax: inject.service(),\n    session: inject.service(),\n    notification: inject.service('notification-proxy'),\n    application: inject.service(),\n\n    groupName: null,\n    groupType: null,\n    groupVisibility: null,\n\n    groupTypeDefault: Ember.computed.reads('newGroupTypeChoices.0'),\n    groupVisibilityDefault: Ember.computed.reads('newGroupVisibilityChoices.0'),\n    groupMembershipDefault: Ember.computed.reads('newGroupMembershipChoices.0'),\n    groupModal: null,\n\n    nameLengthExceeded: false,\n\n    creatingGroup: false,\n\n    createGroup() {\n        const intl = this.get('intl');\n        var name = this.get('groupName');\n        var type = this.get('groupType');\n        var visibility = this.get('groupVisibility');\n\n        if (!type) {\n            type = this.get('groupTypeDefault.value');\n        }\n\n        if (!visibility) {\n            visibility = this.get('groupVisibilityDefault.value');\n        }\n\n        if (visibility.toLowerCase() === 'public') {\n            visibility = 'public';\n        } else if (visibility.toLowerCase() === 'members-only') {\n            visibility = 'members';\n        } else {\n            visibility = 'owners';\n        }\n\n        const data = newPublicApiGroupData(name, type, visibility);\n        const url = this.get('application').pcV2Uri('api/v2/groups');\n        const request = this.get('ajax').post(url, { data });\n\n        return request\n            .then(data => {\n                try {\n                    this.setProperties({\n                        groupName: null,\n                        groupType: null,\n                        groupVisibility: null\n                    });\n                } catch (err) {\n                    Ember.Logger.error('Failed to set properties to null', { error: err });\n                }\n\n                this.sendAction('cancel');\n\n                this.bubbleAction({\n                    action: 'transitionToRoute',\n                    actionContext: ['group.detail', data.id]\n                });\n            })\n            .catch(err => {\n                this.setProperties({\n                    groupName: null,\n                    groupType: null,\n                    groupVisibility: null\n                });\n\n                this.sendAction('cancel');\n\n                const error = Ember.get(err, 'errors.0.detail');\n                const title = intl.lookup('notification.group.errorTitle');\n                let message = intl.lookup('notification.group.createError');\n\n                if (Ember.get(error, 'payload.code') === 'DUPLICATE_VALUE') {\n                    message = intl.lookup('notification.group.duplicate');\n                }\n\n                this.get('notification').error(title, message, {\n                    hideAfter: 5,\n                    forceBrowserNotification: true\n                });\n\n                Ember.Logger.error('Error creating group:', { error: err });\n            });\n    },\n\n    canCreateGroup: Ember.computed('session.person.namedPermissions', 'session.person.isAdmin', function () {\n        var permissions = this.get('session.person.namedPermissions');\n        var isAdmin = this.get('session.person.isAdmin');\n\n        if (_.includes(permissions, 'admin') || isAdmin) {\n            return true;\n        }\n\n        var createGroup = _.includes(permissions, 'group_creation');\n        var adminGroup = _.includes(permissions, 'group_administration');\n\n        return createGroup || adminGroup;\n    }),\n\n    groupTypeI18nLabel: Ember.computed('intl.isoLocale', function () {\n        return FieldConfig.getFieldConfig('group', Ember.getOwner(this)).get('general.groupType.i18nLabel');\n    }),\n\n    newGroupTypeChoices: Ember.computed('intl.isoLocale', function () {\n        var types = FieldConfig.getFieldConfig('group', Ember.getOwner(this)).get('groupTypes');\n\n        return types.map(type => {\n            var lookupType = type.replace('.', '_');\n            var label = this.get('intl').lookup(`group_general_groupType_value_${lookupType}`);\n\n            return {\n                value: type,\n                label: label\n            };\n        });\n    }),\n\n    groupVisibilityI18nLabel: Ember.computed('intl.isoLocale', function () {\n        return FieldConfig.getFieldConfig('group', Ember.getOwner(this)).get('privacy.groupVisibility.i18nLabel');\n    }),\n\n    newGroupVisibilityChoices: Ember.computed('intl.isoLocale', function () {\n        var choices = FieldConfig.getFieldConfig('group', Ember.getOwner(this)).getAllowedValues(\n            'privacy.groupVisibility'\n        );\n\n        return choices.map(type => {\n            var lookupType = type.replace('.', '_');\n            var label = this.get('intl').lookup(`group_privacy_groupVisibility_value_${lookupType}`);\n\n            return {\n                value: type,\n                label: label\n            };\n        });\n    })\n});\n","define(\"connections-ui/mixins/device-enumeration\", [\"exports\", \"ember-webrtc-components/mixins/device-enumeration\"], function (_exports, _deviceEnumeration) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _deviceEnumeration.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst {\n    $,\n    Mixin,\n    run: { bind }\n} = Ember;\n\nexport default Mixin.create({\n    handleMessageEvent(event) {\n        Ember.run(() => {\n            const iframe = Ember.get(this, 'element');\n            if (iframe) {\n                const messageEvent = event.originalEvent;\n                const messageData = messageEvent.data;\n                const messageOptions = Object.assign({}, messageData.options);\n                if (messageEvent.source === iframe.contentWindow && messageData.type) {\n                    this.triggerMessageAction(messageData.type.toLowerCase(), messageData.data, messageOptions);\n                }\n            }\n        });\n    },\n\n    triggerMessageAction(type, data, options = {}) {\n        if (this.messageHandlers[type]) {\n            this.logger.debug('Handling message type', type, data);\n            this.messageHandlers[type].call(this, data, options);\n        } else {\n            // An in-house utility generates messages in this\n            // format that we do not want to log. See: PCDWEBK-4163\n            if (type !== 'rpc:request') {\n                this.logger.info('Unknown message type', { type, data });\n            }\n        }\n    },\n\n    startMessageListener: Ember.on('didInsertElement', function () {\n        $(window).on(`message.${this.elementId}`, bind(this, this.handleMessageEvent));\n    }),\n\n    stopMessageListener: Ember.on('willDestroyElement', function () {\n        $(window).off(`message.${this.elementId}`);\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nvar EntityControllerMixin = Ember.Mixin.create({\n    intl: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    entity: null,\n\n    excludedFieldSections: null,\n\n    lastUploadedImage: null,\n\n    editingPictures: false,\n\n    viewingGallery: false,\n\n    actions: {\n        cancelEditProfilePicture() {\n            this.set('editingPictures', false);\n        },\n\n        editProfilePicture() {\n            this.set('editingPictures', true);\n        },\n\n        cancelUpload() {\n            this.send('editProfilePicture');\n        },\n\n        cancelEditPictures() {\n            this.set('uploadType', null);\n        },\n\n        viewLightGallery() {\n            this.set('viewingGallery', true);\n        },\n\n        cancelViewLightGallery() {\n            this.set('viewingGallery', false);\n        },\n\n        noop() {}\n    },\n\n    setInitialFieldSections: Ember.on('init', function () {\n        this.set('excludedFieldsSections', []);\n    }),\n\n    fieldSections: Ember.computed('entity', function () {\n        var entity = this.get('entity');\n\n        if (entity) {\n            var sections = this.get('entity').fieldConfig.sections;\n\n            if (this.get('application.session.user.isAdmin') && !this.get('application.session.user.personId')) {\n                return _.filter(\n                    sections,\n                    function (section) {\n                        var excludedSections = this.get('excludedFieldSections');\n                        return excludedSections.indexOf(section.key) === -1;\n                    },\n                    this\n                );\n            }\n\n            return _.filter(\n                sections,\n                function (section) {\n                    var readableSections = this.get('entity').getReadableSections(),\n                        excludedSections = this.get('excludedFieldSections');\n                    return excludedSections.indexOf(section.key) === -1 && readableSections.indexOf(section.key) !== -1;\n                },\n                this\n            );\n        }\n\n        return [];\n    })\n});\n\nexport default EntityControllerMixin;\n","import Ember from 'ember';\n\n// Brings in isOneToOneOfflineOrBusy\nimport WebrtcActionUtils from 'connections-ui/mixins/webrtc-action-utils';\n\nexport default Ember.Mixin.create(WebrtcActionUtils, {\n    chat: Ember.inject.service(),\n    store: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    session: Ember.inject.service(),\n    favorites: Ember.inject.service(),\n    geolocation: Ember.inject.service(),\n    application: Ember.inject.service(),\n    phoneService: Ember.inject.service('phone'),\n    mediaProviders: Ember.inject.service(),\n    phoneIntegrations: Ember.inject.service(),\n\n    isChatEnabled: Ember.computed.reads('chat.enabled'),\n    isWebrtcEnabled: Ember.computed.reads('webrtc.enabled'),\n    isGeolocationEnabled: Ember.computed.reads('geolocation.isEnabled'),\n    phoneServiceEnabled: Ember.computed.reads('phoneService.enabled'),\n    phoneAvailable: Ember.computed.reads('phoneService.phoneAvailable'),\n    self: Ember.computed.reads('session.person'),\n\n    init() {\n        this._super(...arguments);\n\n        this.set('applicationUrlPrefix', this.get('application.urlprefix') || '');\n\n        // Need user details to compute the 'useMediaProviders' property, which is only used by the {{entity-contact-group}} component.\n        if (this.get('entity.type') === 'person' && this.classNames.includes('entity-contact-group-v2')) {\n            this.get('store')\n                .findRecord('public-api-user', this.get('entity.id'), {\n                    adapterOptions: {\n                        expand: 'authorization'\n                    }\n                })\n                .then(user => this.set('user', user));\n        }\n    },\n    callEntity(entity) {\n        this.get('phoneService').makeCall(entity);\n    },\n    toggleFavorite(entity) {\n        this.get('favorites').toggleFavorite(entity);\n    },\n\n    mediaProviderComponent: 'media-providers/video-dropdown',\n\n    videoProviders: Ember.computed('user', 'user.profile', function () {\n        return this.get('mediaProviders').getProvidersForUser('video', this.get('user'));\n    }),\n\n    useMediaProviders: Ember.computed('videoProviders.@each.haveAccess', function () {\n        const providers = this.get('videoProviders').filter(provider => provider.get('haveAccess'));\n        return providers.length > 1;\n    }),\n\n    integrationBadgesComponent: 'integration-badges',\n    useIntegrationBadges: true\n});\n","import Ember from 'ember';\nimport moment from 'moment';\nimport { isPurecloudSource } from 'connections-ui/utils/presence-utils';\n\nconst { get, inject, computed, Mixin } = Ember;\n\nexport function isPresence(presenceMap, definition, check) {\n    if (!definition) {\n        return false;\n    }\n\n    let apiValue = get(definition, 'systemPresence');\n    let id = get(definition, 'id');\n\n    if (apiValue) {\n        return apiValue.toLowerCase() === check;\n    } else if (id && presenceMap) {\n        let presenceMapping = presenceMap.findBy('id', id);\n        if (presenceMapping && presenceMapping.systemPresence) {\n            return presenceMapping.systemPresence.toLowerCase() === check;\n        }\n    }\n\n    return false;\n}\n\nexport default Mixin.create({\n    intl: inject.service(),\n    session: inject.service(),\n    presenceService: inject.service('presence'),\n    phoneIntegrations: inject.service(),\n\n    outOfOffice: computed.reads('activities.outOfOffice'),\n    routingStatus: computed.reads('activities.routingStatus'),\n    acdDivisionPresenceProfileToggle: computed.readOnly('session.features.acdDivisionPresenceProfileToggle'),\n    primaryPresence: computed(\n        'activities.presence',\n        'activities.integrationPresence',\n        'session.presenceMap',\n        'presenceList.[]',\n        'currentPresenceSource',\n        function () {\n            const presence = this.get('activities.presence');\n            const presenceList = this.get('presenceList');\n            let currentPresenceSource = this.get('currentPresenceSource');\n            const integrationPresence = this.get('integrationPresence');\n            let currentPresence = presence;\n\n            // check the presence list for primary presence\n            // falls back to `activities.presence`\n            if (presenceList && presenceList.length > 0) {\n                const existingPresence = presenceList.find(pres => {\n                    let presSource = pres.source;\n                    if (isPurecloudSource(presSource)) {\n                        presSource = 'default';\n                    }\n                    return presSource.toLowerCase() === currentPresenceSource.toLowerCase();\n                });\n                if (existingPresence) {\n                    if (!presence) {\n                        // there are times where activities.presence is undefined\n                        currentPresence = existingPresence;\n                    } else {\n                        // need to verify if expands presence (from api) is the latest presence\n                        const existingPresenceDate = moment(existingPresence.modifiedDate);\n                        const activitiesPresenceDate = moment(presence.modifiedDate);\n                        const isExistingPresenceLatest = existingPresenceDate.isAfter(activitiesPresenceDate);\n                        if (isExistingPresenceLatest) {\n                            // if presence value in presence list, is the latest, then use that instead\n                            currentPresence = existingPresence;\n                        }\n                    }\n                }\n            }\n\n            // if user has an integration presence\n            if (integrationPresence && Ember.get(integrationPresence, 'presenceDefinition')) {\n                // check if user is offline for their primary presence source\n                const isGCOffline = isPresence(\n                    this.get('session.presenceMap'),\n                    !!currentPresence ? Ember.get(currentPresence, 'presenceDefinition') : undefined,\n                    'offline'\n                );\n\n                // if offline in primary presence source\n                // return integration presence\n                if (isGCOffline) {\n                    return integrationPresence;\n                }\n            }\n            return currentPresence;\n        }\n    ),\n\n    conversationSummary: computed.reads('activities.conversationSummary'),\n    geolocation: computed.reads('activities.geolocation'),\n    presenceDefinition: computed.reads('primaryPresence.presenceDefinition'),\n\n    // PCUCC-1546 - new integrationPresence expands for 3rd Party Presence\n    integrationPresence: computed.reads('activities.integrationPresence'),\n\n    presenceModel: computed(\n        'primaryPresence.presenceDefinition.systemPresence',\n        'presenceDefinition',\n        'presenceService.allPresences.[]',\n        'presenceService.outOfBandPresenceDefinitions.[]',\n        'acdDivisionPresenceProfileToggle',\n        function () {\n            const presenceService = this.get('presenceService');\n            const presences = this.get('presenceService.allPresences');\n            const presenceDefinition = this.get('presenceDefinition');\n            if (presenceDefinition && presences && presences.length > 0) {\n                const presence = presences.find(presence => {\n                    return get(presenceDefinition, 'id') === get(presence, 'id');\n                });\n\n                if (this.get('acdDivisionPresenceProfileToggle')) {\n                    const outOfBandPresences = this.get('presenceService.outOfBandPresenceDefinitions');\n                    let outOfBandPresence;\n                    if (outOfBandPresences) {\n                        outOfBandPresence = outOfBandPresences.find(presence => {\n                            return get(presenceDefinition, 'id') === get(presence, 'id');\n                        });\n                    }\n                    if (!presence && !outOfBandPresence) {\n                        // This recalculates the data necessary to handle the use cases where an unknown\n                        // presence is selected or when a deactivated presence has worked its way into the\n                        // cache (outside user intervention)\n                        // integration presence will be undefined at times and trigger many loops based on results\n                        Ember.run.join(() => {\n                            return presenceService.findPresence(get(presenceDefinition, 'id'), presenceDefinition);\n                        });\n                    }\n                    return presence || outOfBandPresence;\n                } else {\n                    if (!presence) {\n                        // This recalculates the data necessary to handle the use cases where an unknown\n                        // presence is selected or when a deactivated presence has worked its way into the\n                        // cache (outside user intervention)\n                        // integration presence will be undefined at times and trigger many loops based on results\n                        Ember.run.join(() => presenceService.findPresence(get(presenceDefinition, 'id')));\n                    }\n                    return presence;\n                }\n            }\n\n            return presences.findBy('key', 'offline');\n        }\n    ),\n\n    presenceLabel: computed(\n        'activityPresence',\n        'presenceDefinition',\n        'isOutOfOffice',\n        'outOfOffice.endDate',\n        'integrationPresence',\n        'primaryPresence',\n        'presenceModel',\n        'acdDivisionPresenceProfileToggle',\n        function () {\n            const endOfTime = moment('9999-12-31T00:00:00.000Z');\n\n            if (this.get('isOutOfOffice')) {\n                let end = moment(this.get('outOfOffice.endDate'));\n                if (end.isSame(endOfTime) || end.year() === 9999) {\n                    return this.get('intl').lookup('chat.presence.outOfOffice.title');\n                } else {\n                    return this.get('intl').lookup('chat.presence.outOfOffice.presence', {\n                        date: end.locale(this.get('intl.isoLocale')).format('l')\n                    });\n                }\n            }\n\n            const integrationPresenceSource = this.get('integrationPresence.source');\n            let primaryPresenceSource = this.get('primaryPresence.source');\n\n            if (isPurecloudSource(primaryPresenceSource)) {\n                primaryPresenceSource = 'default';\n            }\n            if (this.get('acdDivisionPresenceProfileToggle')) {\n                // if using 3rd Party Presence, append 3rd Party labels to presence label\n                if (primaryPresenceSource === integrationPresenceSource && integrationPresenceSource) {\n                    const integrationLabel = this.get('intl').t(\n                        `integrationPresence.presenceLabels.${integrationPresenceSource.toLowerCase()}`\n                    );\n                    return `${this.get('presenceModel.label')} on ${integrationLabel}`;\n                }\n                return this.get('presenceModel.label');\n            }\n            // if using 3rd Party Presence, append 3rd Party labels to presence label\n            if (primaryPresenceSource === integrationPresenceSource && integrationPresenceSource) {\n                const integrationLabel = this.get('intl').t(\n                    `integrationPresence.presenceLabels.${integrationPresenceSource.toLowerCase()}`\n                );\n                return `${this.get('presenceModel.primaryLabel')} on ${integrationLabel}`;\n            }\n\n            return this.get('presenceModel.primaryLabel');\n        }\n    ),\n\n    /**\n     * Generates a label based on the users presence. Includes the secondary presence and the primary presence\n     * separated by a bullet symbol. i.e. `Busy 1 • Busy`.\n     * This gives the users a further look into the users exact presence\n     */\n    secondaryPresenceLabel: computed(\n        'activityPresence',\n        'presenceDefinition',\n        'presenceLabel',\n        'presenceModel.primaryLabel',\n        'acdDivisionPresenceProfileToggle',\n        function () {\n            if (this.get('acdDivisionPresenceProfileToggle')) {\n                if (!this.get('presenceLabel')) {\n                    return;\n                }\n                if (\n                    this.get('presenceModel.primaryLabel') &&\n                    this.get('presenceModel.primaryLabel') !== this.get('presenceLabel')\n                ) {\n                    return this.get('presenceModel.primaryLabel');\n                }\n                return null;\n            }\n\n            let secondaryPresence = null;\n\n            const definition = this.get('presenceDefinition');\n            const presenceMap = this.get('session.presenceMap');\n            const presence = presenceMap.find(p => p.id === definition.id);\n\n            if (presence) {\n                const locale = this.get('intl.isoLocale').toLowerCase();\n                const fallbackLocale = this.get('intl.baseLocale');\n\n                if (presence.languageLabels && Object.keys(presence.languageLabels).length > 0) {\n                    /**\n                     * The language label keys are inconsistent so we will just iterate over them\n                     * and try to match it up with the info we have\n                     */\n                    for (const [key, value] of Object.entries(presence.languageLabels)) {\n                        const formattedLocale = key.toLowerCase().replace(/_/g, '-');\n                        // if we found the exact locale that matches the users we can end it\n                        if (locale === formattedLocale) {\n                            secondaryPresence = value;\n                            break;\n                        }\n\n                        // sets the secondarypresence to the fallback locale if found and needed\n                        if (fallbackLocale === formattedLocale) {\n                            secondaryPresence = value;\n                        }\n                    }\n                }\n\n                let primaryPresence =\n                    typeof presence.systemPresence === 'string'\n                        ? presence.systemPresence.toLowerCase().trim().replace('_', ' ')\n                        : '';\n                // if the secondaryPresence and the primaryPresence are the same then we don't want to return anything\n                if (!secondaryPresence || secondaryPresence.toLowerCase().trim() === primaryPresence) {\n                    return null;\n                }\n            }\n\n            return secondaryPresence;\n        }\n    ),\n\n    primaryStatusMessage: computed.reads('primaryPresence.message'),\n\n    cityExists: computed.notEmpty('geolocation.city'),\n    regionExists: computed.notEmpty('geolocation.region'),\n    countryExists: computed.notEmpty('geolocation.country'),\n    hasGeolocation: computed.or('cityExists', 'regionExists', 'countryExists'),\n\n    isAvailable: computed.reads('isOnline'),\n    isOnline: computed('session.presenceMap.[]', 'presenceDefinition', 'isOutOfOffice', function () {\n        return this.isPresence('available') && !this.get('isOutOfOffice');\n    }),\n\n    isOffline: computed('session.presenceMap.[]', 'presenceDefinition', 'isOutOfOffice', function () {\n        return this.isPresence('offline');\n    }),\n\n    isAway: computed('session.presenceMap.[]', 'presenceDefinition', 'isOutOfOffice', function () {\n        const isAway =\n            this.isPresence('away') ||\n            this.isPresence('training') ||\n            this.isPresence('break') ||\n            this.isPresence('meal') ||\n            this.isPresence('idle');\n        return isAway && !this.get('isOutOfOffice');\n    }),\n\n    isBusy: computed('session.presenceMap.[]', 'presenceDefinition', 'isOutOfOffice', function () {\n        const isBusy = this.isPresence('busy') || this.isPresence('meeting');\n        return isBusy && !this.get('isOutOfOffice');\n    }),\n\n    isOutOfOffice: computed('session.presenceMap.[]', 'presenceDefinition', 'outOfOffice.active', function () {\n        return this.get('outOfOffice.active');\n    }),\n\n    isOnQueue: computed(\n        'session.presenceMap.[]',\n        'presenceDefinition',\n        'presenceDefinition.systemPresence',\n        'routingStatus.status',\n        'isOutOfOffice',\n        function () {\n            let systemPresence = this.get('presenceDefinition.systemPresence') || '';\n            return (\n                (systemPresence.toLowerCase() === 'on_queue' ||\n                    systemPresence.toLowerCase() === 'on queue' ||\n                    this.isPresence('on_queue')) &&\n                !this.get('isOutOfOffice')\n            );\n        }\n    ),\n\n    isOfflineOrBusy: computed.or('isOffline', 'isBusy'),\n\n    activityPresence: computed('isOnQueue', 'isOutOfOffice', 'isOnline', 'isOffline', 'isAway', 'isBusy', function () {\n        if (this.get('isOnQueue')) {\n            return 'on_queue';\n        } else if (this.get('isOutOfOffice')) {\n            return 'out_of_office';\n        } else if (this.get('isOnline')) {\n            return 'available';\n        } else if (this.get('isAway')) {\n            return 'away';\n        } else if (this.get('isBusy')) {\n            return 'busy';\n        }\n\n        return 'offline';\n    }),\n    activityPresenceClass: computed('activityPresence', 'isOffline', 'isOutOfOffice', function () {\n        if (this.get('isOutOfOffice') && this.get('isOffline')) {\n            // Display offline CSS colors via class if out of office and signed out\n            return 'offline';\n        }\n        return this.get('activityPresence');\n    }),\n\n    isPresence(check) {\n        return isPresence(this.get('session.presenceMap'), this.get('presenceDefinition'), check);\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport { pluralize } from 'ember-inflector';\nimport cloneDeep from 'lodash/cloneDeep';\nimport find from 'lodash/find';\nimport isEmpty from 'lodash/isEmpty';\nimport keys from 'lodash/keys';\nimport parseInt from 'lodash/parseInt';\nimport sortBy from 'lodash/sortBy';\n\nconst profilePictureFieldKey = {\n    person: 'images.profile',\n    group: 'images.activeProfilePicture'\n};\n\nconst imageMappings = {\n    person: {\n        profile: 'uploads.images',\n        informal: 'images.informal',\n        agent: 'agent.profileImage'\n    },\n    group: {\n        profile: 'images.profilePictures',\n        informal: 'images.gallery'\n    }\n};\n\nconst missingFieldsCache = {};\n\nconst EntityMixin = Ember.Mixin.create({\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n\n    _currentSection: null,\n    _missingFieldsCache: missingFieldsCache,\n\n    _id: DS.attr(),\n    _entity: DS.attr(),\n    guid: DS.attr(),\n    state: DS.attr(),\n    version: DS.attr().volatile(),\n    mt: DS.attr(),\n\n    apps: DS.attr(),\n    orgId: DS.attr(),\n\n    init: function () {\n        Ember.set(this, '_initialData', {});\n        Ember.set(this, '_previousData', {});\n        Ember.set(this, '_changedSinceSave', []);\n\n        this._super();\n    },\n\n    name: Ember.computed('general.name.@each.value', function () {\n        return this.getFieldValue('general.name').value;\n    }),\n\n    type: Ember.computed(function () {\n        if (typeof this.fieldConfig === 'undefined') {\n            return '';\n        }\n        return this.fieldConfig.entityType;\n    }),\n\n    profilePicture: Ember.computed(\n        'images.profile',\n        'images.profile.[]',\n        'images.activeProfilePicture.[]',\n        'images.profile.@each.ref',\n        function () {\n            const pictureKey = profilePictureFieldKey[this.get('type')];\n            let fieldValue = this.getFieldValue(pictureKey);\n\n            if (!isEmpty(fieldValue)) {\n                return fieldValue.value;\n            } else {\n                fieldValue = this.getFieldValue(pictureKey, true);\n                if (!isEmpty(fieldValue.ref)) {\n                    return fieldValue.ref;\n                }\n            }\n\n            return null;\n        }\n    ),\n\n    profilePictureSizes: Ember.computed('profilePicture', function () {\n        const profilePicture = this.get('profilePicture');\n        if (profilePicture) {\n            // Strip off the 'x' in the keys and sort the available sizes.\n            return sortBy(keys(profilePicture).map(item => parseInt(item.substr(1))));\n        }\n        return [];\n    }),\n\n    uploadedImages: Ember.computed('uploads.images.[]', function () {\n        const type = this.get('type');\n        const path = imageMappings[type].profile;\n        return this.get(path);\n    }),\n\n    stateString: Ember.computed('state', function () {\n        return this.get('intl')\n            .lookup(`item.state.${this.get('data.state')}`)\n            .toString();\n    }),\n\n    _self: Ember.computed(function () {\n        return this;\n    }),\n\n    _missingFields: Ember.computed('_missingFieldsCache', function () {\n        return missingFieldsCache[this.get('id')] || [];\n    }),\n\n    recordPropertyChange(fieldPath) {\n        const changedSinceSave = this.get('_changedSinceSave');\n\n        const missingFields = this.get('_missingFields');\n        if (missingFields.indexOf(fieldPath) !== -1) {\n            missingFields.removeObject(fieldPath);\n        }\n\n        changedSinceSave.addObject(fieldPath);\n\n        this.notifyPropertyChange(fieldPath);\n    },\n\n    changedProperties() {\n        const changedSinceSave = this.get('_changedSinceSave');\n        const missingFields = this.get('_missingFields');\n        return (changedSinceSave || []).filter(field => missingFields.indexOf(field) < 0);\n    },\n\n    getReferencedField(fieldPath) {\n        const field = this.getFieldValue(fieldPath, true);\n\n        if (field.value && field.value.fieldId !== 'NONE') {\n            const referencedField = this.getFieldValue(field.value.fieldPath, true);\n\n            if (Ember.isArray(referencedField) && referencedField.length > 0) {\n                return find(referencedField, { _id: field.value.fieldId });\n            } else if (!isEmpty(referencedField)) {\n                return referencedField;\n            } else if (field.ref) {\n                // If the reference field path is not loaded, try the field.ref value.\n                return {\n                    value: field.ref\n                };\n            }\n\n            return referencedField;\n        }\n\n        return {};\n    },\n\n    getFieldValue(fieldPath, referencedLookup) {\n        if (fieldPath && typeof this.fieldConfig !== 'undefined') {\n            const fieldArray = Ember.get(this, fieldPath);\n            const repeatable = this.fieldConfig.isFieldRepeatable(fieldPath);\n            const reference = this.fieldConfig.isFieldReference(fieldPath);\n\n            if (!isEmpty(fieldArray)) {\n                if (reference && !referencedLookup) {\n                    return this.getReferencedField(fieldPath);\n                } else if (repeatable) {\n                    return fieldArray;\n                } else {\n                    return fieldArray[0];\n                }\n            }\n\n            return repeatable ? [] : {};\n        }\n\n        return [];\n    },\n\n    isFieldValueEmpty(fieldPath) {\n        if (fieldPath) {\n            const fieldArray = Ember.get(this, fieldPath);\n            if (fieldArray && fieldArray.length > 0) {\n                return !fieldArray.some(entry => entry && entry.value);\n            }\n        }\n        return true;\n    },\n\n    removeFieldValue(fieldPath, value) {\n        const repeatable = this.fieldConfig.isFieldRepeatable(fieldPath);\n        const currentFieldValue = this.getFieldValue(fieldPath);\n\n        if (repeatable) {\n            const object = find(currentFieldValue, value);\n            if (object && object !== -1) {\n                currentFieldValue.removeObject(object);\n            }\n        }\n    },\n\n    reset() {\n        const promise = this.reload();\n\n        // For some reason, we need to keep the state updated manually\n        promise.then(record => {\n            if (this.currentState.stateName.indexOf('uncommitted') < 0) {\n                this.adapterDidCommit();\n            }\n\n            return record;\n        });\n\n        return promise;\n    },\n\n    save() {\n        const state = this.get('currentState');\n\n        if (state.stateName.includes('deleted')) {\n            this.set('isDeleted', true);\n        }\n\n        const promise = this._super();\n        promise.then(this.onSaveSuccess.bind(this)).catch(this.onSaveError.bind(this));\n\n        return promise;\n    },\n\n    onSaveSuccess(entity) {\n        const copy = cloneDeep(this.get('data'));\n        this.set('_initialData', copy);\n\n        // Clear historical data\n        this.set('_previousData', {});\n\n        this.set('versionError', false);\n\n        if (entity._internalModal) {\n            const internal = entity._internalModel;\n            if (internal.adapterDidCommit) {\n                internal.adapterDidCommit();\n            }\n        }\n\n        return entity;\n    },\n\n    onSaveError(error) {\n        const data = error.responseJSON || {};\n        const publicApiError = error.errors && error.errors[0];\n\n        if (publicApiError && publicApiError.title && publicApiError.title.indexOf('version') > -1) {\n            // Try to extract error from text inside the public api response\n            const regex = /^.*\\[(\\d+)\\].*\\[(\\d+)\\].*$/i;\n            const matches = publicApiError.title.match(regex);\n            if (matches.length === 3) {\n                Ember.Logger.info('Version mismatch, retrying with correct version:', publicApiError);\n\n                this.set('versionError', true);\n\n                const version = matches[2];\n                this.set('version', version);\n\n                return Ember.RSVP.resolve(this.save())\n                    .then(this.onSaveSuccess.bind(this))\n                    .catch(this.onSaveError.bind(this));\n            }\n        } else if ((data && data.payload) || Ember.get(error, 'errors.length')) {\n            // Check error payload from directory-style error response\n            const payload = data.payload || Ember.get(error, 'errors.0.payload') || {};\n            if (payload.code === 'VERSION_MISMATCH') {\n                Ember.Logger.info('Version mismatch, retrying with correct version:', payload);\n\n                this.set('versionError', true);\n\n                this.set('version', payload.currentVersion);\n                return Ember.RSVP.resolve(this.save())\n                    .then(this.onSaveSuccess.bind(this))\n                    .catch(this.onSaveError.bind(this));\n            } else {\n                return Ember.RSVP.reject(error);\n            }\n        } else {\n            Ember.Logger.error(\"Couldn't save field config\", error);\n            return new Ember.RSVP.Promise((_, reject) => {\n                this.reload().then(() => reject(error));\n            });\n        }\n    },\n\n    saveSection(section) {\n        this.set('_currentSection', section);\n        return this.save()\n            .catch(response => {\n                if (response && response.errors) {\n                    const error = response.errors[0];\n                    if (error && Ember.get(error, 'payload.code') === 'VERSION_MISMATCH') {\n                        return Ember.RSVP.resolve(response);\n                    }\n                }\n                return Ember.RSVP.reject(response);\n            })\n            .finally(() => this.set('_currentSection', null));\n    },\n\n    set(field, value, options) {\n        options = options || {};\n        const overwrite = options.overwrite !== undefined ? options.overwrite : undefined;\n        const recordChange = options.recordChange !== undefined ? options.recordChange : true;\n\n        if (field.indexOf('.') === -1 || overwrite === true) {\n            return this._super(field, value);\n        }\n\n        const sectionKey = field.split('.')[0];\n\n        if (this.get(field) === undefined) {\n            if (!this.fieldConfig.getFieldByKey(field)) {\n                // This is getting loud...\n                // Ember.Logger.error(`The field \"${field}\" does not exist on entity`, this);\n                return undefined;\n            }\n\n            if (!this.get(sectionKey)) {\n                this._super(sectionKey, {});\n            }\n        }\n\n        // Delegate to Ember when not dealing with our own field config\n        if (!this.fieldConfig.getSectionByKey(sectionKey)) {\n            return this._super(field, value);\n        }\n\n        let currentField = this.getFieldValue(field);\n        const fieldDef = this.fieldConfig.getFieldByKey(field);\n\n        if (this.fieldConfig.isFieldRepeatable(field)) {\n            const data = {\n                tempId: Ember.generateGuid(),\n                value: value,\n                labelKey: fieldDef.labelKeys[0]\n            };\n\n            if (currentField && currentField.length > 0) {\n                currentField.addObject(data);\n            } else {\n                currentField = [data];\n            }\n        } else {\n            if (currentField && currentField._id) {\n                Ember.set(currentField, 'value', value);\n            } else {\n                currentField = {\n                    tempId: Ember.generateGuid(),\n                    value: value,\n                    labelKey: fieldDef.labelKeys[0]\n                };\n            }\n\n            currentField = [currentField];\n        }\n\n        if (recordChange) {\n            this.recordPropertyChange(field);\n        }\n\n        return this._super(field, currentField);\n    },\n\n    getPermissableSections() {},\n    getReadableSections() {},\n    getWriteableSections() {},\n    getReadableFieldsForSection() {},\n    getWriteableFieldsForSection() {},\n\n    deleteField(fieldPath, fieldId) {\n        const id = this.get('id');\n        const field = this.getFieldValue(fieldPath);\n\n        if (!fieldId) {\n            fieldId = field._id;\n        }\n\n        const version = this.get('version');\n\n        const type = pluralize(this.get('type'));\n        const path = `/directory/api/v2/${type}/${id}/${version}/field/${fieldPath}/${fieldId}`;\n\n        return this.get('ajax')\n            .del(path)\n            .then(data => {\n                this.set('version', data.rel.version);\n            });\n    }\n});\n\nexport default EntityMixin;\n","import Ember from 'ember';\nimport EvaluationModel from '../models/evaluation';\nimport moment from '../utils/dates';\n\nconst EvaluationsMixin = Ember.Mixin.create({\n    application: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    evaluationsAjax: Ember.$.ajax,\n\n    getEvaluations() {\n        return new Ember.RSVP.Promise(resolve => {\n            let promises = [];\n            let agentEvaluations = [];\n            let evaluatorEvaluations = [];\n            let assigneeEvaluations = [];\n            let payload = {\n                agentId: this.get('session.person.guid'),\n                evaluationState: ['Pending', 'InProgress'],\n                userType: 'evaluator'\n            };\n            let isAssigneeFeatureEnabled =\n                this.get('session.features') && this.get('session.features')['qm.release.evaluation.assignee'];\n            let isDisputesFeatureEnabled =\n                this.get('session.features') && this.get('session.features')['qm.release.evaluation.disputes'];\n\n            let evaluatorUri = `api/v2/quality/evaluations/query?`;\n            if (isAssigneeFeatureEnabled) {\n                evaluatorUri =\n                    evaluatorUri +\n                    `expand=agent` +\n                    `&expand=assignee` +\n                    `&evaluatorUserId=${payload.agentId}` +\n                    `&evaluationState=Pending` +\n                    `&evaluationState=InProgress` +\n                    `&pageSize=25`;\n            } else {\n                evaluatorUri =\n                    evaluatorUri +\n                    `expand=agent` +\n                    `&evaluatorUserId=${payload.agentId}` +\n                    `&evaluationState=Pending` +\n                    `&evaluationState=InProgress` +\n                    `&pageSize=25`;\n            }\n\n            let agentFinishedUri =\n                `api/v2/quality/evaluations/query?` +\n                `agentUserId=${payload.agentId}` +\n                `&isReleased=true` +\n                `&agentHasRead=false` +\n                `&evaluationState=Finished` +\n                `&pageSize=25`;\n\n            let agentInReviewUri =\n                `api/v2/quality/evaluations/query?` +\n                `agentUserId=${payload.agentId}` +\n                `&isReleased=true` +\n                `&evaluationState=InReview` +\n                `&pageSize=25`;\n\n            let assigneeUri =\n                `api/v2/quality/evaluations/query?` +\n                `expand=agent` +\n                `&expand=assignee` +\n                `&assigneeUserId=${payload.agentId}` +\n                `&pageSize=25`;\n\n            const startTime = moment().add(-1, 'month').toISOString();\n\n            agentFinishedUri = agentFinishedUri + `&startTime=${startTime}`;\n            agentInReviewUri = agentInReviewUri + `&startTime=${startTime}`;\n            evaluatorUri = evaluatorUri + `&startTime=${startTime}`;\n            assigneeUri = assigneeUri + `&startTime=${startTime}`;\n\n            let evaluatorRequest = {\n                url: this.get('application').pcUri(evaluatorUri),\n                cache: false,\n                method: 'GET',\n                contentType: 'application/json; charset=UTF-8'\n            };\n            let requestAgentFinished = {\n                url: this.get('application').pcUri(agentFinishedUri),\n                cache: false,\n                method: 'GET',\n                contentType: 'application/json; charset=UTF-8'\n            };\n            let requestAgentInReview = {\n                url: this.get('application').pcUri(agentInReviewUri),\n                cache: false,\n                method: 'GET',\n                contentType: 'application/json; charset=UTF-8'\n            };\n            let requestAssignee = {\n                url: this.get('application').pcUri(assigneeUri),\n                cache: false,\n                method: 'GET',\n                contentType: 'application/json; charset=UTF-8'\n            };\n\n            let locale = this.get('intl.isoLocale');\n            promises.push(\n                this.get('evaluationsAjax')(evaluatorRequest).then(({ entities = [] }) => {\n                    evaluatorEvaluations.push(\n                        entities.map(evaluation => {\n                            if (evaluation) {\n                                evaluation.changedDate =\n                                    isAssigneeFeatureEnabled && !evaluation.calibration\n                                        ? evaluation.dateAssigneeChanged || evaluation.assignedDate\n                                        : evaluation.assignedDate;\n                                evaluation.assignedDate =\n                                    evaluation.assignedDate &&\n                                    moment(evaluation.assignedDate).locale(locale).format('LLLL');\n                                evaluation.linkContext = 'admin';\n                            }\n                            return EvaluationModel.create(evaluation);\n                        })\n                    );\n                })\n            );\n\n            promises.push(\n                this.get('evaluationsAjax')(requestAgentFinished).then(({ entities = [] }) => {\n                    agentEvaluations.push(\n                        entities.map(evaluation => {\n                            if (evaluation) {\n                                evaluation.changedDate = evaluation.releaseDate;\n                                evaluation.assignedDate =\n                                    evaluation.assignedDate &&\n                                    moment(evaluation.assignedDate).locale(locale).format('LLLL');\n                                evaluation.linkContext = 'agent';\n                            }\n                            return EvaluationModel.create(evaluation);\n                        })\n                    );\n                })\n            );\n\n            if (isAssigneeFeatureEnabled) {\n                promises.push(\n                    this.get('evaluationsAjax')(requestAssignee).then(({ entities = [] }) => {\n                        assigneeEvaluations.push(\n                            entities.map(evaluation => {\n                                if (evaluation) {\n                                    evaluation.changedDate = evaluation.dateAssigneeChanged;\n                                    evaluation.assignedDate =\n                                        evaluation.assignedDate &&\n                                        moment(evaluation.assignedDate).locale(locale).format('LLLL');\n                                    evaluation.linkContext = 'admin';\n                                }\n                                return EvaluationModel.create(evaluation);\n                            })\n                        );\n                    })\n                );\n            }\n\n            if (isDisputesFeatureEnabled) {\n                promises.push(\n                    this.get('evaluationsAjax')(requestAgentInReview).then(({ entities = [] }) => {\n                        agentEvaluations.push(\n                            entities.map(evaluation => {\n                                if (evaluation) {\n                                    evaluation.changedDate = evaluation.releaseDate;\n                                    evaluation.assignedDate =\n                                        evaluation.assignedDate &&\n                                        moment(evaluation.assignedDate).locale(locale).format('LLLL');\n                                    evaluation.linkContext = 'agent';\n                                }\n                                return EvaluationModel.create(evaluation);\n                            })\n                        );\n                    })\n                );\n            }\n\n            let evaluationIdSet = {};\n            Ember.RSVP.all(promises).then(function () {\n                // It is important that the results are processed this way: evaluator results first, then assignee, and then agent\n                // That allows the de-duplication to use the most relevant of the results first and reject the same evaluation\n                // from less relevant queries\n                const resultData = evaluatorEvaluations\n                    .concat(assigneeEvaluations, agentEvaluations)\n                    .reduce((totalResult, queryResult) => {\n                        return totalResult.concat(\n                            queryResult.reduce((result, evaluation) => {\n                                if (!evaluationIdSet[evaluation.id]) {\n                                    evaluationIdSet[evaluation.id] = true;\n                                    result.push(evaluation);\n                                }\n                                return result;\n                            }, [])\n                        );\n                    }, []);\n                resolve(resultData); //resolve the promise when all inner promises are resolved\n            });\n        });\n    },\n\n    readEvaluation(evaluation) {\n        const evaluationIsAdminContext =\n            evaluation && evaluation.linkContext && evaluation.linkContext.toUpperCase() === 'ADMIN';\n        return (window.location.hash = `#/engage/${evaluationIsAdminContext ? 'admin' : 'agent'}/interactions/${\n            evaluation.conversation.id\n        }/?evaluationId=${evaluation.id}`);\n    }\n});\n\nexport default EvaluationsMixin;\n","import Ember from 'ember';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\nimport { componentClassName } from 'connections-ui/utils/external-contact-messaging';\n\nconst { inject } = Ember;\n\nconst { computed } = Ember;\n\nexport default Ember.Mixin.create(RelateFeaturesMixin, {\n    relate: inject.service(),\n    names: inject.service(),\n    externalContacts: inject.service(),\n\n    externalContactProfiles: null,\n\n    conversationId: null,\n    mediaType: null,\n\n    participants: [],\n    consultAgentParticipant: null,\n    consultParticipant: null,\n    communicationId: null,\n    hasMultipleExternalContactMatches: computed.gt('externalContactProfiles.length', 1),\n\n    isIncomingFromExternalContacts: computed.and('hasRelateAccess', 'isIncoming', 'hasExternalContactProfiles'),\n    isConnectedWithExternalContact: computed.and('hasRelateAccess', 'isConnected', 'hasOneExternalContactProfile'),\n    hasExternalContactProfiles: computed.notEmpty('externalContactProfiles'),\n    hasOneExternalContactProfile: computed.equal('externalContactProfiles.length', 1),\n\n    /**\n     * Returns the \"class\" of the thing that mixes in this mixin (the \"inheritor\")\n     * @private\n     */\n    _nameForInheritor() {\n        return componentClassName.call(this);\n    },\n\n    // This CP is used by the navbar.hbs template for for direct incoming (not to an agent's queue) calls\n    externalContactFullName: computed('externalContactProfiles.[]', function () {\n        const externalProfile = this.get('externalContactProfiles.firstObject');\n        if (externalProfile) {\n            return this.get('names').fullName(externalProfile);\n        }\n        return this.get('otherPartyThatIsNotTheInitiator.calls.firstObject.other.name');\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport ajax from 'ember-ajax';\nimport FaxModel from '../models/fax';\n\nconst FaxesMixin = Ember.Mixin.create({\n    application: Ember.inject.service(),\n\n    getFaxes() {\n        return new Ember.RSVP.Promise(resolve => {\n            let request = {\n                contentType: 'application/json; charset=UTF-8',\n                cache: false\n            };\n            let url = this.get('application').pcV2Uri('api/v2/fax/documents');\n\n            return ajax(url, request).then(({ entities = [] }) => {\n                let owner = Ember.getOwner(this);\n                return resolve(\n                    _.map(entities, function (fax) {\n                        return FaxModel.create(fax, owner.ownerInjection());\n                    })\n                );\n            });\n        });\n    },\n\n    readFax(fax) {\n        this.changeFaxReadState(fax, true);\n        let contentUri = fax.get('contentUri');\n        let sharingUri = fax.get('sharingUri');\n\n        if (sharingUri) {\n            window.open(sharingUri);\n        } else {\n            ajax(contentUri, {\n                cache: false\n            }).then(contentLocationUri => {\n                window.open(contentLocationUri);\n            });\n        }\n    },\n\n    markFaxesRead(faxes) {\n        _.each(faxes, fax => {\n            this.changeFaxReadState(fax, true);\n        });\n    },\n\n    markFaxesUnread(faxes) {\n        _.each(faxes, fax => {\n            this.changeFaxReadState(fax, false);\n        });\n    },\n\n    changeFaxReadState(fax, read) {\n        fax.set('read', read);\n        let id = fax.get('id');\n        ajax(this.get('application').pcV2Uri(`api/v2/fax/documents/${id}`), {\n            cache: false,\n            method: 'PUT',\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'json',\n            data: JSON.stringify({\n                id: id,\n                read: read\n            })\n        });\n    },\n\n    renameFax(fax, name) {\n        fax.set('name', name);\n        let id = fax.get('id');\n        return ajax(this.get('application').pcV2Uri(`api/v2/fax/documents/${id}`), {\n            cache: false,\n            method: 'PUT',\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'json',\n            data: {\n                name\n            }\n        });\n    },\n\n    deleteFaxes(faxes) {\n        Ember.RSVP.all(\n            _.map(faxes, fax => {\n                this.deleteFax(fax);\n            })\n        );\n    },\n\n    downloadFax(id) {\n        ajax(this.get('application').pcV2Uri(`api/v2/fax/documents/${id}/content`), {\n            cache: false,\n            method: 'GET',\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'json'\n        }).then(function ({ contentLocationUri }) {\n            window.open(contentLocationUri);\n        });\n    },\n\n    deleteFax(fax) {\n        ajax(this.get('application').pcV2Uri(`api/v2/fax/documents/${fax.get('id')}`), {\n            cache: false,\n            method: 'DELETE',\n            contentType: 'application/json; charset=UTF-8'\n        });\n    }\n});\n\nexport default FaxesMixin;\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nconst { run, inject, computed, RSVP, Mixin } = Ember;\n\nexport default Mixin.create({\n    classNames: ['field-component'],\n    classNameBindings: ['field.key', 'fieldTypeClass', 'isEmpty:empty-field', 'isNewField:new-field-entry-component'],\n\n    intl: inject.service(),\n    logger: inject.service('stash-logger'),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n\n    entity: null,\n\n    allFieldData: [],\n\n    fieldData: null,\n    field: computed.reads('fieldData.field'),\n    writeable: computed.reads('fieldData.writeable'),\n    isValid: computed.reads('fieldData.isValid'),\n    isEmpty: computed.alias('fieldData.isEmpty'),\n\n    editing: false,\n    showLabel: false,\n\n    isNewField: false,\n    savingField: false,\n\n    complexField: false,\n    complexValueFields: [], // Override complex fields for simple 'entry.value' bindings to fire\n\n    timers: null,\n\n    attrs: {\n        cancelAddNew: () => {}\n    },\n\n    init() {\n        this.timers = [];\n\n        this._super(...arguments);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.attachObserversForComplexFields();\n    },\n\n    willDestroyElement() {\n        this.timers.forEach(timer => Ember.run.cancel(timer));\n        this.timers = [];\n\n        this._super(...arguments);\n    },\n\n    entry: computed('fieldData.value', 'fieldData.valueReference', function () {\n        return this.get('fieldData.value') || this.get('fieldData.valueReference');\n    }),\n\n    fieldTypeClass: computed('field.type', function () {\n        return `${this.get('field.type')}-field`;\n    }),\n\n    canEdit: computed('editing', 'fieldData.writeable', function () {\n        var editing = this.get('editing');\n\n        if (!editing) {\n            return DS.PromiseObject.create({\n                promise: Ember.RSVP.resolve(false)\n            });\n        }\n\n        return this.get('fieldData.writeable');\n    }),\n\n    attachObserversForComplexFields() {\n        var fields = this.get('complexValueFields');\n        if (_.isEmpty(fields)) {\n            return;\n        }\n\n        _.each(fields, field => {\n            this.addObserver(field, this, this.notifyComplexPropertyChange);\n        });\n    },\n\n    isFieldEmpty() {},\n\n    notifyComplexPropertyChange() {\n        run.once(this, this.performNotification);\n    },\n\n    performNotification() {\n        let fieldData = this.get('fieldData');\n        if (fieldData) {\n            fieldData.notifyPropertyChange('isEmpty');\n            fieldData.notifyPropertyChange('isValid');\n        }\n    },\n\n    // Called before save\n    cleanFieldForSave: () => {},\n\n    // Override for empty logic check for complex fields\n    isComplexFieldEmpty() {\n        return false;\n    },\n\n    saveField(value) {\n        if (this.get('savingField')) {\n            return new RSVP.Promise(function (resolve) {\n                resolve({});\n            });\n        }\n\n        const entity = this.get('entity');\n        const fieldPath = this.get('field').getFieldPath();\n\n        if (value || value === '') {\n            this.set('entry.value', value);\n            entity.set(fieldPath, value);\n        }\n\n        this.set('savingField', true);\n\n        const section = this.get('field.section');\n        if (section) {\n            return entity.saveSection(section).finally(() => this.set('savingField', false));\n        }\n        return entity.save();\n    }\n});\n","import Ember from 'ember';\nimport moment from 'connections-ui/utils/dates';\n\nexport default Ember.Mixin.create({\n    notification: Ember.inject.service('notification-proxy'),\n    intl: Ember.inject.service(),\n    phone: Ember.inject.service(),\n\n    didFlag: Ember.computed.bool('flaggedSelves.length'),\n    flagOperationInProcess: false,\n\n    flaggedSelves: Ember.computed('call.participants.@each.flaggedReason', 'call.myGuid', function () {\n        let myParticipants = this.get('call.participants');\n        if (!myParticipants) {\n            return [];\n        }\n        let myGuid = this.get('call.myGuid');\n        let myFlaggedParticipants = myParticipants.filter(\n            participant => participant.user && participant.user.id === myGuid && participant.flaggedReason\n        );\n        return myFlaggedParticipants;\n    }),\n\n    // allow flagging/unflagging calls for 45 minutes from end time (analytics service's window for accepting new events for a call is 60 minutes)\n    allowFlagChange: Ember.computed('call.callEnd', 'clock.minute', function () {\n        let minutesPassed = moment().diff(this.get('call.callEnd'), 'minutes');\n        return minutesPassed < 45;\n    }),\n\n    flagInteractionAction(action) {\n        if (this.get('allowFlagChange')) {\n            this.set('flagOperationInProcess', true);\n            const participants = action === 'flag' ? [this.get('call.myParticipant')] : this.get('flaggedSelves');\n            this.get('phone')\n                .flagCallHistoryInteraction(action, this.get('call'), participants)\n                .then(() => {\n                    this.set('flagOperationInProcess', false);\n                });\n        } else {\n            const message = this.get('intl').lookup('notification.purecloud.tooLateToFlag');\n            this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n        }\n    }\n});\n","import Mixin from 'smoke-and-mirrors/mixins/in-viewport';\n\nexport default Mixin;\n","import Ember from 'ember';\n\nconst { computed } = Ember;\n\n// ==========================================================\n// NOTICE: This mixin is intended to be consumed by the\n// Interaction component. It inherits servies injects and\n// dependencies from the parent component.\n// ==========================================================\n//\n// Rules for showing/hiding/disabling session share button\n//\n// 1. If the agent has session share permissions then the\n// session share button should be visible (it may be disabled\n// when end customer's browser cannot support screen share).\n//\n// 2. If the agent has session share permissions and the end\n// user is using Firefox - button is enabled.\n//\n// 3. If the agent has session share permissions and the end\n// user is using Chrome AND has the screen share extension\n// installed - button is enabled.\n//\n// 4. If the agent has session share permissions and the end\n// user is using any browser except Firefox or Chrome the\n// screen share button is disabled with tooltip.\n//\n// 5. If the agent has session share permissions and the end\n// user is using Chrome but does NOT have the screen share\n// extension, button is disabled with tooltip.\n//\n// ==========================================================\n\nexport default Ember.Mixin.create({\n    // Configuration\n\n    customerBrowserDetails: computed(\n        'interaction.customerDetails.{isChrome,isFirefox,isEdgeChromium,hasChromeExtension,cobrowseType,standAloneApplication,canScreenshare,canCobrowse}',\n        function () {\n            const customerDetails = this.get('interaction.customerDetails');\n\n            if (!customerDetails) {\n                return {};\n            }\n\n            // because the object we get has stringified the boolean values, need to convert these to true and false\n            const isChrome = Ember.get(customerDetails, 'isChrome') === 'true' ? true : false;\n            const isFirefox = Ember.get(customerDetails, 'isFirefox') === 'true' ? true : false;\n            const isEdgeChromium = Ember.get(customerDetails, 'isEdgeChromium') === 'true' ? true : false;\n            const hasChromeExtension = Ember.get(customerDetails, 'hasChromeExtension') === 'true' ? true : false;\n            const isStandAloneApplication =\n                Ember.get(customerDetails, 'standAloneApplication') === 'true' ? true : false;\n            const canScreenshare = Ember.get(customerDetails, 'canScreenshare') === 'true' ? true : false;\n            const canCobrowse = Ember.get(customerDetails, 'canCobrowse') === 'true' ? true : false;\n            const cobrowseType = Ember.get(customerDetails, 'cobrowseType') || canCobrowse ? true : false;\n            return {\n                isChrome,\n                isFirefox,\n                isEdgeChromium,\n                hasChromeExtension,\n                cobrowseType,\n                isStandAloneApplication,\n                canScreenshare,\n                canCobrowse\n            };\n        }\n    ),\n\n    isCustomerConfiguredForCobrowse: computed.or(\n        'customerBrowserDetails.cobrowseType',\n        'customerBrowserDetails.canCobrowse'\n    ),\n\n    isCustomerConfiguredForScreenShare: computed(\n        'interaction.isV2Provider',\n        'customerBrowserDetails.{isChrome,isFirefox,isEdgeChromium,hasChromeExtension,isStandAloneApplication}',\n        function () {\n            // screenshare is not supported for v2 providers\n            if (this.get('interaction.isV2Provider')) {\n                return false;\n            }\n\n            const customerBrowserDetails = this.get('customerBrowserDetails');\n            if (\n                Ember.get(customerBrowserDetails, 'canScreenshare') ||\n                Ember.get(customerBrowserDetails, 'isFirefox') ||\n                (Ember.get(customerBrowserDetails, 'isChrome') &&\n                    Ember.get(customerBrowserDetails, 'hasChromeExtension')) ||\n                Ember.get(customerBrowserDetails, 'isEdgeChromium') ||\n                Ember.get(customerBrowserDetails, 'isStandAloneApplication')\n            ) {\n                return true;\n            }\n            return false;\n        }\n    ),\n\n    screenShareMisconfiguration: computed(\n        'isCustomerConfiguredForScreenShare',\n        'isAgentAllowedToScreenShare',\n        function () {\n            return this.get('isCustomerConfiguredForScreenShare') === !this.get('isAgentAllowedToScreenShare');\n        }\n    ),\n\n    cobrowseMisconfiguration: computed('isCustomerConfiguredForCobrowse', 'isAgentAllowedToCobrowse', function () {\n        return this.get('isCustomerConfiguredForCobrowse') === !this.get('isAgentAllowedToCobrowse');\n    }),\n\n    // Permissions & Feature Toggles\n\n    canCobrowseChat: computed.reads('permissions.canViewAcdCoBrowseForChat'),\n    canCobrowseCall: computed.reads('permissions.canViewAcdCoBrowseForCall'),\n\n    isAgentAllowedToCobrowseCall: computed.and('isCall', 'canCobrowseCall'),\n    isAgentAllowedToCobrowseChat: computed.and('isChat', 'canCobrowseChat'),\n    isAgentAllowedToCobrowse: computed.or('isAgentAllowedToCobrowseCall', 'isAgentAllowedToCobrowseChat'),\n\n    canScreenShare: computed.reads('permissions.canViewAcdScreenShare'),\n\n    isAgentAllowedToScreenShareCall: computed.and('isCall', 'canScreenShare'),\n    isAgentAllowedToScreenShareChat: computed.and('isChat', 'canScreenShare'),\n    isAgentAllowedToScreenShare: computed.or('isAgentAllowedToScreenShareCall', 'isAgentAllowedToScreenShareChat'),\n\n    // Tooltips\n\n    sessionShareStartVideoTooltip: computed('webrtc.activeBridge', function () {\n        if (!this.get('webrtc.activeBridge')) {\n            return 'purecloud.acdInteraction.sessionShare.noVideoWarning';\n        }\n        return 'purecloud.acdInteraction.sessionShare.startVideo';\n    }),\n\n    sessionShareStartTooltip: computed(\n        'webrtc.{activeBridge,screenShareViaHawk}',\n        'disableShareButtonReason',\n        'customerBrowserDetails.isStandAloneApplication',\n        'interaction.canScreenShare',\n        function () {\n            const canScreenShareViaHawk =\n                this.get('interaction.canScreenShare') && this.get('webrtc.screenShareViaHawk');\n            /* if we cannot screen share via hawk, we need to check the activeBridge */\n            if (!canScreenShareViaHawk && !this.get('webrtc.activeBridge')) {\n                return 'purecloud.acdInteraction.sessionShare.noVideoWarning';\n            } else if (this.get('disableShareButtonReason') && this.get('isChat')) {\n                return this.get('disableShareButtonReason');\n            } else if (this.get('customerBrowserDetails.isStandAloneApplication') && this.get('isChat')) {\n                return 'purecloud.acdInteraction.sessionShare.customerUsingStandAloneApplication';\n            }\n            return 'purecloud.acdInteraction.sessionShare.start';\n        }\n    ),\n\n    webMessagingCobrowseStartTooltip: computed(\n        'interaction.cobrowseSessionShareActive',\n\n        function () {\n            if (!this.get('interaction.cobrowseSessionShareActive')) {\n                return 'purecloud.acdInteraction.cobrowseNext.startCobrowse';\n            }\n            return 'purecloud.acdInteraction.sessionShare.screenShareActive';\n        }\n    ),\n\n    // Session Share State\n\n    isCoBrowse: computed.bool('interaction.isCoBrowse'),\n\n    isRequestingScreenShareOrCoBrowse: computed.alias('interaction.isRequestingScreenShareOrCoBrowse'),\n    isRequestingVideo: computed.alias('interaction.isRequestingVideo'),\n\n    isAgentDisconnectedFromSharedSession: computed.reads('interaction.isAgentDisconnectedFromSharedSession'),\n    isCustomerDisconnectedFromSharedSession: computed.reads('interaction.isCustomerDisconnectedFromSharedSession'),\n\n    isSessionCodeRequired: computed.alias('interaction.isSessionCodeRequired'),\n\n    // Button Enablement\n\n    disableShareButtonReason: computed(\n        'screenShareMisconfiguration',\n        'cobrowseMisconfiguration',\n        'customerBrowserDetails.{isChrome,isFirefox,isEdgeChromium,hasChromeExtension,isStandAloneApplication}',\n        function () {\n            const customerBrowserDetails = this.get('customerBrowserDetails');\n            const isConfigured =\n                this.get('isCustomerConfiguredForCobrowse') ||\n                this.get('isCustomerConfiguredForScreenShare') ||\n                this.get('customerBrowserDetails.isStandAloneApplication');\n\n            if (!customerBrowserDetails || isConfigured) {\n                return false;\n            }\n\n            if (this.get('screenShareMisconfiguration')) {\n                if (\n                    Ember.get(customerBrowserDetails, 'isChrome') &&\n                    !Ember.get(customerBrowserDetails, 'hasChromeExtension')\n                ) {\n                    return 'purecloud.acdInteraction.sessionShare.error.noChromeExtension';\n                }\n                if (\n                    !Ember.get(customerBrowserDetails, 'isFirefox') &&\n                    !Ember.get(customerBrowserDetails, 'isChrome') &&\n                    !Ember.get(customerBrowserDetails, 'isEdgeChromium')\n                ) {\n                    return 'purecloud.acdInteraction.sessionShare.error.notUsingSupportedBrowser';\n                }\n            } else if (this.get('cobrowseMisconfiguration')) {\n                return 'purecloud.acdInteraction.sessionShare.error.notConfiguredForCobrowse';\n            }\n        }\n    ),\n\n    disableVideoButton: computed.bool('interactionService.hasActiveSessionShare'),\n\n    disableShareButton: computed(\n        'disableVideoButton',\n        'isCustomerConfiguredForCobrowse',\n        'isCustomerConfiguredForScreenShare',\n        'interaction.isV2Provider',\n        function () {\n            if (this.get('interaction.isV2Provider')) {\n                return false;\n            }\n            return (\n                this.get('disableVideoButton') ||\n                !(this.get('isCustomerConfiguredForCobrowse') || this.get('isCustomerConfiguredForScreenShare'))\n            );\n        }\n    ),\n\n    shouldShowSessionShareButton: computed(\n        'interaction.isV2Provider',\n        'isAgentAllowedToScreenShare',\n        'isAgentAllowedToCobrowse',\n        'interaction.myselfIsMonitor',\n        'interaction.myselfIsCoach',\n        function () {\n            // session-share is not supported for v2 widgets or for MCB participants\n            if (\n                this.get('interaction.isV2Provider') ||\n                this.get('interaction.myselfIsMonitor') ||\n                this.get('interaction.myselfIsCoach')\n            ) {\n                return false;\n            }\n            // Show the button if agent has either permission\n            return this.get('isAgentAllowedToScreenShare') || this.get('isAgentAllowedToCobrowse');\n        }\n    ),\n\n    enableAcdSessionShare: computed(\n        'isConnected',\n        'isCall',\n        'isChat',\n        'interaction.onConsult',\n        'isInternalProvider',\n        function () {\n            const isInternalProvider = this.get('isInternalProvider');\n            return (\n                isInternalProvider &&\n                (this.get('isCall') || this.get('isChat')) &&\n                this.get('isConnected') &&\n                !this.get('interaction.onConsult')\n            );\n        }\n    )\n});\n","import Ember from 'ember';\n\nconst { computed } = Ember;\n\nexport default Ember.Mixin.create({\n    acdVoicemailTooltip: computed('acdVoicemailPlayerVisible', function () {\n        if (!this.get('acdVoicemailPlayerVisible')) {\n            return 'purecloud.acdInteraction.voicemail.showAudioPlayer';\n        }\n        return 'purecloud.acdInteraction.voicemail.hideAudioPlayer';\n    }),\n\n    holdTooltipTitle: computed('interaction.isHeld', function () {\n        if (this.get('interaction.isHeld')) {\n            return 'purecloud.acdInteraction.unhold';\n        }\n        return 'purecloud.acdInteraction.hold';\n    }),\n\n    muteTooltipTitle: computed('interaction.conversation.isMuted', function () {\n        if (this.get('interaction.conversation.isMuted')) {\n            return 'purecloud.acdInteraction.unmute';\n        }\n        return 'purecloud.acdInteraction.mute';\n    }),\n\n    scriptToolTip: computed('disabledScriptButton', function () {\n        if (this.get('disabledScriptButton')) {\n            return 'purecloud.acdInteraction.scriptsNotAvailable';\n        }\n        return 'purecloud.acdInteraction.scripts';\n    }),\n\n    skipACWTooltipTitle: computed('interaction.isCommunicationAfterCallWorkRequested', function () {\n        if (this.get('interaction.isCommunicationAfterCallWorkRequested')) {\n            return 'purecloud.acdInteraction.skipACW';\n        }\n        return 'purecloud.acdInteraction.requestACW';\n    })\n});\n","import Ember from 'ember';\n\nvar currentJobs = [];\nvar finishedJobs = [];\n\nfunction jobEndpoint(id) {\n    return `/api/v2/jobs/${id}`;\n}\n\nexport default Ember.Mixin.create({\n    ajax: Ember.inject.service(),\n\n    _currentJobs: currentJobs,\n    _finishedJobs: finishedJobs,\n\n    addJob: function (job, callback, scope) {\n        if (job) {\n            job.callback = callback;\n            job.scope = scope || this;\n            job.interval = window.setInterval(() => {\n                this.getJobData(job);\n            }, 5000);\n\n            currentJobs.addObject(job);\n        }\n    },\n\n    getJobData: function (job) {\n        return this.get('ajax')\n            .ajaxGet(jobEndpoint(job.jobId))\n            .then(\n                data => {\n                    data = data.res;\n\n                    var retryJobId = data.retryJobId;\n\n                    if (data.status !== 'in-progress' && data.status !== 'pending') {\n                        window.clearInterval(job.interval);\n\n                        if (data.status === 'retry') {\n                            job.jobId = retryJobId;\n                            this.handleJob(job);\n                        } else if (job.status === 'failed') {\n                            currentJobs.removeObject(job);\n                            finishedJobs.addObject(job);\n\n                            job.callback.apply(job.scope, [job]);\n                        } else {\n                            currentJobs.removeObject(job);\n                            finishedJobs.addObject(job);\n\n                            job.callback.apply(job.scope, [job]);\n                        }\n                    }\n                },\n                function () {\n                    window.clearInterval(job.interval);\n\n                    currentJobs.removeObject(job);\n                    finishedJobs.addObject(job);\n\n                    job.callback.apply(job.scope, [job]);\n                }\n            );\n    }\n});\n","define(\"connections-ui/mixins/logger\", [\"exports\", \"ember-purecloud-components/mixins/logger\"], function (_exports, _logger) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _logger.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default Ember.Mixin.create({\n    actions: {\n        error(error) {\n            const errorState = { type: 'profileFetchServerFailure' };\n\n            Ember.Logger.error(error);\n\n            if (error && error.errors) {\n                error = _.head(error.errors);\n            }\n\n            if (error) {\n                let code = error.code;\n                if (typeof error.status === 'number') {\n                    code = error.status;\n                }\n                if (code >= 400 && code < 500) {\n                    this.transitionTo('index');\n                } else if (error.status >= 500) {\n                    this.set('application.errorState', errorState);\n                    this.transitionTo('maintenance');\n                }\n            } else if (!error) {\n                this.set('application.errorState', errorState);\n                this.transitionTo('maintenance');\n            }\n        }\n    }\n});\n","import Ember from 'ember';\n\nvar PagingMixin = Ember.Mixin.create({\n    entityType: null,\n\n    currentPage: null,\n    cachedTotal: null,\n\n    limit: 10,\n    extraParams: Ember.computed(function () {\n        return {};\n    }),\n\n    fieldList: null,\n\n    actions: {\n        nextPage() {\n            if (this.get('hasNextPage')) {\n                this.incrementProperty('currentPage');\n                this.loadPage();\n            }\n        },\n\n        prevPage() {\n            if (this.get('hasPrevPage')) {\n                this.decrementProperty('currentPage');\n                this.loadPage();\n            }\n        }\n    },\n\n    ensureCorrectProperties: Ember.on('init', function () {\n        if (!this.get('entityType')) {\n            this.set('entityType', 'person');\n        }\n\n        this.set('currentPage', 0);\n        this.set('cachedTotal', 0);\n    }),\n\n    offset: Ember.computed('limit', 'currentPage', function () {\n        return this.get('limit') * this.get('currentPage');\n    }),\n\n    currentPageDisplay: Ember.computed('currentPage', function () {\n        return this.get('currentPage') + 1;\n    }),\n\n    totalPages: Ember.computed('currentPage', 'content.[]', 'page', 'cachedTotal', function () {\n        var cachedTotal = this.get('cachedTotal') || 0;\n\n        return Math.ceil(cachedTotal / this.get('limit'));\n    }),\n\n    hasNextPage: Ember.computed('currentPageDisplay', 'totalPages', function () {\n        return this.get('currentPageDisplay') < this.get('totalPages');\n    }),\n\n    hasPrevPage: Ember.computed('currentPage', function () {\n        return this.get('currentPage') !== 0;\n    }),\n\n    haveContent: Ember.computed('content.[]', 'currentPage', function () {\n        var content = this.get('content');\n        if (content) {\n            return content.get('length') > 0;\n        }\n\n        return false;\n    }),\n\n    loadPage() {\n        let directory = true;\n        let entityType = this.get('entityType');\n        let extraParams = this.get('extraParams');\n\n        let letterUpdate = {};\n        if (entityType === 'group') {\n            letterUpdate = {\n                letter: null\n            };\n        }\n\n        let params = Object.assign(\n            {},\n            {\n                limit: this.get('limit'),\n                offset: this.get('offset'),\n                directory: directory\n            },\n            extraParams,\n            letterUpdate\n        );\n\n        if (this.get('fieldList')) {\n            params = Object.assign({}, params, {\n                fl: this.get('fieldList')\n            });\n        }\n\n        let page = this.store.query(entityType, params);\n\n        page.then(data => {\n            let content = data;\n            if (data.content) {\n                content = data.content;\n            }\n\n            content = content.map(x => x.getRecord());\n\n            this.set('content', content);\n\n            let cachedTotal = Ember.get(data, 'meta.count');\n            if (cachedTotal > 0) {\n                this.set('cachedTotal', cachedTotal);\n            }\n\n            return content;\n        });\n\n        this.set('page', page);\n\n        return page;\n    }\n});\n\nexport default PagingMixin;\n","import Ember from 'ember';\n\nconst { computed } = Ember;\n\nexport default Ember.Mixin.create({\n    activeCall: null,\n    isHeld: computed.reads('activeCall.isHeld'),\n    isMuted: computed.reads('activeCall.isMuted'),\n    isRecording: computed.reads('activeCall.isRecording'),\n    isActiveCallACD: computed('activeCall.{isAgentCall,myselfIsMonitor,myselfIsCoach,myselfIsBarged}', function () {\n        if (!this.get('activeCall')) {\n            return false;\n        }\n        return (\n            this.get('activeCall.isAgentCall') &&\n            !this.get('activeCall.myselfIsMonitor') &&\n            !this.get('activeCall.myselfIsCoach') &&\n            !this.get('activeCall.myselfIsBarged')\n        );\n    }),\n    isOutsideCall: computed('activeCall.otherParty.purpose', function () {\n        const purpose = this.get('activeCall.otherParty.purpose');\n        return purpose === 'external';\n    }),\n    myself: computed('activeCall.myself', function () {\n        // TODO: can this be removed?\n        return this.get('activeCall.myself');\n    }),\n    onCall: computed.reads('activeCall.onCall'),\n    setActiveCall(conversation) {\n        this.set('activeCall', conversation);\n        this.notifyPropertyChange('activeCall');\n    },\n    cleanupActiveCall() {\n        return this.setActiveCall(null);\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport { task, timeout } from 'ember-concurrency';\nimport AutoSaveDevicesMixin from 'ember-webrtc-components/mixins/webrtc-service/auto-save-devices';\nimport webrtcConversationTypes from 'ember-webrtc-components/utils/webrtc-conversation-types';\n\nconst CALL_CONVERSATION_CREATED_EVENT = 'callConversationCreated';\n\nconst Promise = Ember.RSVP.Promise;\nconst { run, inject, observer } = Ember;\n\nexport default Ember.Mixin.create(AutoSaveDevicesMixin, {\n    headset: inject.service(),\n    session: inject.service(),\n    webrtc: inject.service(),\n    phone: inject.service(),\n    store: inject.service(),\n    webrtcSdkService: inject.service('webrtcSdk'),\n\n    // temp variables for user actions (merging, dialing)\n    attemptingToCall: null,\n    shouldPromptForMerge: false,\n    callToMergeInto: null,\n    mergeData: null,\n\n    deviceMuteEvent(isMuted) {\n        const call = this.get('activeCall');\n        if (call && this.get('isMuted') !== isMuted) {\n            this.mute(call);\n        }\n    },\n\n    deviceHoldEvent(holdRequested, toggle) {\n        const call = this.get('activeCall');\n        if (!call) {\n            return;\n        }\n\n        // this is because jabra sends an unmute request after the call ends. Presumably to get the headset in a vanilla state\n        if (toggle && !call.get('isConnected')) {\n            return;\n        }\n\n        if (toggle || call.get('isHeld') !== holdRequested) {\n            this.hold(call);\n        }\n    },\n\n    deviceCallRejectedEvent(conversationId) {\n        let conversation;\n        if (conversationId) {\n            conversation = this.get('conversations').findBy('id', conversationId);\n        } else {\n            conversation = this.get('conversations').find(conversation => {\n                return conversation.get('isDialing') && conversation.get('isIncoming');\n            });\n        }\n\n        this.sendToVoicemail(conversation);\n    },\n\n    init() {\n        this._super(...arguments);\n        run.next(() => {\n            if (this.get('webrtcSdkService.useSdk')) {\n                this.enableHeadsets(this.get('webrtcSdkService'));\n            } else {\n                this.enableHeadsets(this.get('headset'));\n            }\n        });\n    },\n\n    changeHeadsetSource: observer('webrtcSdkService.useSdk', function () {\n        if (this.get('webrtcSdkService.useSdk')) {\n            this.enableHeadsets(this.get('webrtcSdkService'));\n        }\n    }),\n\n    enableHeadsets(headsetSource) {\n        const headset = headsetSource;\n        headset.on('deviceMuteStatusChanged', isMuted => {\n            this.deviceMuteEvent(isMuted);\n        });\n        headset.on('deviceHoldStatusChanged', (holdRequested, toggle) => {\n            this.deviceHoldEvent(holdRequested, toggle, true);\n        });\n        headset.on('deviceRejectedCall', conversationId => {\n            this.deviceCallRejectedEvent(conversationId, true);\n        });\n    },\n\n    callVoicemail() {\n        return this.makeCall('*86');\n    },\n\n    _handleValidationError(error) {\n        const validationError = {\n            valid: false,\n            validationError: error\n        };\n        this.logger.warn('Call validation failed', validationError);\n        return Promise.reject('Call validation failed', validationError);\n    },\n\n    webrtcPhoneWithIssues: Ember.computed(\n        'phone.station.{isWebrtc,webRtcRequireMediaHelper}',\n        'webrtc.webrtcAudioCallIssueKey',\n        function () {\n            return (\n                this.get('phone.station.isWebrtc') &&\n                this.get('webrtc.webrtcAudioCallIssueKey') &&\n                !this.get('phone.station.webRtcRequireMediaHelper')\n            );\n        }\n    ),\n\n    _validateCall(phoneNumber, callingPerson, onbehalfOfQueue) {\n        if (this.get('station.isWebrtc')) {\n            if (!this.get('carrierPigeonConnected')) {\n                this.get('notification').error(\n                    null,\n                    this.get('intl').lookup('notification.purecloud.webrtcPhoneUnavailable'),\n                    {\n                        hideAfter: 5,\n                        tag: 'webrtc-phone-unavailable'\n                    }\n                );\n\n                return this._handleValidationError('Station is webrtc and carrier pigeon is not connected');\n            } else if (this.get('webrtcPhoneWithIssues')) {\n                const intl = this.get('intl');\n                const title = intl.t('notification.titles.callError').toString();\n                const message = intl.t(this.get('webrtc.webrtcAudioCallIssueKey'));\n                this.get('notification').info(title, message);\n                return this._handleValidationError('Station is webrtc and has audio issues');\n            }\n        }\n\n        let message = this.get('intl').lookup('notification.purecloud.nonACDOnQueue');\n        if (this.get('onQueue') && (!onbehalfOfQueue || !onbehalfOfQueue.id)) {\n            message = this.get('intl').lookup('notification.purecloud.nonACDOnQueue');\n            this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n        }\n        let station = this.get('station');\n        let noStation = station === undefined || station === null;\n        if (noStation) {\n            this.set('needStation', true);\n            this.notifyPropertyChange('needStation');\n            message = this.get('intl').lookup('notification.purecloud.noStationSelected');\n            this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n\n            return this._handleValidationError('No station selected');\n        }\n        if (this.get('phoneDisabled')) {\n            this.set('needStation', true);\n            this.notifyPropertyChange('needStation');\n            message = this.get('intl').lookup('notification.purecloud.unsupportedStation');\n            this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n\n            return this._handleValidationError('Phone service disabled');\n        }\n        return Promise.resolve();\n    },\n\n    _throttledHoldOtherConversations: task(function* (data) {\n        this._holdOtherActiveConversations(data);\n        yield timeout(1000);\n    }).drop(),\n\n    // Handles errors by logging and notifying the user, but re-throws the error for consumers\n    // to handle if they want to\n    _makeCall(phoneNumber, callingPerson, onbehalfOfQueue, externalContactId) {\n        if (callingPerson && !_.isEmpty(callingPerson)) {\n            this.set('attemptingToCall', callingPerson);\n        } else {\n            this.set('attemptingToCall', phoneNumber);\n        }\n\n        let url;\n        let data = {};\n        let key = 'phoneNumber';\n        if (phoneNumber && phoneNumber.get && phoneNumber.get('type') === 'person') {\n            key = 'callUserId';\n        }\n        if (phoneNumber && phoneNumber.get && phoneNumber.get('type') === 'queue') {\n            key = 'callQueueId';\n        }\n        // if phoneNumber is a string, we can safely skip the formatting\n        // otherwise, the format method is required here to return an id\n        // or number from the model (phoneNumber).\n        if (typeof phoneNumber !== 'string') {\n            phoneNumber = this.get('addressformat').format(phoneNumber);\n        } else if (_.startsWith(phoneNumber, 'sip:')) {\n            phoneNumber = this.get('addressformat').formatSipAddress(phoneNumber);\n        }\n        data[key] = phoneNumber;\n        if (externalContactId) {\n            data.externalContactId = externalContactId;\n        }\n        url = this.pcUri(`api/v2/conversations/calls`);\n        if (onbehalfOfQueue && onbehalfOfQueue.id) {\n            data.callFromQueueId = onbehalfOfQueue.id;\n        }\n        if (phoneNumber === undefined || phoneNumber === null) {\n            let message = this.get('intl').lookup('notification.purecloud.unableToMakeCall');\n            const error = Error('Failed to make call: PhoneNumber is not defined');\n\n            this.logger.error(error.message, error);\n            this.showErrorNotification({ message }, error);\n            return Ember.RSVP.Promise.reject(error);\n        }\n\n        let promise;\n\n        // if this is a webrtc call, place it through the sdk\n        if (this.get('webrtcSdkService.useSdk') && this.get('station.isWebrtc')) {\n            promise = this.get('webrtcSdkService').startSoftphoneSession(data);\n        } else {\n            const options = { data: data, contentType: 'application/json' };\n            promise = this.makeRequest(url, options, 'post');\n        }\n\n        return promise\n            .then(data => {\n                this.get('conversationsMadeByClient').pushObject(data);\n                data.attemptingToCall = this.get('attemptingToCall');\n                const conversation = this.updateActiveConversationEntry(data);\n\n                if (!this.get('webrtcSdkService.useSdk')) {\n                    this.get('headset').outgoingCall({ conversationId: data.id });\n                }\n\n                if (onbehalfOfQueue && data && data.id) {\n                    this.trigger(CALL_CONVERSATION_CREATED_EVENT, { conversationId: data.id });\n                }\n\n                if (this.get('station.isWebrtc')) {\n                    // TODO: shouldnt this be automatic with we place a call?\n                    this.get('_throttledHoldOtherConversations').perform(data);\n                }\n\n                return conversation || { id: data.id };\n            })\n            .catch(err => {\n                let responseJSON;\n                if (err.responseJSON) {\n                    responseJSON = err.responseJSON;\n                } else if (err.jqXHR && err.jqXHR.responseJSON) {\n                    responseJSON = err.jqXHR.responseJSON;\n                }\n\n                this.logger.error('Error making request to place call', { data, url, err });\n                this.showErrorNotification(responseJSON, err);\n                return Ember.RSVP.Promise.reject(err);\n            });\n    },\n\n    // helper service method to validate and make a call, handling errors by notifying the user.\n    // Returns a promise that does not reject. All errors are handled and notified to user\n    // To consume the error from validation or placing call, call _validateCall and _makeCall directly\n    makeCall(/*phoneNumber, callingPerson, onbehalfOfQueue*/) {\n        const callArgs = arguments;\n        return this._validateCall(...callArgs).then(() => {\n            return this._makeCall(...callArgs);\n        });\n    },\n\n    /**\n       @desc Starts a call with the user with the given ID.\n       @param {string} id\n       @returns {Promise}\n    */\n    async callPersonById(id) {\n        if (!this.get('phoneAvailable')) {\n            return;\n        }\n\n        const person = await this.get('store').findRecord('person', id);\n        return this.makeCall(person);\n    },\n\n    mergeCalls(conversations) {\n        const conferences = _.filter(conversations, function (conversation) {\n            return conversation.get('onConference');\n        });\n        const data = {\n            conversationIds: []\n        };\n        const recordings = _.filter(conversations, function (conversation) {\n            return conversation.get('isRecording');\n        });\n        let callsToMerge, callToMergeInto;\n        if (conferences.length > 1) {\n            Ember.Logger.warn('phone service: You cannot merge two conferences');\n            return;\n        } else if (conferences.length === 1) {\n            callToMergeInto = _.head(conferences);\n            callsToMerge = _.reject(conversations, function (conversation) {\n                return conversation.get('onConference');\n            });\n            if (recordings.length && callToMergeInto.get('isRecording') !== true) {\n                this.set('shouldPromptForMerge', true);\n                Ember.Logger.warn('Your recording will end when merging a recording call into a conference call');\n            }\n        } else if (recordings.length > 0) {\n            callToMergeInto = _.head(recordings);\n            callsToMerge = _.reject(conversations, function (conversation) {\n                return conversation === callToMergeInto;\n            });\n        } else {\n            callToMergeInto =\n                conversations.findBy('id', this.get('activeCall.id')) || conversations.findBy('isIncoming', false);\n            callsToMerge = _.reject(conversations, function (conversation) {\n                return conversation === callToMergeInto;\n            });\n        }\n        _.each(callsToMerge, function (conversation) {\n            return data.conversationIds.push(conversation.id);\n        });\n        this.set('mergeData', data);\n        this.set('callToMergeInto', callToMergeInto);\n        if (this.get('shouldPromptForMerge') === false) {\n            return this.makeMergeRequest();\n        }\n    },\n\n    toVoicemail(conversation) {\n        Ember.deprecate('Please use \"service:phone/sendToVoicemail\" for sending a call to voicemail', false, {\n            id: 'directory-core.deprecate-old-phone-service-methods',\n            until: '8.0.0',\n            url: 'https://bitbucket.org/inindca/connections-ui/src/develop/DEPRECATIONS.md#markdown-header-old-phone-service-methods'\n        });\n        this.sendToVoicemail(conversation);\n    },\n\n    _throttledHandlePhoneStatusChange: task(function* () {\n        this.handlePhoneStatusChange(...arguments);\n        yield timeout(1000);\n    }).drop(),\n\n    sendToVoicemail(conversation) {\n        if (conversation) {\n            this.get('_throttledHandlePhoneStatusChange').perform('sendToVoicemail', conversation);\n            !this.get('webrtcSdkService.useSdk') &&\n                this.get('headset').endCall(conversation.get('id'), this.get('connectedConversations.length') > 1);\n        }\n    },\n\n    makeMergeRequest() {\n        const callId = this.get('callToMergeInto.id');\n        const uri = this.communicationUri(callId, 'calls');\n        const data = this.get('mergeData');\n        return this.makeRequest(uri, { data }, 'patch').finally(() => {\n            return this.clearMergeData();\n        });\n    },\n\n    clearMergeData() {\n        this.set('mergeData', null);\n        this.set('callToMergeInto', null);\n        return this.set('shouldPromptForMerge', false);\n    },\n\n    makeConferenceCall(parties, queue) {\n        const uri = this.pcUri(`api/${this.get('convAPIVersion')}/conversations/calls`);\n        const participants = _.map(parties, function (party) {\n            if (party.entity && party.entity.get) {\n                if (party.entity.get('type') === 'person') {\n                    return { userId: party.entity.get('guid') };\n                }\n                if (party.entity.get('type') === 'queue') {\n                    return { queueId: party.entity.get('id') };\n                }\n            }\n            return { address: party.value };\n        });\n        const options = { data: { participants } };\n        if (queue && queue.id) {\n            options.data.callFromQueueId = queue.id;\n        }\n\n        return this.makeRequest(uri, options, 'post')\n            .then(json => {\n                this.get('conversationsMadeByClient').pushObject(json);\n            })\n            .catch(err => {\n                Ember.Logger.error('Error making conference call number', { uri, error: err });\n                let responseJSON;\n                if (err.responseJSON) {\n                    responseJSON = err.responseJSON;\n                } else if (err.jqXHR && err.jqXHR.responseJSON) {\n                    responseJSON = err.jqXHR.responseJSON;\n                }\n                return this.showErrorNotification(responseJSON, err);\n            });\n    },\n\n    bulkAddParticipants(parties) {\n        const callId = this.get('activeCall').id;\n        const uri = `${this.communicationUri(callId, 'calls')}/participants`;\n        const participants = _.map(parties, function (party) {\n            if (party.entity && party.entity.get) {\n                if (party.entity.get('type') === 'person') {\n                    return { userId: party.entity.get('guid') };\n                }\n                if (party.entity.get('type') === 'queue') {\n                    return { address: party.entity.get('id') };\n                }\n            }\n            return { address: party.value };\n        });\n        const options = { data: { participants } };\n        return this.makeRequest(uri, options, 'post');\n    },\n\n    blindTransfer(participant) {\n        const isNumber = typeof participant.value === 'string';\n        const myselfId = this.get('myself.id');\n        const callId = this.get('activeCall.id');\n        const participantEntity = Ember.get(participant, 'entity');\n        const url = this.replaceUri(callId, myselfId, null, 'calls');\n        const isQueue = participant ? Ember.get(participant, 'entity.type') === 'queue' : false;\n        let data = {};\n\n        if (isNumber) {\n            data.address = participant.value;\n        } else if (isQueue) {\n            data.queueId = participant.id;\n        } else {\n            const personGuid = Ember.get(participantEntity, 'guid');\n            data.userId = personGuid;\n        }\n\n        const options = { data };\n\n        return this.makeRequest(url, options, 'post').then(() => {\n            this._handleCallTransferred();\n        });\n    },\n\n    _handleCallTransferred(interaction) {\n        // if the call gets routed back to the client later, we don't want it to appear already answered or placed by the client\n        const conversationId = interaction ? Ember.get(interaction, 'id') : this.get('activeCall.id');\n        const conversation = this.get('conversations').findBy('id', conversationId);\n        if (conversation) {\n            Ember.set(conversation, 'acceptedByClient', false);\n            Ember.set(conversation, 'shouldAutoProceedWebrtc', false);\n        }\n        if (interaction) {\n            Ember.set(interaction, 'acceptedByClient', false);\n            Ember.set(interaction, 'shouldAutoProceedWebrtc', false);\n        }\n        const conversationsMadeByClient = this.get('conversationsMadeByClient');\n        const placedConversation = conversationsMadeByClient.findBy('id', conversationId);\n        if (placedConversation) {\n            conversationsMadeByClient.removeObject(placedConversation);\n        }\n    },\n\n    consultTransfer(destination) {\n        const activeCall = this.get('activeCall');\n        const isNumber = typeof destination.value === 'string';\n        const person = destination.entity;\n        const isQueue = destination ? Ember.get(destination, 'entity.type') === 'queue' : false;\n        const currentCallId = Ember.get(activeCall, 'id');\n        const otherPartyId = Ember.get(activeCall, 'otherParty.id');\n        let url = this.consultUri(currentCallId, otherPartyId, 'calls');\n        if (!isNumber && !isQueue) {\n            return this.get('store')\n                .find('person', Ember.get(person, 'guid'))\n                .then(party => {\n                    return this.initiateTransfer(party, url);\n                });\n        } else if (isQueue) {\n            return this.initiateTransfer(destination, url);\n        }\n        return this.initiateTransfer(destination.value, url);\n    },\n\n    initiateTransfer(destination, url) {\n        const isQueue = destination ? Ember.get(destination, 'entity.type') === 'queue' : false;\n        let addressee = {};\n        if (isQueue) {\n            addressee = { queueId: destination.id };\n        } else if (typeof destination !== 'string' && _.isEmpty(destination.phoneNumber)) {\n            addressee = { userId: destination.get('guid') };\n        } else if (typeof destination === 'string') {\n            addressee = { address: destination };\n        }\n        const options = { data: { destination: addressee } };\n        return this.makeRequest(url, options, 'post');\n    },\n\n    changeSpeakerForConsult(speakTo) {\n        const callId = this.get('activeCall.id');\n        const otherParty = this.get('activeCall.otherParties').find(function (party) {\n            return party.consultParticipantId != null;\n        });\n        const otherPartyId = Ember.get(otherParty, 'consultParticipantId');\n        const url = this.consultUri(callId, otherPartyId, 'calls');\n        const options = { data: { speakTo } };\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    endConsult() {\n        const currentCallId = this.get('activeCall.id');\n        const otherPartyId = this.get('activeCall.myself.consultParticipantId');\n        const url = this.generateConversationsUrl(currentCallId, otherPartyId, 'consult');\n        const options = { dataType: 'text' };\n        return this.makeRequest(url, options, 'DELETE');\n    },\n\n    dialDtmfNumber(currentCallId, participantId, number) {\n        Ember.assert(\n            'phone:dialDtmfNumber must take a conversation id as the first argument',\n            currentCallId !== undefined\n        );\n        Ember.assert(\n            'phone:dialDtmfNumber must take a participant id as the second argument',\n            participantId !== undefined\n        );\n\n        let uri = this.pcUri(\n            `api/${this.get('convAPIVersion')}/conversations/${currentCallId}/participants/${participantId}/digits`\n        );\n        this.logger.info('sendingDtmfTones', {\n            conversationId: currentCallId,\n            participantId,\n            number\n        });\n\n        this.get('ajax').post(uri, { data: { digits: number } });\n    },\n\n    _throttledAnswerWebrtc: task(function* (conversation) {\n        this._answerWebrtc(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    _throttledAnswer: task(function* (conversation) {\n        this._answer(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    _throttledAnswerSoftphoneConversation: task(function* (conversationId) {\n        if (this.get('webrtcSdkService.useSdk')) {\n            this.get('webrtcSdkService').acceptPendingSession({ conversationId });\n        } else {\n            this.get('webrtc').answerSoftphoneConversation(conversationId);\n        }\n        yield timeout(1000);\n    }).drop(),\n\n    answer() {},\n\n    _answerWebrtc(conversation) {\n        const conversationId = conversation.get('id');\n        const session = this._findPendingSessionsByConversationId(conversationId);\n        if (session === undefined) {\n            if (this.get('stationHasPersistentConnection')) {\n                // This is a flag we can look at in case we end up getting proposes for this conversation *later*\n                Ember.set(conversation, 'shouldAutoProceedWebrtc', true);\n\n                this.logger.info('_answerWebrtc stationHasPersistentConnection', { conversationId });\n                const task = this.get('_throttledAnswer').perform(conversation);\n                return task;\n            }\n\n            this.logger.info('Conversation is waiting for session', { conversationId });\n            conversation.set('waitingForSession', true); // when the session comes in, this should auto accept.\n            return;\n        }\n\n        return this.get('_throttledAnswerSoftphoneConversation').perform(conversationId);\n    },\n\n    _answer(conversation) {\n        const conversationId = conversation.get('id');\n        this.logger.log('handling _answer status change for conversation', { conversationId });\n        this.handlePhoneStatusChange('answer', conversation)\n            .then(() => {\n                return this.get('communication').validateActionSucceeded(conversation, 'callState.state', 'CONNECTED');\n            })\n            .then(() => {\n                if (this.get('onQueue')) {\n                    return this.checkForNonACD(conversation);\n                }\n            })\n            .catch(() => {\n                const message = 'Failed to answer call: ' + conversationId;\n                const title = this.get('intl').t('notification.titles.callError');\n                this.get('notification').error(title, message);\n            });\n    },\n\n    _throttledMute: task(function* (conversation) {\n        this._mute(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    mute(conversation) {\n        conversation = conversation || this.get('activeCall');\n        if (conversation) {\n            return this.get('_throttledMute').perform(conversation);\n        }\n    },\n\n    _mute(conversation) {\n        const isMuted = conversation.get('isMuted');\n        this.handlePhoneStatusChange('muted', conversation)\n            .then(() => {\n                // this.get('headset').setMute(!isMuted);\n                if (!this.get('webrtcSdkService.useSdk')) {\n                    this.get('headset').setMute(!isMuted);\n                }\n                return this.get('communication').validateActionSucceeded(conversation, 'isMuted', !isMuted);\n            })\n            .catch(err => {\n                this.logger.error(err);\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.mute');\n                return this.get('notification').error(title, message);\n            });\n    },\n\n    /**\n     * @param {object | undefined | null} conversation the conversation to hold, if not provided `activeCall` will be used\n     * @param {boolean} skipHoldAll `true` if we should skip holding all of the other calls`\n     */\n    hold(conversation, skipHoldAll = false) {\n        // bypasses throttling and other seemingly uneeded checks\n        if (this.get('session.useMultipanel')) {\n            conversation = conversation || this.get('activeCall');\n            if (!conversation) {\n                return Ember.RSVP.Promise.resolve();\n            } else if (skipHoldAll) {\n                return this._held(conversation);\n            }\n\n            // if the conversation is held now, it's being unheld\n            // so if we're using webrtc, and there are more than one active\n            // call, we should hold all other calls that aren't already held\n            const isHeld = conversation.get('isHeld');\n            if (isHeld && this.get('station.isWebrtc') && this.get('activeConversations.length') > 1) {\n                this._holdOtherActiveConversations(conversation);\n            }\n            return this._held(conversation);\n        }\n\n        // if the conversation is held now, it's being unheld\n        // so if we're using webrtc, and there are more than one active\n        // call, we should hold all other calls that aren't already held\n        const isHeld = conversation.get('isHeld');\n        if (isHeld && this.get('station.isWebrtc') && this.get('activeConversations.length') > 1) {\n            this._holdOtherActiveConversations(conversation);\n        }\n        this.held(conversation);\n        return Ember.RSVP.Promise.resolve();\n    },\n\n    _holdOtherActiveConversations(conversation) {\n        const conversationId = Ember.get(conversation, 'id');\n        const otherConversations = this.get('connectedConversations').filter(c => c.get('id') !== conversationId);\n        otherConversations.forEach(otherConversation => {\n            if (!otherConversation.get('isHeld')) {\n                this._held(otherConversation);\n            }\n        });\n    },\n\n    held(conversation) {\n        conversation = conversation || this.get('activeCall');\n        if (conversation) {\n            this.get('_throttledHeld').perform(conversation);\n        }\n    },\n\n    _throttledHeld: task(function* (conversation) {\n        this._held(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    _held(conversation) {\n        const isHeld = conversation.get('isHeld');\n        return this.handlePhoneStatusChange('held', conversation)\n            .then(() => {\n                if (!this.get('webrtcSdkService.useSdk')) {\n                    this.get('headset').setHold(conversation.get('id'), !isHeld);\n                }\n                return this.get('communication').validateActionSucceeded(conversation, 'isHeld', !isHeld);\n            })\n            .catch(err => {\n                this.logger.error(err);\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.hold');\n                this.get('notification').error(title, message);\n            });\n    },\n\n    record(conversation) {\n        conversation = conversation || this.get('activeCall');\n        if (conversation) {\n            this.get('_throttledRecord').perform(conversation);\n        }\n    },\n\n    _throttledRecord: task(function* (conversation) {\n        this._record(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    _record(conversation) {\n        const isRecording = conversation.get('isRecording');\n        this.handlePhoneStatusChange('recording', conversation)\n            .then(() => {\n                return this.get('communication').validateActionSucceeded(conversation, 'isRecording', !isRecording);\n            })\n            .catch(() => {\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.record');\n                this.get('notification').error(title, message);\n            });\n    },\n\n    flagActiveInteraction(action, conversation) {\n        const call = conversation || this.get('activeCall');\n        const participant = call.get('myself');\n        if (!participant) {\n            this.logger.info('No \"myself\" participant on the call when handling flag change', {\n                conversationId: Ember.get(call, 'id')\n            });\n            return Promise.reject(new Error('Self participant missing'));\n        }\n\n        const isFlagged = !!conversation.get('myself.flaggedReason');\n        this.logger.debug('isFlagged:', isFlagged);\n\n        return this._makeFlagChange(conversation, participant, action)\n            .then(() => {\n                return this.get('communication').validateActionSucceeded(conversation, 'myself.flaggedReason', [\n                    isFlagged ? undefined : 'general'\n                ]);\n            })\n            .catch(err => {\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.flag');\n                this.get('notification').error(title, message);\n                this.logger.warn('Failed to validate interaction flagging', {\n                    conversationId: Ember.get(conversation, 'id'),\n                    err\n                });\n            });\n    },\n\n    flagCallHistoryInteraction(action, conversation, participants) {\n        return Ember.RSVP.all(\n            participants.map(participant => {\n                return this._makeFlagChange(conversation, participant, action);\n            })\n        ).catch(err => {\n            const title = this.get('intl').t('notification.titles.callError');\n            const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.flag');\n            this.get('notification').error(title, message);\n            this.logger.warn('Failed to validate history interaction flagging', {\n                conversationId: Ember.get(conversation, 'id'),\n                err\n            });\n        });\n    },\n\n    _makeFlagChange(call, participant, action) {\n        let url = this.pcUri(`api/v2/conversations/${call.id}/participants/${participant.id}/flaggedreason`);\n\n        let type;\n        if (action === 'flag') {\n            type = 'PUT';\n        } else if (action === 'unflag') {\n            type = 'DELETE';\n        } else {\n            return Promise.reject(new Error('Unwanted action for changing flag'));\n        }\n\n        return this.makeRequest(url, {}, type).then(() => {\n            if (action === 'flag') {\n                Ember.set(participant, 'flaggedReason', 'general');\n            } else {\n                Ember.set(participant, 'flaggedReason', undefined);\n            }\n        });\n    },\n\n    endCall(conversation = this.get('activeCall')) {\n        if (conversation) {\n            return this.get('_throttledEndCall').perform(conversation);\n        }\n    },\n\n    /**\n     * Ends the conversation call for ALL participants included.\n     * @param {object} conversation The conversation to end\n     */\n    endCallForAll(conversation = this.get('activeCall')) {\n        if (conversation) {\n            return this.get('_throttledEndCallForAll').perform(conversation);\n        }\n    },\n\n    endCallById(conversationId) {\n        const conversation = this.get('conversations').findBy('id', conversationId);\n        if (conversation) {\n            return this.get('_throttledEndCall').perform(conversation);\n        }\n    },\n\n    _throttledEndCall: task(function* (conversation) {\n        this._endCall(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    _throttledEndCallForAll: task(function* (conversation) {\n        this._endCallForAll(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    async _endCall(conversation) {\n        return this.handlePhoneStatusChange('hangup', conversation)\n            .then(() => {\n                const conversationWithError = this.get('userCallSessionsWithErrors').findBy(\n                    'id',\n                    conversation.get('id')\n                );\n\n                const isDisconnected = Ember.get(conversation, 'isDisconnected');\n\n                // if the call is disconnected or has an error, remove it now.\n                if (!conversation.get('isAgentCall') && (isDisconnected || conversationWithError)) {\n                    run.next(this, this.removeConversationFromConversations, [conversation]);\n                } else if (conversation.get('isAgentCall') && isDisconnected && conversationWithError) {\n                    this.trigger('agentEndedCallWithError', conversation.get('id'));\n                }\n\n                if (this.get('webrtcSdkService.useSdk') && this.get('station.isWebrtc')) {\n                    this._endWebrtcCall(Ember.get(conversation, 'id'));\n                }\n\n                return this.get('communication').validateActionSucceeded(conversation, 'isDisconnected', true);\n            })\n            .catch(err => {\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.hangup');\n                this.get('notification').error(title, message);\n                this.logger.error(message, err);\n            });\n    },\n\n    async _endCallForAll(conversation) {\n        return this.handlePhoneStatusChange('end', conversation)\n            .then(() => {\n                const conversationWithError = this.get('userCallSessionsWithErrors').findBy(\n                    'id',\n                    conversation.get('id')\n                );\n\n                const isDisconnected = Ember.get(conversation, 'isDisconnected');\n\n                // if the call is disconnected or has an error, remove it now.\n                if (!conversation.get('isAgentCall') && (isDisconnected || conversationWithError)) {\n                    run.next(this, this.removeConversationFromConversations, [conversation]);\n                } else if (conversation.get('isAgentCall') && isDisconnected && conversationWithError) {\n                    this.trigger('agentEndedCallWithError', conversation.get('id'));\n                }\n\n                if (this.get('webrtcSdkService.useSdk') && this.get('station.isWebrtc')) {\n                    this._endWebrtcCall(Ember.get(conversation, 'id'));\n                }\n\n                return this.get('communication').validateActionSucceeded(conversation, 'isDisconnected', true);\n            })\n            .catch(err => {\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.hangup');\n                this.get('notification').error(title, message);\n                this.logger.error(message, err);\n            });\n    },\n\n    /**\n     * All webrtc softphone calls are ended through here.\n     */\n    _endWebrtcCall(conversationId) {\n        if (this.get('stationHasPersistentConnection')) {\n            return;\n        }\n        if (this.get('station.isWebrtc') && conversationId) {\n            const data = {\n                conversationId,\n                conversationType: webrtcConversationTypes.SOFTPHONE,\n                // PCM-517 - this fallback disconnect was disconnecting conversations that\n                // got routed back to an agent after transfering to a queue, and were new, not old\n                pending: false, // don't end any new pending conversations\n                notAfter: new Date() // don't end any conversations created after now\n            };\n            // PCM-340 - pass false to throttle to run on tail end of the interval. This gives the API request to hangup\n            // one second to finish, before we explicitly tear down the connection. If the edge takes longer than\n            // one second to hangup, then we'll tear it down and the edge will detect an error, but that's expected\n            this.get('_throttledEndWebrtcCall').perform(data);\n        }\n    },\n\n    _throttledEndWebrtcCall: task(function* (data) {\n        yield timeout(1000);\n        this.get('webrtc').endConversation(data);\n    }).drop(),\n\n    handlePhoneStatusChange(action, conversation) {\n        return new Promise((resolve, reject) => {\n            const call = conversation || this.get('activeCall');\n            const participant = call.get('myself');\n            if (!participant) {\n                this.logger.info('No \"myself\" participant on the call when handling status change', {\n                    conversationId: Ember.get(call, 'id')\n                });\n                return reject(new Error('Self participant missing'));\n            }\n            let type = 'patch';\n            let url = this.pcUri(`api/v2/conversations/calls/${call.id}/participants/${participant.id}`);\n            let data, toggle;\n\n            // Used to end the entirety of the conversation. Implemented for `endForAll` in conferencing.\n            if (action === 'end') {\n                data = {\n                    state: 'DISCONNECTED'\n                };\n                url = this.generateConversationUrl(call.get('id'));\n            } else if (action === 'hangup') {\n                data = {\n                    state: 'DISCONNECTED'\n                };\n\n                const conversationWithError = this.get('userCallSessionsWithErrors').findBy(\n                    'id',\n                    conversation.get('id')\n                );\n                const callbackConnected = _.get(participant, 'callbacks[0].state', '').toLowerCase() === 'connected';\n                const callConnected = _.get(participant, 'calls[0].state', '').toLowerCase() === 'connected';\n\n                if (\n                    (callConnected && callbackConnected) ||\n                    (!callConnected && callbackConnected && conversationWithError)\n                ) {\n                    type = 'patch';\n                    const communicationId = _.get(participant, 'calls[0].id');\n                    url = this.generateCommunicationUrl(call.get('id'), participant.id, communicationId);\n                }\n            } else if (action === 'answer') {\n                data = {\n                    state: 'CONNECTED'\n                };\n            } else if (action === 'sendToVoicemail') {\n                type = 'post';\n                const query = {\n                    voicemail: true\n                };\n                url = this.replaceUri(call.get('id'), participant.id, null, 'calls');\n                data = query;\n            } else if (action === 'held') {\n                if (!Ember.get(conversation, 'isConnected')) {\n                    this.logger.debug(\n                        `Attempted to set hold state for non-connected conversation: ${conversation.get('id')}`\n                    );\n                    return Promise.resolve();\n                }\n\n                toggle = _.head(participant.calls)[action];\n                data = {};\n                data[action] = !toggle;\n            } else {\n                toggle = _.head(participant.calls)[action];\n                data = {};\n                data[action] = !toggle;\n            }\n\n            this.set('loading.' + action, true);\n            this.set('currentStatusChange', action);\n\n            if (!_.includes(['put', 'post', 'patch'], type)) {\n                reject();\n            }\n\n            this.makeRequest(url, { data }, type)\n                .then(response => {\n                    resolve(response);\n                })\n                .catch(({ jqXHR }) => {\n                    reject(jqXHR);\n\n                    if (jqXHR.status !== 202) {\n                        this.set(`loading.${action}`, false);\n                    }\n\n                    if (jqXHR.status === 403) {\n                        const response = JSON.parse(jqXHR.responseText);\n                        if (response.code.toLowerCase() === 'record_participant_forbidden') {\n                            const title = this.get('intl').t('notification.titles.callError');\n                            const message = this.get('intl').t('notification.purecloud.lackRecordingPermission');\n                            return this.get('notification').error(title, message);\n                        }\n                    }\n                })\n                .finally(() => {\n                    return this.set('loading.' + action, false);\n                });\n        });\n    },\n\n    handleOtherParticipantStatusChange(action, participant) {\n        const call = this.get('activeCall');\n        const url = this.generateConversationsUrl(call.get('id'), participant.id);\n        let method = 'patch';\n        let data = {};\n\n        if (action === 'hangup') {\n            data.state = 'disconnected';\n        } else {\n            const toggle = _.head(participant.calls)[action];\n            data[action] = !toggle;\n        }\n\n        const options = { method, data: JSON.stringify(data) };\n        return this.makeRequest(url, options, 'raw')\n            .then(data => {\n                return Ember.Logger.debug('Other Status Change: ' + action, data);\n            })\n            .catch(({ jqXHR }) => {\n                if (jqXHR.status !== 202) {\n                    this.set('loading.' + action, false);\n                }\n\n                if (jqXHR.status === 403) {\n                    const response = JSON.parse(jqXHR.responseText);\n                    if (response.code.toLowerCase() === 'record_participant_forbidden') {\n                        const title = this.get('intl').t('notification.titles.callError');\n                        const message = this.get('intl').t('notification.purecloud.lackRecordingPermission');\n                        return this.get('notification').error(title, message);\n                    }\n                }\n            });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default Ember.Mixin.create({\n    callForwardingActive: false,\n    callForwardingNumber: null,\n    callForwardingExtension: null,\n\n    fetchCallForwarding() {\n        if (this.get('canCallForward')) {\n            this.getCallForwarding()\n                .then(response => {\n                    return this._updateCallForwarding(response);\n                })\n                .catch(() => {\n                    this.set('callForwardingActive', false);\n                });\n        }\n    },\n\n    getCallForwarding() {\n        const url = this.get('application').pcV2Uri('api/v2/users/' + this.get('personGuid') + '/callForwarding');\n        return this.get('ajax').ajaxGet(url);\n    },\n\n    _updateCallForwarding(response) {\n        const enabled = _.isEmpty(response) ? false : response.enabled;\n        this.set('callForwardingActive', enabled);\n        const phoneNumber = response.phoneNumber;\n        const hasPhoneNumber = !_.isEmpty(phoneNumber);\n        if (hasPhoneNumber) {\n            if (_.startsWith(phoneNumber, ';ext=')) {\n                const re = /^;ext=(\\d{1,})$/;\n                const number = _.last(re.exec(phoneNumber));\n                this.set('callForwardingExtension', number);\n                return this.set('callForwardingNumber', null);\n            } else {\n                this.set('callForwardingNumber', phoneNumber);\n                return this.set('callForwardingExtension', null);\n            }\n        }\n    }\n});\n","import Ember from 'ember';\nimport { task, timeout } from 'ember-concurrency';\nimport moment from 'ember-purecloud-components/utils/dates';\nimport webrtcConversationTypes from 'ember-webrtc-components/utils/webrtc-conversation-types';\nimport ConversationModel from 'connections-ui/models/conversation-legacy';\nimport ERROR_WHITE_LIST from 'connections-ui/utils/error-white-list';\nimport { isTesting } from 'connections-ui/utils/testing';\n\nconst { computed, inject, observer, run } = Ember;\n\nexport default Ember.Mixin.create({\n    externalContacts: inject.service(),\n\n    _contactObservers: null,\n\n    // holds all of the conversations\n    conversations: [],\n    conversationsMadeByClient: [],\n    activeConversations: computed.reads('conversations'),\n    onMultipleCalls: computed.gt('activeConversations.length', 1),\n\n    init() {\n        this._super(...arguments);\n        this.set('_contactObservers', {});\n    },\n\n    // TODO: unbind conversations and webrtc sessions\n    // This is only used in two places anyways. Might be able to remove.\n    activeAcdCalls: computed(\n        'activeConversations.[]',\n        'webrtc.pendingSessions.[]',\n        'webrtcSdkService.pendingSessions.[]',\n        'webrtc.conversationsWithConversationId.[]',\n        'station.isWebrtc',\n        function () {\n            return this.get('activeConversations').filter(conv => {\n                if (!this.get('station.isWebrtc')) {\n                    return conv.get('isAgentCall');\n                }\n                const callState = Ember.get(conv, 'callState.state');\n                const webrtcConversation = this.get('webrtc').getConversation({\n                    conversationId: conv.id,\n                    conversationType: webrtcConversationTypes.SOFTPHONE\n                });\n                const session = this._findPendingSessionsByConversationId(conv.id);\n                if (!callState || !webrtcConversation || !session) {\n                    return false;\n                }\n                const callIsAlreadyConnnected = ['connected', 'disconnected'].indexOf(callState.toLowerCase()) > -1;\n                const hasPendingSession = session ? Ember.get(session, 'id') || Ember.get(session, 'sid') : false; // seems redundant when checking for session above\n                const webrtcSessions = Ember.get(webrtcConversation, 'sessions');\n                const atLeastOneWebrtcConversation = this.isDefinedAndLengthGreaterThan(webrtcSessions, 0); // atLeastOneWebrtcConversation would be better here.\n                return (\n                    (callIsAlreadyConnnected || hasPendingSession || atLeastOneWebrtcConversation) &&\n                    conv.get('isAgentCall')\n                );\n            });\n        }\n    ),\n\n    // activeNonAcdCalls feeds all the components based on whether or not station is webrtc or not.\n    activeNonAcdCalls: computed('activeConversations.@each.connectedToStationAndNotConference', function () {\n        return this.get('activeConversations').filter(conv => {\n            // connecting to an auto conference, do not display.\n            if (conv.get('connectedToStationAndNotConference') && !conv.get('isGroupRing')) {\n                return false;\n            }\n            return !conv.get('isAgentCall');\n        });\n    }),\n\n    // conversations that are not 'disconnected' and not 'terminated'\n    connectedConversations: computed('conversations.@each.onCall', function () {\n        const conversations = this.get('conversations');\n        return conversations.filter(function (conversation) {\n            return conversation.get('onCall');\n        });\n    }),\n\n    /**\n     * Consumed by webrtc-conversation-manager behind toggle.\n     *\n     * Conversations for which the client should send the <proceed /> (i.e., webrtc.answerSoftphoneConversation())\n     * This would be conversations that the client initiated or conversations that were answered before the client received the <propose />\n     * or conversations that this browser was set to handle calls from with the thisBrowserIsTheOneToAnswerFrom toggle.\n     */\n    dialingOrContactingOrAlertingConversationsToProceed: computed(\n        'conversations.@each.waitingForSession',\n        'conversationsMadeByClient.@each.id',\n        'conversations.@each.isDialing',\n        'thisBrowserIsTheOneToAnswerFrom',\n        function () {\n            const conversations = this.get('conversations');\n            return conversations.filter(conversation => {\n                const thisClientMadeTheCall = this.get('conversationsMadeByClient').findBy('id', conversation.id);\n                const waitingForSession = conversation.get('waitingForSession');\n                // If we transfer a call we've placed and we're the target of the transfer, we do not want to auto answer/proceed.\n                if (!!conversation.recentTransfers) {\n                    this.get('conversationsMadeByClient').removeObject(conversation);\n                    return false;\n                }\n                if (thisClientMadeTheCall || waitingForSession) {\n                    return true;\n                }\n\n                const thisBrowserIsTheOneToAnswerFrom = this.get('thisBrowserIsTheOneToAnswerFrom');\n                const isDialing = conversation.get('isDialing');\n                const isOutbound = conversation.get('isOutbound');\n                return isOutbound && isDialing && thisBrowserIsTheOneToAnswerFrom;\n            });\n        }\n    ),\n\n    disconnectedConversations: computed('conversations.@each.onCall', function () {\n        return this.get('conversations').filter(conversation => {\n            const isDisconnected = this.isDisconnected(conversation);\n            if (conversation.get('isAgentCall')) {\n                return isDisconnected && conversation.get('isAfterCallWorkCompleted');\n            }\n            return isDisconnected;\n        });\n    }),\n\n    eligibleCallsToMerge: computed('activeConversations.@each.{isConnected,onConference}', 'activeCall', function () {\n        const onConference = this.get('activeCall.onConference');\n        return this.get('activeConversations').reject(conv => {\n            let thisCallIsConference = false;\n            if (!conv.get('isConnected')) {\n                return true;\n            }\n            if (conv.get('onConference')) {\n                thisCallIsConference = true;\n            }\n            return conv.id === this.get('activeCall.id') || (onConference && thisCallIsConference);\n        });\n    }),\n\n    _handleActiveConversationsUpdates: observer(\n        'activeConversations.[]',\n        'activeNonAcdCalls.[]',\n        'station.isWebrtc',\n        function () {\n            this.get('_throttledHandleActiveConversations').perform();\n        }\n    ),\n\n    _throttledHandleActiveConversations: task(function* (throttle = 500) {\n        yield timeout(throttle);\n        this.handleActiveConversationsUpdates();\n    }).drop(),\n\n    handleActiveConversationsUpdates() {\n        const hasActiveCall = this.get('activeCall');\n        const activeNonAcdCalls = this.get('activeNonAcdCalls');\n\n        // activeNonAcdCalls could contain calls that have ended\n        const connectedNonAcdCalls = activeNonAcdCalls.filterBy('onCall');\n\n        const connectedConversations = this.get('connectedConversations') || [];\n        const dialingOrIncomingConversation = connectedConversations.filter(function (conversation) {\n            return conversation.get('isDialing') || conversation.get('isIncoming');\n        });\n\n        let newActiveCall = undefined;\n\n        if (!hasActiveCall) {\n            // no active call\n            newActiveCall = (connectedNonAcdCalls && Ember.get(connectedNonAcdCalls, 'lastObject')) || null;\n        } else {\n            // active call might have finished\n            const activeCallOngoing = this.get('onCall');\n\n            if (!activeCallOngoing) {\n                const activeCallErrors = this.get('activeCall.errorInfoMessage');\n\n                if (activeCallErrors) {\n                    // something went wrong with the call\n                    this.set('lastConversationError', {\n                        id: this.get('activeCall.id'),\n                        errorInfo: this.get('activeCall.errorInfo')\n                    });\n                    Ember.Logger.warn('lastConversationError: ', this.get('lastConversationError'));\n                } else {\n                    // call finished successfully - move to the next one\n                    newActiveCall = (connectedNonAcdCalls && Ember.get(connectedNonAcdCalls, 'lastObject')) || null;\n                }\n\n                // prioritize new dialed or incoming calls\n                if (dialingOrIncomingConversation && dialingOrIncomingConversation.length) {\n                    newActiveCall = Ember.get(dialingOrIncomingConversation, 'lastObject') || null;\n                }\n            } else {\n                const dialingOutboundConversations = connectedConversations.filter(function (conversation) {\n                    return conversation.get('isDialing') && !conversation.get('isIncoming');\n                });\n                const hasOutboundConversation = dialingOutboundConversations && dialingOutboundConversations.length;\n\n                if (hasOutboundConversation) {\n                    newActiveCall = Ember.get(dialingOrIncomingConversation, 'lastObject') || null;\n                }\n            }\n        }\n\n        // set the next active call appropriately\n        if (newActiveCall) {\n            this.set('activeCall', newActiveCall);\n        }\n    },\n\n    hasIncomingConversations: false,\n    _setHasIncomingConversations: observer('incomingConversations.[]', function () {\n        return run.once(this, this.set, 'hasIncomingConversations', this.get('incomingConversations.length') > 0);\n    }),\n\n    hasActiveNonAcdCalls: computed('incomingNonAcdConversations.[]', 'activeNonAcdCalls.[]', function () {\n        return this.get('incomingNonAcdConversations.length') > 0 || this.get('activeNonAcdCalls.length') > 0;\n    }),\n\n    incomingConversations: computed(\n        'conversations.[]',\n        'station.isWebrtc',\n        'webrtc.pendingSessions.[]',\n        'webrtcSdkService.pendingSessions.[]',\n        'webrtc.conversationsWithConversationId.[]',\n        function () {\n            const conversations = this.get('conversations');\n            return conversations.filterBy('isIncoming');\n        }\n    ),\n\n    incomingNonAcdConversations: computed('incomingConversations.[]', function () {\n        const conversations = this.get('incomingConversations');\n        return conversations.rejectBy('isAgentCall');\n    }),\n\n    isOnConnectedCall: computed('activeConversations.@each.isConnected', function () {\n        return !!this.get('activeConversations').findBy('isConnected');\n    }),\n\n    mostRecentlyConnectedConferenceCalls() {\n        return this.get('activeConversations').filter(conversation => {\n            const isConferenceCall = Ember.get(conversation, 'onConference');\n            const isConnectedCall = Ember.get(conversation, 'onCall');\n            const myTime = moment(Ember.get(conversation, 'myself.connectedTime'));\n            const diff = moment().diff(myTime);\n            return isConferenceCall && isConnectedCall && diff < 3000;\n        });\n    },\n\n    // conversations that have the 'connected' state and are not agent calls.\n    onlyConnectedConversations: computed('conversations.@each.connected', function () {\n        return this.get('conversations').filter(conversation => {\n            return conversation.get('isConnected') && !conversation.get('isAgentCall');\n        });\n    }),\n\n    recentDisconnectedAgentCalls: computed('conversations.@each.connected', function () {\n        return this.get('conversations').reject(conversation => {\n            const isDisconnected = this.isDisconnected(conversation) && conversation.get('isAfterCallWorkCompleted');\n            const isAgentCall = conversation.get('isAgentCall');\n            return !isAgentCall || !isDisconnected;\n        });\n    }),\n\n    recentDisconnectedNonAcdCalls: computed('conversations.@each.onCall', function () {\n        return this.get('conversations').filter(conversation => {\n            const callState = Ember.get(conversation, 'callState');\n            const isDisconnected =\n                callState && callState.state\n                    ? ['disconnected', 'terminated'].indexOf(callState.state.toLowerCase()) > -1\n                    : false;\n            return isDisconnected && !conversation.get('isAgentCall');\n        });\n    }),\n\n    removeConversationFromConversations(calls) {\n        const conversations = this.get('conversations');\n        const conversationsMadeByClient = this.get('conversationsMadeByClient');\n        const userCallSessionsWithErrors = this.get('userCallSessionsWithErrors');\n        if (this.isDefinedAndLengthGreaterThan(conversations, 0)) {\n            calls.forEach(conversation => {\n                const conversationId = Ember.get(conversation, 'id');\n                if (!conversationId || !Ember.get(conversation, 'isDisconnected')) {\n                    return;\n                }\n\n                // weird case where a non acd call ends and gets transferred back immediately. conversation is no longer disconnected and shouldn't be removed\n                if (!conversation.get('isAgentCall') && !this._shouldRemoveNonAcdConversation(conversation)) {\n                    return;\n                }\n\n                const conversationMarker = conversationsMadeByClient.findBy('id', conversationId);\n                if (conversationMarker) {\n                    conversationsMadeByClient.removeObject(conversationMarker);\n                }\n                const conversationsToRemove = conversations.filterBy('id', conversationId);\n\n                if (conversation) {\n                    const callErrorToRemove = userCallSessionsWithErrors.filterBy('id', conversationId);\n                    userCallSessionsWithErrors.removeObjects(callErrorToRemove);\n\n                    if (conversation.id === this.get('activeCall.id')) {\n                        this.cleanupActiveCall();\n                    }\n\n                    const conversationModelTemp = ConversationModel.create(\n                        conversation.get('__interaction_metadata__'),\n                        Ember.getOwner(this).ownerInjection()\n                    );\n                    Ember.set(conversationModelTemp, 'type', 'call');\n\n                    const { id } = conversation;\n                    this.set(`_contactObservers.${id}`, undefined);\n\n                    conversation.destroy();\n                    conversationModelTemp.destroy();\n                }\n\n                conversations.removeObjects(conversationsToRemove);\n            });\n        }\n    },\n\n    _throttledRemoveDisconnectedConversations: task(function* (throttle = 500) {\n        yield timeout(throttle);\n        this._removeDisconnectedConversations();\n    }).drop(),\n\n    _shouldRemoveNonAcdConversation(conversation) {\n        const conversationHasErrors = this.get('userCallSessionsWithErrors').findBy('id', conversation.id);\n        const conversationMadeByClient = this.get('conversationsMadeByClient').findBy('id', conversation.id);\n        const conversationAcceptedOnClient = Ember.get(conversation, 'acceptedByClient');\n        const conversationWasMadeOrAcceptedOnClient = conversationAcceptedOnClient || conversationMadeByClient;\n\n        const participantsForUser = conversation.get('participants').filterBy('userId', this.get('personGuid'));\n        let participantOnUpdatedConversation;\n\n        if (participantsForUser.length) {\n            participantOnUpdatedConversation = participantsForUser[participantsForUser.length - 1];\n        }\n        const updatedParticipantCall = this.getParticipantCall(participantOnUpdatedConversation);\n\n        let conversationWasTerminatedNotDisconnected = false;\n        if (updatedParticipantCall) {\n            conversationWasTerminatedNotDisconnected = updatedParticipantCall.state === 'terminated';\n\n            if (updatedParticipantCall.state === 'alerting') {\n                return false;\n            }\n        }\n\n        if (\n            !conversationWasMadeOrAcceptedOnClient ||\n            conversationWasTerminatedNotDisconnected ||\n            (conversationWasMadeOrAcceptedOnClient && !conversationHasErrors)\n        ) {\n            return true;\n        }\n        if (conversationHasErrors) {\n            return false;\n        }\n    },\n\n    _removeDisconnectedConversations() {\n        if (this.get('recentDisconnectedAgentCalls.length')) {\n            const disconnectedCalls = this.get('recentDisconnectedAgentCalls');\n            return run.next(this, this.removeConversationFromConversations, disconnectedCalls);\n        }\n        if (this.get('recentDisconnectedNonAcdCalls.length')) {\n            // remove conversations normally that were not made or accepted on this client\n            // remove conversations normally that do not have errors\n            const conversationsToRemove = this.get('recentDisconnectedNonAcdCalls').filter(conversation => {\n                return this._shouldRemoveNonAcdConversation(conversation);\n            });\n            let timeOutToRemove = this.get('timeOutToRemove');\n            if (!isTesting) {\n                const stationIsWebrtc = this.get('station.isWebrtc');\n                const thereArePendingSessions = this.get('webrtc.pendingSessions.length') > 0;\n                if (\n                    stationIsWebrtc &&\n                    thereArePendingSessions &&\n                    this.get('activeCall.connectedToStationAndNotConference')\n                ) {\n                    timeOutToRemove = 1;\n                }\n            }\n            if (conversationsToRemove.length) {\n                this.get('_debouncedRemoveConversationFromConversations').perform(\n                    conversationsToRemove,\n                    timeOutToRemove\n                );\n            }\n        }\n    },\n\n    _debouncedRemoveConversationFromConversations: task(function* (conversationsToRemove, debounceTime) {\n        yield timeout(debounceTime);\n        this.removeConversationFromConversations(conversationsToRemove);\n    }),\n\n    thereIsAConnectedConversation: computed.gte('onlyConnectedConversations.length', 1),\n\n    updateConversationArray(conversation, conversationDetails, isAgentCall) {\n        const conversationExists = conversationDetails != null ? true : false;\n        if (conversationExists) {\n            conversationDetails.setProperties(conversation);\n        } else {\n            conversationDetails = ConversationModel.create(conversation, Ember.getOwner(this).ownerInjection());\n\n            //Verify if we should process this update if agentCall\n            let isUpdateValid = true;\n            if (isAgentCall) {\n                Ember.set(conversationDetails, 'type', 'call');\n            }\n            if (isUpdateValid) {\n                this.get('conversations').pushObject(conversationDetails);\n            } else {\n                conversationDetails.destroy();\n            }\n        }\n        if (conversationDetails) {\n            this.trigger(`conversations.${conversationDetails.get('id')}`);\n            return conversationDetails;\n        } else {\n            return null;\n        }\n    },\n\n    monitoredConversationsForErrors: computed('conversations.@each.participants', function () {\n        const nonAcdCalls = this.get('conversations').reject(conversation => {\n            return Ember.get(conversation, 'participants').any(party =>\n                party && party.purpose ? party.purpose === 'agent' || party.purpose === 'acd' : false\n            );\n        });\n        return Ember.A([].concat(nonAcdCalls || []));\n    }),\n\n    // returns an array of conversation objects for the current user:\n    // { id: conversationId,\n    //   calls: [] // All calls for this user's participant\n    // }\n    usersCallSessions: computed('monitoredConversationsForErrors.@each.participants', 'personGuid', function () {\n        let callSessions = [];\n        this.get('monitoredConversationsForErrors').forEach(conversation => {\n            Ember.get(conversation, 'participants').forEach(participant => {\n                const purpose = (Ember.get(participant, 'purpose') || '').toLowerCase();\n                const participantIsUserAgent = ['user', 'agent'].indexOf(purpose) > -1;\n                const participantIsCurrentUser = Ember.get(participant, 'userId') === this.get('personGuid');\n                const userParticipant = participantIsCurrentUser && participantIsUserAgent ? participant : null;\n                if (userParticipant && Ember.get(userParticipant, 'calls')) {\n                    callSessions.push({ id: conversation.id, calls: Ember.get(userParticipant, 'calls') });\n                }\n            });\n        });\n        return callSessions;\n    }),\n\n    // returns array of user's call sessions that have errors (errorInfo or disconnectType == 'error' or disconnectReasons with 3XX, 4XX, 5XX codes)\n    userCallSessionsWithErrors: computed(\n        'usersCallSessions.calls.@each.errorInfo',\n        'usersCallSessions.calls.@each.disconnectReasons',\n        'userCallSessionsWithErrors.calls.@each.disconnectType',\n        function () {\n            return this.get('usersCallSessions').filter(session => {\n                const calls = Ember.get(session, 'calls');\n                const callsWithErrors = calls.filter(call => {\n                    const disconnectReasons = Ember.get(call, 'disconnectReasons');\n                    const thereAreDisconnectReasons = this.isDefinedAndLengthGreaterThan(disconnectReasons, 0);\n                    if (thereAreDisconnectReasons) {\n                        const re = /[3|4|5|6]\\d{2}/;\n                        const disconnectErrors = disconnectReasons.filter(reason => {\n                            return re.exec(reason.code);\n                        });\n                        return this.isDefinedAndLengthGreaterThan(disconnectErrors, 0);\n                    }\n                    const errorInfo = Ember.get(call, 'errorInfo');\n                    const disconnectTypeIsError =\n                        typeof Ember.get(call, 'disconnectType') === 'string'\n                            ? call.disconnectType.toLowerCase() === 'error'\n                            : false;\n\n                    // UI-2567: Ignore white listed errors if they do not cause disconnect\n                    if (!disconnectTypeIsError && errorInfo && ERROR_WHITE_LIST.indexOf(errorInfo.code) !== -1) {\n                        return false;\n                    }\n\n                    return errorInfo || disconnectTypeIsError ? true : false;\n                });\n                return callsWithErrors.length > 0 ? true : false;\n            });\n        }\n    )\n});\n","import Ember from 'ember';\n\nconst { observer, Logger } = Ember;\n\nexport default Ember.Mixin.create({\n    registerCPTopics: observer('user.id', function () {\n        const id = this.get('user.id');\n        const pigeon = this.get('pigeon');\n        let topics = [];\n        if (id && !this.get('registeredTopics')) {\n            this.set('registeredTopics', true);\n            topics = [\n                'station',\n                'conversations',\n                'voicemail.messages',\n                'userrecordings',\n                'fax.documents',\n                'evaluations'\n            ];\n\n            this.get('pigeon').on(`v2.users.${id}.station`, this, this._updateStationEvent); // in mixins/phone-service/station\n            return topics.map(t => `v2.users.${id}.${t}`).forEach(t => pigeon.registerPriorityTopic(t));\n        }\n    }),\n\n    updateActiveConversationEntry(conversation) {\n        let type = this.getInteractionTypeFromCP(conversation);\n\n        if (!type.isCall || (type.isCall && type.isCallback) || type.isFax) {\n            return;\n        }\n\n        let conversationData;\n        let currentCallState;\n        const conversationDetails = this.get('conversations').findBy('id', conversation.id);\n        if (conversationDetails) {\n            const participantOnExistingConversation = conversationDetails\n                .get('participants')\n                .findBy('userId', this.get('personGuid'));\n            if (!participantOnExistingConversation) {\n                Logger.error(\n                    `updateActiveConversationEntry: Expected to find person ${this.get('personGuid')} on conversation ${\n                        conversation.id\n                    } but person was not found`\n                );\n            } else {\n                const participantCall = this.getParticipantCall(participantOnExistingConversation);\n                currentCallState = participantCall.state ? participantCall.state.toLowerCase() : null;\n            }\n        }\n\n        const participants = Ember.get(conversation, 'participants');\n        const isAgentCall = participants.any(party => (party.purpose ? party.purpose === 'agent' : false));\n\n        const participantsForUser = participants.filterBy('userId', this.get('personGuid'));\n        let participantOnUpdatedConversation;\n\n        if (participantsForUser.length) {\n            participantOnUpdatedConversation = participantsForUser[participantsForUser.length - 1];\n        }\n        const updatedParticipantCall = this.getParticipantCall(participantOnUpdatedConversation);\n        const participantOnCall = updatedParticipantCall\n            ? ['alerting', 'contacting', 'dialing', 'connected'].indexOf(updatedParticipantCall.state.toLowerCase()) >\n              -1\n            : false;\n        const participantIsNotVoicemail = participantOnUpdatedConversation.purpose\n            ? participantOnUpdatedConversation.purpose.toLowerCase() !== 'voicemail'\n            : false;\n        const isActiveOnCall = updatedParticipantCall && participantOnCall && participantIsNotVoicemail;\n        const newCallState = updatedParticipantCall.state.toLowerCase();\n\n        if (isAgentCall && currentCallState !== 'connected' && newCallState === 'alerting') {\n            Ember.set(conversation, 'acceptedByClient', false);\n        }\n\n        if (\n            currentCallState &&\n            participantIsNotVoicemail &&\n            currentCallState !== 'connected' &&\n            newCallState === 'connected'\n        ) {\n            this.get('headset').answerCall(conversation.id, this.get('connectedConversations.length') >= 1);\n        }\n\n        if (currentCallState && currentCallState !== 'disconnected' && newCallState === 'disconnected') {\n            this.get('headset').endCall(conversation.id, this.get('connectedConversations.length') > 1);\n        }\n\n        const onCall = conversationDetails ? conversationDetails.get('onCall') : false;\n        if (isAgentCall || isActiveOnCall || onCall || newCallState === 'terminated') {\n            conversationData = this.updateConversationArray(conversation, conversationDetails, isAgentCall);\n        }\n        if (conversationData || newCallState === 'terminated') {\n            this.notifyPropertyChange('conversations');\n            this.notifyPropertyChange('recentDisconnectedAgentCalls');\n            this._logConversationDetails(conversationData);\n        }\n\n        conversationData = this._updateModelForConsult(conversationData, conversation);\n\n        return conversationData;\n    },\n\n    //TODO | SERVOPS-11175 | change this if/when service updates to include consultParticipant status for participants after customer departs\n    _updateModelForConsult(conversationData, conversation) {\n        if (conversation && conversation.participants) {\n            const consultParticipantId = conversation.participants\n                .filterBy('purpose', 'customer')\n                .mapBy('consultParticipantId')\n                .pop();\n\n            // the consultParticipantId needs to be retained even when the call is no longer\n            // on consult because of use cases identified in SERVOPS-11175\n            if (consultParticipantId) {\n                conversationData.consultParticipantId = consultParticipantId;\n            }\n        }\n        return conversationData;\n    }\n});\n","import Ember from 'ember';\nimport { EVENTS } from 'connections-ui/utils/hosted-context';\nimport moment from 'connections-ui/utils/dates';\nimport _ from 'lodash';\n\nconst { observer, run, inject } = Ember;\nconst IGNORED_ERRORS = ['error.ininedgecontrol.session.inactive'];\n\nexport default Ember.Mixin.create({\n    session: inject.service(),\n    webrtcSdkService: inject.service('webrtcSdk'),\n\n    useNotificationProfileOutput: Ember.computed.reads('session.features.notificationOutputPicker'),\n\n    displayIncomingNotification(conversation) {\n        let isHosted, applicationHasFocus;\n        const hosted = this.get('application.hostedContext');\n        if (hosted) {\n            isHosted = hosted.isHosted();\n            applicationHasFocus = hosted.applicationHasFocus();\n        }\n        if (this.get('application.browserHidden') || (isHosted && !applicationHasFocus)) {\n            const title = this.get('intl').lookup('notification.titles.incomingCall').toString();\n            const message = this.get('intl').lookup('notification.purecloud.incomingCall').toString();\n            const notificationOptions = {\n                fallbackToInBrowser: false,\n                hideAfter: 8,\n                tag: EVENTS.INCOMING_CALL,\n                meta: {\n                    conversation: conversation\n                },\n                clickHandler: (conversation, action) => {\n                    if (conversation && action) {\n                        if (_.includes(action, 'ignore')) {\n                            return this.toVoicemail(conversation);\n                        } else if (_.includes(action, 'answer')) {\n                            return this.answer(conversation);\n                        }\n                    }\n                }\n            };\n\n            if (this.get('useNotificationProfileOutput')) {\n                notificationOptions.notificationOutputDeviceId = this.getNotificationOutputDeviceId();\n            }\n\n            this.get('notification').info(title, message, notificationOptions);\n        }\n    },\n\n    // handle errors on users session\n    handleParticipantCallError: observer(\n        'userCallSessionsWithErrors.@each.calls',\n        'userCallSessionsWithErrors.calls.@each.disconnectedTime',\n        'personGuid',\n        'webrtcSdkService.useSdk',\n        function () {\n            // we will use the sdk the determine and parse call errors\n            if (this.get('webrtcSdkService.useSdk')) {\n                return;\n            }\n\n            const callsWithErrors = this.get('callsWithErrors');\n            const userCallSessionsWithErrors = this.get('userCallSessionsWithErrors');\n            // are there any errors on any of the user's sessions?\n            _.each(userCallSessionsWithErrors, session => {\n                const calls = Ember.get(session, 'calls');\n                _.each(calls, call => {\n                    const endMoment = moment(call.disconnectedTime);\n                    const isRecent = moment().diff(endMoment) < 5000 ? true : false;\n                    const hasThrownError = Ember.get(call, '_hasThrownError');\n                    if (isRecent && !hasThrownError) {\n                        callsWithErrors.pushObject({ conversationId: session.id, call: call });\n\n                        // TODO: We should not be getting calls without error info here PCDWEBK-3674\n                        if (call.errorInfo && !_.includes(IGNORED_ERRORS, call.errorInfo.code)) {\n                            Ember.set(call, '_hasThrownError', true);\n                            this.showErrorNotification(call.errorInfo);\n                        }\n                    }\n                });\n            });\n\n            if ((this.get('_testIsStationWebrtc') || this.get('station.isWebrtc')) && callsWithErrors.length > 0) {\n                _.each(callsWithErrors, call => {\n                    const reason = Ember.get(call, 'call.disconnectReasons.firstObject');\n                    const endMoment = moment(call.disconnectedTime);\n                    const isRecent = moment().diff(endMoment) < 5000 ? true : false;\n                    if (\n                        reason &&\n                        isRecent &&\n                        Ember.get(reason, 'type') === 'SIP' &&\n                        !Ember.get(call, 'call._hasThrownError')\n                    ) {\n                        Ember.set(call, 'call._hasThrownError', true);\n                        run.throttle(this, this.showSipError, reason, 1000);\n                    }\n                });\n            }\n        }\n    ),\n\n    showSipError(response) {\n        const title = this.get('intl').lookup('notification.titles.callError').toString();\n        const prefix = this.get('application.urlprefix');\n        let messageText = this.get('intl').t('purecloud.error.sipError');\n        messageText = `${messageText} ${response.code} ${response.phrase}`;\n        this.get('notification').error(title, messageText, {\n            tag: 'call-error',\n            icon: `${prefix} assets/images/icons/png/checkmark-circled.png`,\n            hideAfter: 5\n        });\n    },\n\n    translateServerErrors(response) {\n        const { message, messageParams, messageWithParams, code } = response;\n        const intl = this.get('intl');\n        switch (code) {\n            case 'providerapi.error.no.station.for.edge':\n            case 'providerapi.error.station.no.active.edge': {\n                return this.fetchStation(messageParams.stationId).then(response => {\n                    return messageWithParams.replace('{stationId}', `'${response.get('name')}'`);\n                });\n            }\n            case 'error.ininedgecontrol.connection.station.notReached': {\n                let newCode = code + '.physical';\n\n                if (this.get('station.isWebrtc')) {\n                    newCode = code + '.webrtc';\n                }\n\n                return Ember.RSVP.resolve(intl.t(newCode));\n            }\n            default: {\n                if (code && intl.exists(code)) {\n                    return Ember.RSVP.resolve(intl.t(code));\n                }\n                if (message) {\n                    return Ember.RSVP.resolve(message);\n                }\n                return code;\n            }\n        }\n    },\n\n    showErrorNotification(response, err) {\n        if (!response) {\n            if (!err) {\n                Ember.Logger.error(new Error('Cannot show error notification with no error information'));\n                return;\n            }\n            response = { message: err.message };\n        }\n        const title = this.get('intl').lookup('notification.titles.callError').toString();\n        const prefix = this.get('application.urlprefix');\n        let messageText = this.get('intl').t('purecloud.error.dialpad.call');\n        messageText = this.translateServerErrors(response, err);\n        return messageText.then(text => {\n            return this.get('notification').error(title, text, {\n                tag: 'call-error',\n                icon: prefix + 'assets/images/icons/png/checkmark-circled.png',\n                hideAfter: 5\n            });\n        });\n    },\n    showFeedbackErrorNotification(message) {\n        const title = this.get('intl').lookup('notification.titles.callError').toString();\n        message = '' + message;\n        return this.get('notification').error(title, message, {\n            target: this.get('applicationController'),\n            tag: 'activeCall',\n            hideAfter: false,\n            actionHandlers: {\n                reportError: this.get('intl').lookup('components.navMenu.feedback.contactSupport').toString()\n            }\n        });\n    },\n\n    showNoStationSelected(conversation) {\n        Ember.Logger.error('Cannot answer conversation because there is no active station for the current user', {\n            conversationId: conversation.get('id')\n        });\n        const title = this.get('intl').t('notification.titles.callError');\n        const message = this.get('intl').t('purecloud.station.noStationSelected');\n        this.get('notification').error(title, message, {\n            tag: 'call-error'\n        });\n    },\n\n    checkForNonACD(conversation) {\n        let isAcdCall = this.get('isActiveCallACD');\n        if (conversation) {\n            isAcdCall = conversation.get('isAgentCall');\n        }\n        if (!isAcdCall) {\n            const message = this.get('intl').lookup('notification.purecloud.nonACDOnQueue');\n            return this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n        }\n    }\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { computed, inject } = Ember;\n\nexport default Ember.Mixin.create(LoggerMixin, {\n    session: inject.service(),\n\n    ringerVolume: 0,\n    callVolume: 0,\n    ringing: false,\n    shouldRing: true,\n\n    enableAlertablePresencesOverrides: computed('session.features', function () {\n        const features = this.get('session.features');\n        return features && features['telephonyConfig.PURE-5149.enableAlertablePresencesOverrides'];\n    }),\n\n    getAlertRingTime: function (conversationToDisplayNotification) {\n        // The amount of time to ring if we can't find any other\n        // alerting timeout configuration.\n        let alertTime = 30000;\n\n        if (\n            conversationToDisplayNotification.get('isAgentCall') &&\n            !!conversationToDisplayNotification.get('myself.alertingTimeoutMs')\n        ) {\n            // Check for alerting timeout configure on the participant\n            alertTime = conversationToDisplayNotification.get('myself.alertingTimeoutMs');\n            return Ember.RSVP.resolve(alertTime);\n        } else if (conversationToDisplayNotification.get('isGroupRing')) {\n            // Check if the conversaton is part of a group ring\n            // and user the group alerting configuration\n            const groupRingId = conversationToDisplayNotification.get('groupRingId');\n            return this.get('voicemail')\n                .getGroupAlertTime(groupRingId)\n                .then(data => {\n                    if (data && data.rotateCallsSecs) {\n                        return data.rotateCallsSecs * 1000;\n                    } else {\n                        return alertTime;\n                    }\n                });\n        } else {\n            // Check to see if the user has a configured timeout for when a\n            // conversation is transfer to voicemail\n            const userId = this.get('session.user.id');\n            return this.get('voicemail')\n                .getUserAlertTime(userId)\n                .then(data => {\n                    if (data && data.alertTimeoutSeconds) {\n                        return data.alertTimeoutSeconds * 1000;\n                    } else {\n                        return alertTime;\n                    }\n                });\n        }\n    },\n\n    debuggerLog(namespace, message, options = {}) {\n        if (this.get('session.features.acdDebugRinging')) {\n            this.logger.debug(`${namespace}: ${message}`, options);\n        }\n    }\n});\n","import Ember from 'ember';\nimport webrtcConversationTypes from 'ember-webrtc-components/utils/webrtc-conversation-types';\nimport { task, timeout } from 'ember-concurrency';\n\nconst { computed, RSVP, inject } = Ember;\n\nexport default Ember.Mixin.create({\n    store: inject.service(),\n    station: null,\n    needStation: false,\n    updateStationEventTimeout: 500,\n\n    freeSeatPreference: computed('session.org.orgSettings.freeSeating', function () {\n        return this.get('session.org.orgSettings.freeSeating');\n    }),\n\n    isSelfStationFT: computed.readOnly('session.features.PURE-6104_no_snatch_phone'),\n\n    noStationSelected: computed.not('station'),\n\n    defaultStation: computed('user.station.defaultStation', function () {\n        const user = this.get('user');\n        if (user && Ember.get(user, 'station.defaultStation')) {\n            return this.get('user.station.defaultStation');\n        }\n        return null;\n    }),\n\n    associatedStationNotDefault: computed('defaultStation', 'station', function () {\n        if (!(this.get('defaultStation') || this.get('station'))) {\n            return false;\n        }\n        return this.get('defaultStation.id') !== this.get('station.id');\n    }),\n\n    defaultStationNamePromise: computed('defaultStation', function () {\n        if (!this.get('defaultStation')) {\n            return RSVP.resolve(null);\n        }\n\n        return this.get('store')\n            .find('station', this.get('defaultStation.id'))\n            .then(station => station.get('name'));\n    }),\n\n    // TODO: Remove this when API-2018 is ready because the calls to pub api for getting the user\n    // and setting the station will include station name and type.\n    fetchStation(selectedStation) {\n        const stationId = this.guidFromUri(selectedStation || this.get('user.station.lastAssociatedStation.id'));\n        return this.store\n            .find('station', stationId)\n            .then(station => {\n                this.set('station', station);\n                return station;\n            })\n            .catch(function (err) {\n                Ember.Logger.error('Failed to fetch station:', {\n                    error: err,\n                    stationId\n                });\n            });\n    },\n\n    disassociateStation() {\n        const userId = this.get('personGuid');\n        let url = this.get('applicationService').pcV2Uri(`api/v2/users/${userId}/station/associatedstation`);\n        if (this.get('isSelfStationFT')) {\n            url = this.get('applicationService').pcV2Uri(`api/v2/users/stations/me/associatedstation`);\n        }\n        return this.get('ajax').delete(url);\n    },\n\n    disconnectPersistentConnection() {\n        if (this.get('webrtcSdkService.useSdk')) {\n            return this.get('webrtcSdkService').endAllSoftphoneSessions();\n        }\n\n        const webrtc = this.get('webrtc');\n        const conversations = webrtc\n            .get('conversations')\n            .filterBy('conversationType', webrtcConversationTypes.SOFTPHONE)\n            .map(c => ({ conversationId: c.get('conversationId'), jid: c.get('jid') }));\n        if (conversations.length !== 1) {\n            Ember.Logger.warn('Disconnecting persistent connection with active conversations', {\n                conversations: conversations.map(c => Ember.get(c, 'id'))\n            });\n        } else {\n            Ember.Logger.info('disconnecting persistent connection', conversations[0]);\n        }\n        conversations.forEach(c => webrtc.endConversation(c));\n    },\n\n    chooseDefault() {\n        const user = this.get('user');\n        let defaultStation = Ember.get(user, 'station.defaultStation');\n        if (!defaultStation) {\n            defaultStation = Ember.get(user, 'station.associatedStation');\n        }\n        this.chooseStation(Ember.get(defaultStation, 'id'));\n        this.set('defaultStation', defaultStation);\n        Ember.set(user, 'station.defaultStation', defaultStation);\n    },\n\n    doLoginAssociationLogic() {\n        const isFreeSeatOrg = this.get('freeSeatPreference');\n        let promise;\n\n        if (isFreeSeatOrg) {\n            promise = this._loginAssociationFreeSeat();\n        } else {\n            promise = this._loginAssociation();\n        }\n\n        return promise;\n    },\n\n    doLogoutAssociationLogic() {\n        return Ember.RSVP.resolve();\n    },\n\n    _loginAssociationFreeSeat() {\n        const user = this.get('user');\n        const associatedStation = Ember.get(user, 'station.associatedStation.id');\n        if (associatedStation) {\n            // user has an associated station, just fetch the station data\n            return this.fetchStation(associatedStation);\n        }\n        this.set('station', null);\n        this.logger.debug('Could not associate station on login because user does not have an associated Station');\n        return RSVP.resolve();\n    },\n\n    _loginAssociation() {\n        const user = this.get('user');\n        const associatedStation = Ember.get(user, 'station.associatedStation.id');\n        if (associatedStation) {\n            // user has an associated station, just fetch the station data\n            return this.fetchStation(associatedStation);\n        }\n        const lastAssociatedStation = Ember.get(user, 'station.lastAssociatedStation');\n        if (lastAssociatedStation) {\n            // user has no associated station, so we will pick the last station they used as long as it is not associated to another user\n            const lastAssociatedUser = Ember.get(lastAssociatedStation, 'associatedUser');\n            if (!lastAssociatedUser) {\n                return this.chooseStation(Ember.get(lastAssociatedStation, 'id'));\n            }\n        }\n        const defaultStation = Ember.get(user, 'station.defaultStation');\n        if (defaultStation) {\n            // user has no associated station or last used station, so pick their default as long as it is not associated to another user\n            const defaultStationUser = Ember.get(defaultStation, 'associatedUser');\n            if (!defaultStationUser) {\n                return this.chooseStation(Ember.get(defaultStation, 'id'));\n            }\n        }\n        const userStationSettings = Ember.get(user, 'station');\n        this.set('station', null);\n        this.logger.info('User did not have any stations to pick on login', { userStationSettings });\n        return RSVP.resolve();\n    },\n\n    chooseStation(selectedStation, stationType = 'associatedstation') {\n        let station = selectedStation.split('/').pop();\n\n        if (!station) {\n            return Ember.RSVP.resolve();\n        }\n        let uri = this.get('application').pcUri([\n            'api/v2/users',\n            this.get('user.id'),\n            `station/${stationType}`,\n            station\n        ]);\n        if (this.get('isSelfStationFT')) {\n            uri = this.get('application').pcUri(['api/v2/users/stations/me/associatedstation', station]);\n        }\n        const successHandler = data => {\n            this.fetchStation(station);\n            return data;\n        };\n        const errorHandler = jqXHR => {\n            Ember.onerror(jqXHR);\n            let message = Ember.get(jqXHR, 'responseJSON.message') || '';\n            message = this.get('intl').lookup('notification.purecloud.phoneFail') + message;\n            return this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n        };\n        return this.get('ajax').put(uri).then(successHandler, errorHandler);\n    },\n\n    _updateStationEvent(eventBody, json) {\n        this.get('_debouncedUpdateStationEvent').cancelAll();\n        this.get('_debouncedUpdateStationEvent').perform(eventBody, json);\n    },\n\n    _debouncedUpdateStationEvent: task(function* (eventBody, json) {\n        yield timeout(this.get('updateStationEventTimeout'));\n        this._handleUpdateStation(eventBody, json);\n    }),\n\n    _handleUpdateStation(eventBody, json) {\n        const metadata = Ember.get(json, 'metadata');\n        if (!metadata) {\n            return;\n        }\n        const stationId = this.get('station') ? this.get('station.id') : null;\n        const newStation = Ember.get(eventBody, 'associatedStation');\n        const newStationId = newStation && newStation.id ? newStation.id : null;\n        const currentStationIsNewStation = !!(stationId && newStationId && stationId === newStationId);\n        const action = Ember.get(metadata, 'action') ? metadata.action.toLowerCase() : false;\n\n        if (action === 'associated' && currentStationIsNewStation) {\n            return;\n        } else if (action === 'disassociated') {\n            this.set('station', null);\n        } else if (action === 'associated') {\n            this.fetchStation(eventBody.stationUri || newStationId);\n        }\n    },\n\n    _testIsStationWebrtc: false // HACK: for testing\n});\n","import Ember from 'ember';\n\nexport default Ember.Mixin.create({\n    addIndicatorForPromise: function (promise, target) {\n        Ember.assert('You must specify a valid target selector', target && typeof target === 'string');\n\n        if (promise && promise.then) {\n            var view = Ember.$('<div class=\"loading-indicator\"><i class=\"pc-moon pc-loading pc-spin\"></i></div>');\n            Ember.$(target).append(view);\n\n            promise.then(function () {\n                view.remove();\n            });\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst PurecloudModelMixin = Ember.Mixin.create({});\n\nexport default PurecloudModelMixin;\n","import Ember from 'ember';\n\nconst { computed, inject } = Ember;\nconst { alias } = computed;\n\nconst FEATURE_RELATE_ACCESS = 'permissions.hasExternalContactsViewContactAccess';\n\nconst FEATURE_CUSTOM_FIELDS = 'session.features.relateDynamicSchema';\n\nexport default Ember.Mixin.create({\n    session: inject.service(),\n    permissions: inject.service(),\n\n    hasRelateAccess: computed.alias(FEATURE_RELATE_ACCESS),\n\n    canShowCustomFields: alias(FEATURE_CUSTOM_FIELDS),\n\n    contactRoute: computed('isRelateEngineAvailable', function () {\n        return 'relate.contacts-ui-redirect'; // todo: clean up with redirects\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport DS from 'ember-data';\nimport ajax from 'ember-ajax';\nimport { componentClassName } from 'connections-ui/utils/external-contact-messaging';\n\nconst SEARCH_ALL = '*';\n\nconst TAGS_ENDPOINT = '/directory/api/v2/tags/skills.skills,skills.certs,general.department,general.title';\n\nconst CANCELLATION_ERROR = 'Request Cancelled';\n\nfunction performSearch() {\n    if (this.get('isDestroyed') || this.get('isDestroying')) {\n        return;\n    }\n\n    var value;\n    if (this.get('searchQuery.length') > 0) {\n        value = this.get('searchQuery');\n    } else if (this.get('searchOnEmpty')) {\n        value = SEARCH_ALL;\n    } else {\n        if (this._state !== 'inDOM') {\n            return;\n        }\n\n        this.get('presenceSubscription').autoSubscribe(null, this, 'search');\n        this.set('searchResults', []);\n        return;\n    }\n\n    var deferred = this.get('pendingSearchRequest');\n    if (deferred) {\n        deferred.reject(CANCELLATION_ERROR);\n    }\n    deferred = Ember.RSVP.defer();\n\n    this.set('pendingSearchRequest', deferred);\n\n    var requestArray = [];\n\n    var queueSearchRequest;\n\n    const queuePermission = this.get('permissions.canViewQueue');\n    const relatePermission = this.get('permissions.hasExternalContactsViewContactAccess');\n\n    if (this.get('searchQueueOnly') && queuePermission) {\n        const queueSearchData = {\n            name: `**${value}**`,\n            pageNumber: 1,\n            pageSize: this.get('searchLimit')\n        };\n\n        const divisionAgnostic = this.get('divisionAgnostic');\n        const myQueuesOnly = this.get('myQueuesOnly');\n\n        if (divisionAgnostic) {\n            queueSearchData.name = `**${value}**`;\n            queueSearchData.divisionAgnostic = true;\n        }\n\n        if (myQueuesOnly) {\n            queueSearchData.myQueuesOnly = myQueuesOnly;\n        }\n\n        queueSearchRequest = this.get('store').query('queue', queueSearchData);\n        requestArray.push(queueSearchRequest);\n    } else if (this.get('searchRelate') && this.get('searchRelateOnly') && relatePermission) {\n        queueSearchRequest = this.get('store').query('externalcontacts/contact', {\n            searchTerm: `${value}`,\n            pageSize: this.get('searchLimit'),\n            pageNumber: 1,\n            originator: this.get('componentClassName'),\n            expandField: 'externalOrganization'\n        });\n        requestArray.push(queueSearchRequest);\n    } else {\n        if (this.get('searchQueueOnly')) {\n            return;\n        }\n        const query = [\n            {\n                value: value,\n                type: 'QUERY_STRING'\n            }\n        ];\n        // should be the ucIntegrationKey, will be null unless set\n        const searchIntegrationKey = this.get('searchIntegrationKey');\n        if (searchIntegrationKey) {\n            query.push({\n                type: 'EXACT',\n                fields: ['integration'],\n                value: searchIntegrationKey\n            });\n        }\n\n        let request = null;\n\n        const userRequest = this.get('store').query('public-api-user', {\n            query,\n            sortBy: 'name',\n            sortOrder: 'ASC'\n        });\n        request = userRequest.then(entities => {\n            const resultArray = entities.content || [];\n            const userIds = resultArray.map(entry => entry.id);\n            return this.get('store').findMany('person', userIds);\n        });\n\n        requestArray.push(request);\n\n        if (this.get('searchQueue') && queuePermission) {\n            let queueSearchQuery;\n            if (this.get('divisionAgnostic')) {\n                queueSearchQuery = {\n                    name: value,\n                    pageNumber: 1,\n                    pageSize: this.get('searchLimit'),\n                    divisionAgnostic: true\n                };\n            } else {\n                queueSearchQuery = {\n                    name: `**${value}**`,\n                    pageNumber: 1,\n                    pageSize: this.get('searchLimit')\n                };\n            }\n            queueSearchRequest = this.get('store').query('queue', queueSearchQuery);\n            requestArray.push(queueSearchRequest);\n        }\n\n        if (this.get('searchRelate') && relatePermission) {\n            queueSearchRequest = this.get('store').query('externalcontacts/contact', {\n                searchTerm: `${value}`,\n                pageSize: this.get('searchLimit'),\n                originator: this.get('componentClassName'),\n                pageNumber: 1,\n                expandField: 'externalOrganization,division'\n            });\n            requestArray.push(queueSearchRequest);\n        }\n    }\n\n    Ember.RSVP.allSettled(requestArray).then(promises => {\n        const results = [];\n        promises.forEach(promise => {\n            if (promise.state === 'rejected') {\n                Ember.Logger.warn('Failed to load search request', { reason: promise.reason });\n            } else {\n                results.push(promise.value);\n            }\n        });\n        if (results.length === 0) {\n            deferred.reject(new Error('All search requests failed'));\n        } else {\n            deferred.resolve(results);\n        }\n    });\n\n    deferred.promise\n        .then(entities => {\n            var results = _.map(entities, function (entity) {\n                if (!Array.isArray(entity)) {\n                    return entity.get('content').map(x => x.getRecord());\n                } else {\n                    return entity;\n                }\n            });\n\n            if (entities.length) {\n                this.set('searchMeta', _.head(entities).meta);\n            }\n            entities = _.flatten(results);\n            const people = entities.filterBy('type', 'person');\n            if (people.length > 0) {\n                this.get('presenceSubscription').autoSubscribe(people, this, 'search');\n            }\n            this.set('searchResults', entities);\n\n            if (_.isEmpty(entities)) {\n                this.notifyPropertyChange('searchResults');\n            }\n\n            return entities;\n        })\n        .finally(() => {\n            this.set('pendingSearchRequest', null);\n        });\n\n    this.set('currentSearchRequest', DS.PromiseArray.create({ promise: deferred.promise }));\n}\n\nfunction performTagSearch() {\n    var request = tagSearchRequest(this.get('tagSearchQuery'));\n\n    request.then(results => {\n        this.set('tagSearchResults', results);\n        return results;\n    });\n\n    this.set('tagSearchRequest', DS.PromiseObject.create({ promise: request }));\n}\n\nfunction tagSearchRequest(query) {\n    return new Ember.RSVP.Promise(function (resolve, reject) {\n        ajax(TAGS_ENDPOINT, {\n            type: 'GET',\n            data: { q: query }\n        }).then(function (data) {\n            var results = data.res;\n\n            if (results.length !== 0) {\n                _.each(results, function (result) {\n                    var tag = result.field.substring(result.field.indexOf('.') + 1);\n                    result.tag = tag;\n                });\n            }\n\n            resolve(results);\n        }, reject);\n    }, 'SearchMixin#tagSearchRequest');\n}\n\nexport const SearchMixin = Ember.Mixin.create({\n    componentClassName: Ember.computed(function () {\n        return componentClassName.call(this);\n    }),\n    presenceSubscription: Ember.inject.service('presence-subscription'),\n    store: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    searchQuery: null,\n    entityFilter: null,\n    searchQueue: false,\n    searchQueueOnly: false,\n    saveHistory: true,\n    searchOnEmpty: false,\n    searchLimit: 25,\n\n    pendingSearchRequest: null,\n    currentSearchRequest: null,\n\n    searchIntegrationKey: null,\n\n    searchResults: Ember.computed(function () {\n        return [];\n    }),\n\n    performSearch: Ember.observer('searchQuery', 'entityFilter', function () {\n        Ember.run.debounce(this, performSearch, 200);\n    })\n});\n\nexport const ThenableSearchMixin = Ember.Mixin.create({\n    componentClassName: Ember.computed(function () {\n        return componentClassName.call(this);\n    }),\n    store: Ember.inject.service(),\n    presenceSubscription: Ember.inject.service('presence-subscription'),\n    searchQuery: null,\n    entityFilter: null,\n    searchQueue: false,\n    searchQueueOnly: false,\n    saveHistory: true,\n    searchOnEmpty: false,\n    searchLimit: 25,\n\n    pendingSearchRequest: null,\n    currentSearchRequest: null,\n\n    performSearch(searchQuery, entityFilter) {\n        this.set('searchQuery', searchQuery);\n        this.set('entityFilter', entityFilter);\n        performSearch.apply(this);\n        return this.get('currentSearchRequest');\n    }\n});\n\nexport const TagSearchMixin = Ember.Mixin.create({\n    tagSearchQuery: null,\n    tagSearchRequest: null,\n\n    tagSearchResults: Ember.computed(function () {\n        return [];\n    }),\n\n    performTagSearch: Ember.observer('tagSearchQuery', function () {\n        Ember.run.debounce(this, performTagSearch, 150);\n    })\n});\n\n// TODO: Remove this after toggle is flipped\nexport const HelpMixin = Ember.Mixin.create({\n    searchQuery: null,\n    searchResults: null,\n    request: null,\n\n    _performHelpSearch() {\n        const searchQuery = this.get('searchQuery');\n\n        if (searchQuery) {\n            const request = new Ember.RSVP.Promise((resolve, reject) => {\n                Ember.$.ajax({\n                    type: 'GET',\n                    cache: false,\n                    url: 'https://help.genesys.cloud/purecloud-search-api.php',\n                    dataType: 'json',\n                    data: {\n                        q: searchQuery\n                    },\n                    success: data => {\n                        const results = data ? Ember.get(data, 'results') : null;\n                        _.forEach(results, function (result) {\n                            if (result.excerpt) {\n                                result.excerpt = result.excerpt\n                                    .replace(/(<([^>]+)>)/gi, '')\n                                    .replace(/&quot;/g, '\"')\n                                    .replace(/&#39;/g, \"'\")\n                                    .replace(/&lt;/g, '<')\n                                    .replace(/&gt;/g, '>')\n                                    .replace(/&amp;/g, '&')\n                                    .replace(/&#8217;/g, \"'\");\n                            }\n                        });\n                        this.set('searchResults', results);\n                        resolve(data);\n                    },\n                    error: function (error) {\n                        Ember.Logger.log('Error accessing resourceCenter');\n                        reject(error);\n                    }\n                });\n            });\n\n            this.set('request', DS.PromiseObject.create({ promise: request }));\n        } else {\n            this.set('searchResults', null);\n        }\n    },\n\n    performHelpSearch: Ember.observer('searchQuery', function () {\n        Ember.run.debounce(this, this._performHelpSearch, 150);\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { componentClassName } from 'connections-ui/utils/external-contact-messaging';\nimport { isTesting } from 'connections-ui/utils/testing';\n\nconst TIMEOUT = isTesting ? 0 : 300;\n\nconst PrepareResults = (context, results) => {\n    let parsedResults;\n\n    if (!Array.isArray(results)) {\n        parsedResults = results.get('content');\n        parsedResults = parsedResults.map(x => x.getRecord());\n    } else {\n        parsedResults = results;\n    }\n\n    if (parsedResults.length < 0 && parsedResults === undefined && parsedResults === null) {\n        context.set('retrySearch', true);\n        return;\n    }\n\n    const entities = _.flatten(parsedResults);\n    const people = entities.filterBy('type', 'person');\n\n    if (people.length > 0) {\n        context.get('presenceSubscription').autoSubscribe(people, context, 'search');\n    }\n\n    return entities;\n};\n\nconst performSearch = function () {\n    let value;\n\n    if (this.get('isDestroyed') || this.get('isDestroying')) {\n        return;\n    }\n    if (this.get('searchQuery.length') > 0) {\n        value = this.get('searchQuery');\n    } else if (this.get('searchOnEmpty')) {\n        value = '*';\n    } else {\n        if (this._state !== 'inDOM') {\n            return;\n        }\n        this.get('presenceSubscription').autoSubscribe(null, this, 'search');\n        this.set('searchResults', []);\n        return;\n    }\n\n    const userPending = this.get('userPending');\n    const queuePending = this.get('queuePending');\n    const relatePending = this.get('relatePending');\n\n    const queuePermission = this.get('permissions.canViewQueue');\n    const relatePermission = this.get('permissions.hasExternalContactsViewContactAccess');\n\n    const searchRelate = this.get('searchRelate');\n    const searchQueues = this.get('searchQueue');\n    const searchUsers = this.get('searchUser');\n    let userRequests = null;\n\n    if (searchUsers && !userPending) {\n        this.set('userPending', true);\n\n        const request = this.get('store').query('public-api-user', {\n            query: [\n                {\n                    value: value,\n                    type: 'QUERY_STRING'\n                }\n            ],\n            sortBy: 'name',\n            sortOrder: 'ASC'\n        });\n        userRequests = request.then(entities => {\n            const resultArray = entities.content || [];\n            const userIds = resultArray.map(entry => entry.id);\n            return this.get('store').findMany('person', userIds);\n        });\n\n        userRequests.catch(() => this.set('userSearchFailed', true));\n        userRequests.then(res => {\n            let entities = new PrepareResults(this, res);\n            this.set('userResults', entities);\n        });\n        userRequests.finally(() => {\n            this.set('userPending', false);\n            this.get('retrySearch', false);\n        });\n    }\n\n    if (searchQueues && queuePermission && !queuePending) {\n        this.set('queuePending', true);\n\n        const queueSearchData = {\n            name: `**${value}**`,\n            pageNumber: 1,\n            pageSize: this.get('searchLimit')\n        };\n\n        const divisionAgnostic = this.get('divisionAgnostic');\n        if (divisionAgnostic) {\n            queueSearchData.divisionAgnostic = true;\n        }\n\n        const queueRequests = this.get('store').query('queue', queueSearchData);\n\n        queueRequests.catch(() => this.set('queueSearchFailed', true));\n        queueRequests.then(res => {\n            let entities = new PrepareResults(this, res);\n            this.set('queueResults', entities);\n        });\n        queueRequests.finally(() => {\n            this.set('queuePending', false);\n            this.get('retrySearch', false);\n        });\n    }\n\n    if (searchRelate && relatePermission && !relatePending) {\n        this.set('relatePending', true);\n        const relateRequests = this.get('store').query('externalcontacts/contact', {\n            searchTerm: `${value}`,\n            pageSize: this.get('searchLimit'),\n            pageNumber: 1,\n            expandField: 'externalOrganization,division',\n            originator: this.get('componentClassName')\n        });\n\n        relateRequests.catch(() => this.set('relateSearchFailed', true));\n        relateRequests.then(res => {\n            let entities = new PrepareResults(this, res);\n            this.set('relateResults', entities);\n        });\n        relateRequests.finally(() => {\n            this.set('relatePending', false);\n            this.get('retrySearch', false);\n        });\n    }\n};\n\nconst SearchMixin = Ember.Mixin.create({\n    componentClassName: Ember.computed(function () {\n        return componentClassName.call(this);\n    }),\n\n    presenceSubscription: Ember.inject.service('presence-subscription'),\n    store: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    searchQuery: null,\n    searchOnEmpty: false,\n\n    retrySearch: false,\n\n    searchUser: false,\n    searchRelate: false,\n    searchQueue: false,\n\n    userSearchFailed: false,\n    queueSearchFailed: false,\n    relateSearchFailed: false,\n\n    searchLimit: 25,\n    userPending: false,\n    queuePending: false,\n    relatePending: false,\n\n    userResults: null,\n    queueResults: null,\n    relateResults: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('userResults', []);\n        this.set('relateResults', []);\n        this.set('queueResults', []);\n    },\n\n    performSearch: Ember.observer('searchQuery', 'entityFilter', function () {\n        this.debouncedSearch();\n    }),\n\n    performReload: Ember.observer('retrySearch', function () {\n        if (this.get('retrySearch')) {\n            this.set('userResults', []);\n            this.set('relateResults', []);\n            this.set('queueResults', []);\n            this.debouncedSearch();\n        }\n    }),\n\n    debouncedSearch: _.debounce(performSearch, TIMEOUT, { leading: false, trailing: true })\n});\n\nexport default SearchMixin;\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst presenceToRadixMapping = {\n    available: 1,\n    busy: 2,\n    away: 3,\n    idle: 3,\n    offline: 4,\n    on_queue: 5,\n    out_of_office: 6\n};\n\nconst radixMapping = function (user) {\n    if (user) {\n        return presenceToRadixMapping[user.get('presence')];\n    } else {\n        return null;\n    }\n};\n\nconst userName = function (user) {\n    return user.get('name') || '';\n};\n\nconst mapUserToSortable = function (user) {\n    return `${radixMapping(user)}${userName(user)}`;\n};\n\nconst mapRoomToSortable = function (room) {\n    let radix = radixMapping(room.get('oneToOneTarget'));\n    let name = room.get('subject');\n    return `${radix}${name}`;\n};\n\nconst SortChatUsersMixin = Ember.Mixin.create({\n    sortChatUsers(usersList) {\n        return _.sortBy(usersList, mapUserToSortable);\n    },\n\n    sortOneToOneRooms(rooms) {\n        return _.sortBy(rooms, mapRoomToSortable);\n    }\n});\n\nexport default SortChatUsersMixin;\n","define(\"connections-ui/mixins/style-namespacing-extras\", [\"exports\", \"ember-component-css/mixins/style-namespacing-extras\"], function (_exports, _styleNamespacingExtras) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _styleNamespacingExtras.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Mixin.create({\n    beforeModel: function () {\n        // Skip call to super which is the authenticated-route-mixin\n        return null;\n    }\n});\n","import Ember from 'ember';\n\n// Viewport code adapted from:\n// https://emberway.io/ember-js-detecting-if-a-dom-element-is-in-the-viewport-eafcc77a6f86\n\nconst { computed } = Ember;\n\nconst REFRESH_RATE = 200;\n\nfunction getScrollParent(comp) {\n    if (!comp || !comp.$) {\n        return null;\n    }\n    try {\n        return [...comp.$().parents()].find(el => {\n            const $el = Ember.$(el);\n            return /(auto|scroll)/.test($el.css('overflow') + $el.css('overflow-y') + $el.css('overflow-x'));\n        });\n    } catch (err) {\n        return null;\n    }\n}\n\nexport default Ember.Mixin.create({\n    enableViewport: true,\n\n    enteredViewport: computed('boundingClientRect', 'windowHeight', function () {\n        const rect = this.get('boundingClientRect');\n        const windowHeight = this.get('windowHeight');\n        const windowWidth = this.get('windowWidth');\n        if (!rect) {\n            return false;\n        }\n\n        return rect.top >= 0 && rect.left >= 0 && rect.bottom <= windowHeight && rect.right <= windowWidth;\n    }),\n\n    exitedViewport: computed.not('enteredViewport'),\n\n    /**\n     * Implementers of these hooks are responsible for setting up their own run loop for\n     * scheduling, since this mixin is using request animation frame to handle events.\n     **/\n    didEnterViewport() {},\n    didExitViewport() {},\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        if (this.get('enableViewport')) {\n            Ember.run.scheduleOnce('afterRender', this, '_setup');\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._teardown();\n    },\n\n    _setup() {\n        Ember.run(() => {\n            if (this.isDestroying || this.isDestroyed) {\n                return;\n            }\n\n            this._bindEvents();\n            this._updateBoundingClientRect();\n            this.set('windowHeight', window.innerHeight || document.documentElement.clientHeight);\n            this.set('windowWidth', window.innerWidth || document.documentElement.clientWidth);\n        });\n    },\n\n    _teardown() {\n        if (!this.$()) {\n            return;\n        }\n\n        const scrollParent = getScrollParent(this);\n        if (!scrollParent) {\n            return;\n        }\n\n        const scrollParentRef = Ember.$(scrollParent);\n        if (scrollParentRef) {\n            scrollParentRef.off(`.${this.elementId}`);\n        }\n\n        const windowRef = Ember.$(window);\n        if (windowRef) {\n            windowRef.off(`.${this.elementId}`);\n        }\n    },\n\n    _bindEvents() {\n        if (!this.$()) {\n            return;\n        }\n\n        const scrollParent = getScrollParent(this);\n        if (!scrollParent) {\n            return;\n        }\n\n        const $scrollParent = Ember.$(scrollParent);\n        const resizeHandler = this.resizeHandler.bind(this);\n        $scrollParent.on(`scroll.${this.elementId}`, this.scrollHandler.bind(this));\n        Ember.$(window).on(`resize.${this.elementId}`, resizeHandler);\n    },\n\n    _updateBoundingClientRect() {\n        const el = this.element;\n        if (el && el.getBoundingClientRect) {\n            this.set('boundingClientRect', el.getBoundingClientRect());\n        }\n    },\n\n    _updateWindowSize() {\n        this.set('windowHeight', window.innerHeight || document.documentElement.clientHeight);\n        this.set('windowWidth', window.innerWidth || document.documentElement.clientWidth);\n    },\n\n    scrollHandler() {\n        Ember.run.debounce(this, '_scrollHandler', REFRESH_RATE, false);\n    },\n\n    _scrollHandler() {\n        const run = window.requestAnimationFrame || Ember.run;\n        if (window.requestAnimationFrame) {\n            window.requestAnimationFrame(this._updateBoundingClientRect.bind(this));\n        } else {\n            Ember.run.debounce(this, '_updateBoundingClientRect', 100);\n        }\n\n        if (this.get('enteredViewport')) {\n            run(this.didEnterViewport.bind(this));\n        } else {\n            run(this.didExitViewport.bind(this));\n        }\n    },\n\n    resizeHandler() {\n        Ember.run.debounce(this, '_resizeHandler', REFRESH_RATE, false);\n    },\n\n    _resizeHandler() {\n        const run = window.requestAnimationFrame || Ember.run;\n        if (window.requestAnimationFrame) {\n            window.requestAnimationFrame(this._updateWindowSize.bind(this));\n        } else {\n            Ember.run.debounce(this, '_updateWindowSize', 100);\n        }\n\n        if (this.get('enteredViewport')) {\n            run(this.didEnterViewport.bind(this));\n        } else {\n            run(this.didExitViewport.bind(this));\n        }\n    }\n});\n","import Ember from 'ember';\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\n\nconst { computed, inject } = Ember;\n\nexport default Ember.Mixin.create({\n    interaction: computed.reads('webrtc.interaction'),\n    webrtc: inject.service(),\n    streaming: inject.service(),\n    intl: computed.reads('webrtc.intl'),\n    phone: inject.service(),\n    mediaProviders: inject.service(),\n    sessionService: inject.service('session'),\n\n    videoTooltipTitle: Ember.computed('videoTooltipKey', 'haveNonPurecloudMediaProvider', function () {\n        let key = this.get('videoTooltipKey');\n        if (this.get('haveNonPurecloudMediaProvider')) {\n            key = 'ewc.open';\n        }\n\n        const params = {};\n\n        if (key === 'ewc.userOffline' || key === 'ewc.userBusy') {\n            params.name = this.get('webrtcTarget.oneToOneTarget.name');\n        }\n\n        if (this._fixTooltips) {\n            Ember.run.scheduleOnce('afterRender', this, this._fixTooltips);\n        }\n        return this.get('intl').t(key, params);\n    }),\n\n    videoTooltipTitleSr: Ember.computed('videoTooltipTitle', 'videoTooltipeKey', 'activeRoom.videoPeers', function () {\n        let key = this.get('videoTooltipKey');\n\n        const numberOfParticipants = this.get('activeRoom.videoPeers');\n        if (key == 'ewc.open' && numberOfParticipants > 0) {\n            key = 'ewc.openSr';\n            return this.get('intl').t(key, { number: numberOfParticipants });\n        }\n\n        return this.get('videoTooltipTitle');\n    }),\n\n    oneToOneChat: computed('webrtcTarget.oneToOneTarget', function () {\n        const webrtcTarget = this.get('webrtcTarget');\n        return webrtcTarget && webrtcTarget.isOneToOneRoom();\n    }),\n\n    isFirefox: BrowserUtils.isFirefox,\n\n    webrtcTarget: computed.or('activeRoom', 'entity.oneToOneRoom'),\n\n    webrtcPhoneWithIssues: Ember.computed(\n        'phone.station.{isWebrtc,webRtcRequireMediaHelper}',\n        'webrtc.webrtcAudioCallIssueKey',\n        function () {\n            return (\n                this.get('phone.station.isWebrtc') &&\n                this.get('webrtc.webrtcAudioCallIssueKey') &&\n                !this.get('phone.station.webRtcRequireMediaHelper')\n            );\n        }\n    ),\n\n    videoMediaProviders: Ember.computed('useMediaProviders', 'sessionService', 'mediaProviders.enabled', function () {\n        if (!this.get('useMediaProviders') || !this.get('mediaProviders.enabled')) {\n            return [];\n        }\n\n        return this.get('mediaProviders').getVideoProviders(this.get('sessionService.user'), this.get('webrtcTarget'));\n    }),\n\n    haveNonPurecloudMediaProvider: Ember.computed('videoMediaProviders.[]', function () {\n        return !!this.get('videoMediaProviders').find(provider => provider.get('id') !== 'purecloud');\n    }),\n\n    videoTooltipKey: computed(\n        'webrtc.{videoCallCapable,activeRoom.showingVideo,activeBridge,canConference,webrtcAudioCallIssueKey}',\n        'webrtcTarget.{showingVideo,videoRoomFull}',\n        'interaction.activeRealtimeInteractions.[]',\n        'isOneToOneOfflineOrBusy',\n        'isFirefox',\n        'mediaProviders.{enabled,usingVideoProvider}',\n        'useMediaProviders',\n        function () {\n            const openTooltip = 'ewc.open';\n            if (this.get('webrtc.webrtcAudioCallIssueKey')) {\n                return this.get('webrtc.webrtcAudioCallIssueKey');\n            }\n            if (!this.get('webrtc.videoCallCapable') && !this.get('useMediaProviders')) {\n                return 'ewc.notCapable';\n            }\n            if (this.get('interaction.activeRealtimeInteractions.length')) {\n                return 'ewc.activeInteractions';\n            }\n            if (\n                this.get('webrtcTarget.showingVideo') ||\n                this.get('webrtc.activeRoom.showingVideo') ||\n                this.get('mediaProviders.usingVideoProvider')\n            ) {\n                if (this.get('webrtcTarget.jid') === this.get('webrtc.activeRoom.jid')) {\n                    return 'ewc.openActiveCall';\n                }\n                return 'ewc.anotherActiveCall';\n            }\n            if (this.get('webrtcTarget.videoRoomFull')) {\n                return 'ewc.atCapacity';\n            }\n            if (this.get('webrtcTarget.oneToOneTarget')) {\n                if (this.get('mediaProviders.enabled') && this.get('useMediaProviders')) {\n                    return openTooltip;\n                }\n                if (!this.get('isOneToOneOfflineOrBusy')) {\n                    return openTooltip;\n                }\n                if (this.get('webrtcTarget.oneToOneTarget.isOffline')) {\n                    return 'ewc.userOffline';\n                }\n                if (this.get('webrtcTarget.oneToOneTarget.isBusy')) {\n                    return 'ewc.userBusy';\n                }\n            }\n            if (!this.get('webrtc.canConference') && !this.get('useMediaProviders')) {\n                return 'ewc.browserNotSupported';\n            }\n            return openTooltip;\n        }\n    ),\n\n    isOneToOneOfflineOrBusy: computed.and(\n        'oneToOneChat',\n        'webrtcTarget',\n        'webrtcTarget.oneToOneTarget.isOfflineOrBusy'\n    ),\n\n    isVideoButtonEnabled: computed(\n        'videoTooltipKey',\n        'webrtc.webrtcAudioCallIssueKey',\n        'haveNonPurecloudMediaProvider',\n        'useMediaProviders',\n        function () {\n            if (this.get('useMediaProviders') && this.get('haveNonPurecloudMediaProvider')) {\n                return true;\n            }\n\n            if (this.get('webrtc.webrtcAudioCallIssueKey')) {\n                return false;\n            }\n\n            return this.get('videoTooltipKey') === 'ewc.open' || this.get('videoTooltipKey') === 'ewc.openActiveCall';\n        }\n    ),\n\n    videoButtonEnabled: computed('isVideoButtonEnabled', function () {\n        return this.get('isVideoButtonEnabled') ? 'enabled' : 'disabled';\n    })\n});\n","define(\"connections-ui/models/annotation\", [\"exports\", \"ember-purecloud-components/models/annotation\"], function (_exports, _annotation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _annotation.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { typeOf, isPresent, copy, computed, assign } = Ember;\n\nexport const APPS_API_PROTOCOL = 'purecloud-client-apps';\nconst PROTOCOL_FIELD_NAME = 'protocol';\n\n// ----- Inbound Message Properties\nconst PROTOCOL_AGENT_FIELD_NAME = 'protocolAgentName';\nconst PROTOCOL_AGENT_VERSION_FIELD_NAME = 'protocolAgentVersion';\nconst API_ACTION_FIELD_NAME = 'action';\n\n// ----- Outbound Message Properties\nconst OUTBOUND_MSG_EVENT_TYPE_FIELD_NAME = 'purecloudEventType';\n\n/**\n * Model representing an inbound API call from the Apps SDK or from an internal app/frame utilizing direct\n * postMessage calls.\n */\nconst AppApiCall = Ember.Object.extend({\n    internalPcCall: false,\n    srcApp: null,\n    srcAppInstance: null,\n    protocol: null,\n    protocolAgentName: null,\n    protocolAgentVersion: null,\n    action: null,\n    actionDetails: null,\n\n    appId: computed('srcApp', 'srcAppInstance', function () {\n        let result = this.get('srcAppInstance.appId');\n\n        if (!result) {\n            result = this.get('srcApp.id');\n        }\n\n        return result || null;\n    })\n});\n\n/**\n * Parses and validates the provided messagePayload into an AppApiCall instance.\n *\n * actionDetails will only contain properties which are applicable to the specific api call.  i.e.\n * metadata props like the action, protocol, protocol agent, etc. will only exist in their\n * specific instance variables.\n *\n * @param {object} messagePayload - The payload to parse; fails if not an object\n * @param {boolean} requireProtocol - If the validation should fail on protocol fields\n *\n * @returns an AppApiCall if the message is valid\n * @throws Error if the payload structure is invalid;\n *  the protocol is missing/incorrect (in strict mode);\n *  the action is missin/incorrect\n */\nexport function parseMessage(messagePayload, requireProtocol) {\n    let result = null;\n\n    if (typeOf(messagePayload) !== 'object') {\n        throw new Error('invalidPayload');\n    } else {\n        let protocol = messagePayload[PROTOCOL_FIELD_NAME];\n        if (requireProtocol) {\n            if (\n                !Object.prototype.hasOwnProperty.call(messagePayload, PROTOCOL_FIELD_NAME) ||\n                typeOf(protocol) !== 'string' ||\n                !isPresent(protocol)\n            ) {\n                throw new Error('missingProtocol');\n            }\n\n            if (protocol !== APPS_API_PROTOCOL) {\n                throw new Error('invalidAppsProtocol');\n            }\n        }\n\n        let action = messagePayload[API_ACTION_FIELD_NAME];\n        if (\n            !Object.prototype.hasOwnProperty.call(messagePayload, API_ACTION_FIELD_NAME) ||\n            typeOf(action) !== 'string' ||\n            !isPresent(action)\n        ) {\n            throw new Error('missingAction');\n        }\n\n        let actionDetails = copy(messagePayload, true);\n\n        // Prune metadata and control fields from the actionDetails\n        [\n            PROTOCOL_FIELD_NAME,\n            PROTOCOL_AGENT_FIELD_NAME,\n            PROTOCOL_AGENT_VERSION_FIELD_NAME,\n            API_ACTION_FIELD_NAME\n        ].forEach(fieldToPrune => {\n            delete actionDetails[fieldToPrune];\n        });\n\n        result = AppApiCall.create({\n            protocol,\n            protocolAgentName: messagePayload[PROTOCOL_AGENT_FIELD_NAME],\n            protocolAgentVersion: messagePayload[PROTOCOL_AGENT_VERSION_FIELD_NAME],\n            action,\n            actionDetails\n        });\n    }\n\n    return result;\n}\n\n/**\n * Constructs the full payload of a message to be sent to an Embedded Client App.\n * Metadata fields will be appended to any provided custom payload to create the normalized\n * event structure.\n *\n * @param {string} eventType - The eventType of this message.\n * @param {object|null|undefined} [customPayload={}] - Additional payload to send to the the app\n *\n * @throws Error if eventType is not a non-blank string\n * @throws Error if the customPayload is not null, undefined, or an object\n * @throws Error if any of the reserved, metadata keys are provided in the customPayload\n *\n * @returns A normalized payload with all necessary metadata suitable to dispatch to an Embedded Client App\n */\nexport function buildOutboundMsgPayload(eventType, customPayload = {}) {\n    if (typeOf(eventType) !== 'string' || eventType.trim().length === 0) {\n        throw new Error('Non-empty string must be provided as the eventType');\n    }\n\n    let payloadType = typeOf(customPayload);\n    if (payloadType !== 'null' && payloadType !== 'object') {\n        throw new Error('Payload must be null, undefined, or an object');\n    }\n\n    // Ensure no metadata fields are in the provided customPayload\n    [PROTOCOL_FIELD_NAME, OUTBOUND_MSG_EVENT_TYPE_FIELD_NAME].forEach(currMetadataFieldName => {\n        if (customPayload && Object.prototype.hasOwnProperty.call(customPayload, currMetadataFieldName)) {\n            throw new Error(`Payload contains reserved metadata prop '${currMetadataFieldName}'`);\n        }\n    });\n\n    return assign(\n        {\n            [PROTOCOL_FIELD_NAME]: APPS_API_PROTOCOL,\n            [OUTBOUND_MSG_EVENT_TYPE_FIELD_NAME]: eventType\n        },\n        customPayload || {}\n    );\n}\n\nexport default AppApiCall;\n","import config from '../config/environment';\nimport Ember from 'ember';\nimport _ from 'lodash';\nimport { addPageAction } from '../utils/newrelic';\nimport InternallyHostedApp from './internally-hosted-app';\n\nconst { Evented, computed, run, get } = Ember;\n\nlet AppState = Ember.Object.extend({\n    name: null,\n    ordinal: 0,\n    compareTo(anotherState) {\n        if (!anotherState) {\n            return 1;\n        } else if (Object.getPrototypeOf(anotherState) !== Object.getPrototypeOf(this)) {\n            let errorMsg = 'Cannot compare AppState another object type';\n            Ember.Logger.error(errorMsg);\n            throw new Error(errorMsg);\n        }\n\n        return this.get('ordinal') - anotherState.get('ordinal');\n    }\n});\n\n/**\n * List of lifecycle-oredered, AppState instances\n *\n * Callers can use the @see AppState#copareTo method to test for state order\n */\nexport const APP_STATES = {\n    LOADING: AppState.create({\n        ordinal: 100\n    }),\n    BOOTSTRAPPING: AppState.create({\n        ordinal: 200\n    }),\n    RUNNING: AppState.create({\n        ordinal: 300\n    }),\n    STOPPING: AppState.create({\n        ordinal: 400\n    }),\n    STOPPED: AppState.create({\n        ordinal: 500\n    })\n};\n\n/**\n * The event name (internal eventing) that will be fired when the\n * lifecycle is changing (opt-in).  The primary consumer of this event will\n * be the app-instance component for re-broadcasting to app iframes.\n */\nexport const LIFECYCLE_HOOK_EVENT = 'appLifecycleHook';\n\n/**\n * The event payload values for @see {LIFECYCLE_HOOK_EVENT} that will\n * notify of a new lifecycle state (opt-in).  Again, this will typically be used\n * by the app-instance componet for re-broadcasting to app iframes.\n */\nexport const LIFECYCLE_HOOKS = {\n    BOOTSTRAP: 'bootstrap',\n    FOCUS: 'focus',\n    BLUR: 'blur',\n    STOP: 'stop'\n};\n\n/**\n * The callback types utilized by the Apps SDK (or app devs directly) as the\n * postMessage payload confirming the succes of app-side work within a lifecycle\n * phase.\n */\nexport const APP_LIFECYCLE_CALLBACKS = {\n    BOOTSTRAPPED: 'bootstrapped',\n    STOPPED: 'stopped'\n};\n\n/**\n * The list of problems which can affect this app-instance\n */\nexport const APP_PROBLEMS = {\n    APP_UPDATED: 'updated',\n    APP_DELETED: 'deleted',\n    LICENSE_UNAVAILABLE: 'licenseUnavailable'\n};\n\n/*\n * Internal, configuration details of each app lifecycle state which will be ordered by ordinal.\n *\n * Heads up, this config is not validated internally.  So you break it, you bought it.\n */\nconst STATE_CONFIGS = {\n    [APP_STATES.LOADING]: {\n        lifecycleDetails: {\n            maxDurationMillis: get(config, 'purecloud-apps.lifecycle.transitionalStateTimeouts.loading')\n        }\n    },\n    [APP_STATES.BOOTSTRAPPING]: {\n        lifecycleDetails: {\n            stateOptInPropName: 'hooks.bootstrap',\n            maxDurationMillis: get(config, 'purecloud-apps.lifecycle.transitionalStateTimeouts.bootstrapping'),\n            broadcastHookName: LIFECYCLE_HOOKS.BOOTSTRAP,\n            appCallbackEventName: APP_LIFECYCLE_CALLBACKS.BOOTSTRAPPED\n        }\n    },\n    [APP_STATES.RUNNING]: {},\n    [APP_STATES.STOPPING]: {\n        lifecycleDetails: {\n            stateOptInPropName: 'hooks.stop',\n            maxDurationMillis: get(config, 'purecloud-apps.lifecycle.transitionalStateTimeouts.stopping'),\n            broadcastHookName: LIFECYCLE_HOOKS.STOP,\n            appCallbackEventName: APP_LIFECYCLE_CALLBACKS.STOPPED\n        }\n    },\n    [APP_STATES.STOPPED]: {}\n};\n\n// Ordered list of lifecycle states\nconst LIFECYCLE_ORDERED_APP_STATES = Object.keys(APP_STATES)\n    .map(currStateName => APP_STATES[currStateName])\n    .sort((state1, state2) => state1.compareTo(state2));\n\n/**\n * An app-instance manages the runtime state of a particular instance of an app.\n * It contains the current lifecyle state, tracks transitional states, stores\n * any problems that might be affecting this instance, provides an api to\n * manipulate the lifecycle, and broadcasts events to integrate\n * with the rendering portion of the lifecycle.\n *\n * Important Notes:\n * app-instances are managed by an app-pool and must also be rendered with\n * an app-pool (transitively: app-instance and app-embed) component to ensure the\n * lifecycle correctly accounts for rendering and callbacks.\n *\n * Problems can occur at any state and may or may not exclusively affect state.  Therefore,\n * there is no app-state \"PROBLEM\".  Rather, users should consult the problem attribute\n * in addition to state.\n *\n * Instance Lifecycle States:\n *  <ol>\n *      <li>LOADING - The app's iframe is loading</li>\n *      <li>BOOTSTRAPPING - App-specific startup activities (Opt-in)\n *          <ul>\n *              <li>'bootstrap' hook (event fired)</li>\n *              <li>Awaits 'bootstrapped' app callback (Will timeout)</li>\n *          </ul>\n *      </li>\n *      <li>RUNNING\n *          <ul>\n *              <li>'blur' hook (event fired) on app blur (Opt-in)</li>\n *              <li>'focus' hook (event fired) on subsequent app focus (Opt-in)</li>\n *          </ul>\n *      </li>\n *      <li>STOPPING - App-specific startup activities (Opt-in)\n *          <ul>\n *              <li>'stop' hook (event fired) after stop requested</li>\n *              <li>Awaits 'stopped' app callback (Will timeout)</li>\n *          </ul>\n *      </li>\n *      <li>STOPPED - The app has shut down and the instance can safely be removed from PureCloud</li>\n *  </ol>\n *\n * Lifecycle Hooks (Opt In):\n * If an app is so configured, this class will broadcast lifecyle events out.  The\n * primary consumer of these events will be the app-instance component who will re-broadcast\n * the event onto the app's iframe.\n *\n * <ul>\n *   <li>bootstrap</li>\n *   <li>focus</li>\n *   <li>blur</li>\n *   <li>stop</li>\n * </ul>\n *\n * Lifecycle Callbacks:\n * App developers can acknowledge completion of certain app-side work via callbacks.\n * Callbacks are opt-in and will eventually time out to prevent an app from locking up\n * <ul>\n *   <li>bootstrapped</li>\n *   <li>stopped</li>\n * </ul>\n */\nconst AppInstance = Ember.Object.extend(Evented, {\n    instanceId: null,\n    app: null,\n\n    currState: null,\n    _currStateStartTimestamp: null,\n    problem: {\n        name: null,\n        details: null\n    },\n\n    lastUserAccessTimestamp: null,\n\n    _stateTimeoutTimer: null,\n\n    // sets a badging count for the app instance\n    attentionCount: 0,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('instanceId', Ember.guidFor(this));\n\n        this.set('problem', {\n            name: null,\n            details: null\n        });\n\n        // Attach to beforeunload event to get instrumentation on app shutdown\n        // Note: beforeunload listeners should not be attached via jquery\n        if (window && window.addEventListener) {\n            let reportStoppedInteraction = () => {\n                Ember.run(() => {\n                    // Inactive app integrations will have already been reported\n                    if (this._inAppInteraction()) {\n                        this._appendAppInteraction('windowUnload', true);\n                    }\n                });\n            };\n            this.set('reportStoppedInteraction', reportStoppedInteraction);\n            window.addEventListener('beforeunload', reportStoppedInteraction);\n        }\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n\n        let timeout = this.get('_stateTimeoutTimer');\n        if (timeout) {\n            run.cancel(timeout);\n            this.set('_stateTimeoutTimer', null);\n        }\n\n        let reportStoppedInteraction = this.get('reportStoppedInteraction');\n        if (reportStoppedInteraction) {\n            window.removeEventListener('beforeunload', reportStoppedInteraction);\n        }\n    },\n\n    appId: computed('app.id', function () {\n        let appId = this.get('app.id');\n\n        return appId || null;\n    }),\n\n    start() {\n        this._startAppInteraction('start');\n        this._advanceState(APP_STATES.LOADING);\n        this.set('lastUserAccessTimestamp', Date.now());\n    },\n\n    loaded() {\n        this._advanceState(APP_STATES.BOOTSTRAPPING);\n    },\n\n    bootstrapped() {\n        this._advanceState(APP_STATES.RUNNING);\n    },\n\n    focus() {\n        this._startAppInteraction('focus');\n        this.set('lastUserAccessTimestamp', Date.now());\n\n        if (this.get('app.lifecycle.hooks.focus')) {\n            this._triggerLifecycleHookEvent(LIFECYCLE_HOOKS.FOCUS);\n        }\n    },\n\n    blur() {\n        this.set('lastUserAccessTimestamp', Date.now());\n\n        if (this.get('app.lifecycle.hooks.blur')) {\n            this._triggerLifecycleHookEvent(LIFECYCLE_HOOKS.BLUR);\n        }\n\n        this._appendAppInteraction('blur', true);\n    },\n\n    stop() {\n        this._advanceState(APP_STATES.STOPPING);\n    },\n\n    stopped() {\n        this._advanceState(APP_STATES.STOPPED);\n    },\n\n    setProblem(name, details = null) {\n        this.set('problem.name', name);\n        this.set('problem.details', details);\n        this.notifyPropertyChange('problem');\n    },\n\n    _advanceState(requestedState) {\n        let currState = this.get('currState');\n        if (!requestedState || requestedState.compareTo(currState) <= 0) {\n            // Invalid next state\n            return;\n        }\n\n        // if monitoring ... cancel\n        let timeout = this.get('_stateTimeoutTimer');\n        if (timeout) {\n            run.cancel(timeout);\n            this.set('_stateTimeoutTimer', null);\n        }\n\n        let requestedStateConfig = STATE_CONFIGS[requestedState];\n        let nextState = this._getNextState(requestedState);\n\n        if (\n            requestedStateConfig.lifecycleDetails &&\n            requestedStateConfig.lifecycleDetails.stateOptInPropName &&\n            !this.get(`app.lifecycle.${requestedStateConfig.lifecycleDetails.stateOptInPropName}`) &&\n            nextState\n        ) {\n            // App doesn't need this transitional state ... move to the next\n\n            this._advanceState(nextState);\n            return;\n        }\n\n        this.set('currState', requestedState);\n        this.set('_currStateStartTimestamp', Date.now());\n\n        if (this._inAppInteraction()) {\n            this._appendAppInteraction(\n                this._convertStateToLifecycleEvent(requestedState),\n                requestedState === APP_STATES.STOPPED\n            );\n        } else if (requestedState === APP_STATES.STOPPED) {\n            // Because an app will likely be hidden when stopped, there is no\n            // active interaction; however, this event represents a user dismissing\n            // an app (updated/deleted) or a pool eviction; so it's important to log\n            this._logInactiveAppStopped();\n        }\n\n        if (requestedStateConfig.lifecycleDetails) {\n            if (requestedStateConfig.lifecycleDetails.broadcastHookName) {\n                this._triggerLifecycleHookEvent(requestedStateConfig.lifecycleDetails.broadcastHookName);\n            }\n\n            if (requestedStateConfig.lifecycleDetails.maxDurationMillis) {\n                // Start transitional state timeout\n                this.set(\n                    '_stateTimeoutTimer',\n                    run.later(\n                        this,\n                        '_monitorTransitionalState',\n                        requestedStateConfig.lifecycleDetails.maxDurationMillis + 1\n                    )\n                );\n            }\n        }\n    },\n\n    _triggerLifecycleHookEvent(hook) {\n        this.trigger(LIFECYCLE_HOOK_EVENT, {\n            hook\n        });\n    },\n\n    _monitorTransitionalState() {\n        if (this.isDestroying || this.isDestroyed) {\n            return;\n        }\n\n        let currState = this.get('currState');\n        let currStateConfig = STATE_CONFIGS[currState];\n        let nextState = this._getNextState(currState);\n        let currStateEntryTimestamp = this.get('_currStateStartTimestamp');\n        let maxDuration = currStateConfig ? get(currStateConfig, 'lifecycleDetails.maxDurationMillis') : undefined;\n\n        if (currStateConfig && currStateEntryTimestamp !== null && maxDuration) {\n            let timeInState = Date.now() - currStateEntryTimestamp;\n\n            if (timeInState < maxDuration) {\n                // Should not occur, but will re-kick the timer to wait until the state has expired\n                this.set('_stateTimeoutTimer', run.later(this, '_monitorTransitionalState', 100));\n            } else if (nextState) {\n                // The transitional state has expired and can be moved to the next state\n                this._advanceState(nextState);\n            }\n        }\n    },\n\n    _getNextState(currState) {\n        let result = null;\n\n        let currStateIndex = _.findIndex(LIFECYCLE_ORDERED_APP_STATES, currState);\n        if (currStateIndex >= 0 && LIFECYCLE_ORDERED_APP_STATES.length > currStateIndex + 1) {\n            result = LIFECYCLE_ORDERED_APP_STATES[currStateIndex + 1];\n        }\n\n        return result;\n    },\n\n    // Instrumentation\n    _interactionStartTimestamp: null,\n    _latestInteractionTimestamp: null,\n    _inAppInteraction() {\n        return !!this.get('_interactionStartTimestamp');\n    },\n    _startAppInteraction(lifecycleEvent) {\n        let startTimestamp = Date.now();\n        this.set('_interactionStartTimestamp', startTimestamp);\n        this.set('_latestInteractionTimestamp', startTimestamp);\n\n        this._logAppInteraction(lifecycleEvent, {\n            interactionStart: startTimestamp\n        });\n    },\n    _appendAppInteraction(lifecycleEvent, complete) {\n        let startTimestamp = this.get('_interactionStartTimestamp');\n        if (!startTimestamp) {\n            Ember.Logger.error('Attempted to append to an unknown app interaction');\n            return;\n        }\n\n        let now = Date.now();\n        let interactionDetails = {\n            interactionStart: startTimestamp,\n            timeSinceInteractionStart: now - startTimestamp,\n            timeSincePrevInteraction: now - this.get('_latestInteractionTimestamp')\n        };\n\n        if (complete) {\n            interactionDetails.interactionEnd = now;\n            interactionDetails.interactionDuration = now - startTimestamp;\n            this.set('_interactionStartTimestamp', null);\n            this.set('_latestInteractionTimestamp', null);\n        } else {\n            this.set('_latestInteractionTimestamp', Date.now());\n        }\n\n        this._logAppInteraction(lifecycleEvent, interactionDetails);\n    },\n    /**\n     * logs an app shutdown as a single pageAction regardless of interaction\n     * state due to the importance of this event.  Usually, this will be\n     * the result of a user dismissal (update/deleted app) or pool\n     * eviction.\n     */\n    _logInactiveAppStopped() {\n        let now = Date.now();\n        this._logAppInteraction(this._convertStateToLifecycleEvent(APP_STATES.STOPPED), {\n            interactionStart: now,\n            timeSinceInteractionStart: 0,\n            timeSincePrevInteraction: 0,\n            interactionEnd: now,\n            interactionDuration: 0\n        });\n    },\n    _logAppInteraction(lifecycleEvent, interactionDetails) {\n        let commonAttrs = {\n            lifecycleEvent,\n            pcAppTypeId: this.get('app.typeId'),\n            pcAppId: this.get('appId'),\n            pcAppInstanceId: this.get('instanceId'),\n            pcAppDisplayType: this.get('app.displayType'),\n            pcAppInternallyHosted: this.get('app') instanceof InternallyHostedApp,\n            pcAppFeatureCategory: this.get('app.featureCategory'),\n            pcAppProblemName: this.get('problem.name'),\n            interactionId: this.get('app.interactionId')\n        };\n        for (const queryParam of this.get('app').getURLTemplateQueryParams()) {\n            commonAttrs[`${queryParam}UrlReplacement`] = true;\n        }\n        addPageAction('clientAppInteraction', _.merge({}, interactionDetails, commonAttrs));\n    },\n    _convertStateToLifecycleEvent(appState) {\n        switch (appState) {\n            case APP_STATES.LOADING:\n                return 'loading';\n            case APP_STATES.BOOTSTRAPPING:\n                return 'bootstrapping';\n            case APP_STATES.RUNNING:\n                return 'running';\n            case APP_STATES.STOPPING:\n                return 'stopping';\n            case APP_STATES.STOPPED:\n                return 'stopped';\n            default:\n                return 'unknownAppState';\n        }\n    }\n});\n\nexport default AppInstance;\n","import Ember from 'ember';\nimport { isAbortError, isAjaxError } from 'ember-ajax/errors';\nimport { task, timeout } from 'ember-concurrency';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport find from 'lodash/find';\nimport findIndex from 'lodash/findIndex';\nimport isEqual from 'lodash/isEqual';\nimport merge from 'lodash/merge';\nimport omitBy from 'lodash/omitBy';\nimport orderBy from 'lodash/orderBy';\nimport reduce from 'lodash/reduce';\nimport { addPageAction } from '../utils/newrelic';\nimport AppInstance, { APP_PROBLEMS, APP_STATES } from './app-instance';\n\nconst { computed, RSVP } = Ember;\n\n/**\n * An AppPool manages a collection of apps, appInstances, and their lifecycles.  This object must\n * be used in conjuction with an app-pool component to handle the rendering lifecycle\n * of the appInstances.  Because it handles lifecycles and is render aware, it should also\n * be used for ephemeral apps that need lifecycle hooks called.\n *\n * If a getMaxActive size is set, then the pool will limit the number of concurrent\n * apps; however, apps transitioning into/out of active state will still be\n * included in renderedApps and must still be rendered to the dom to afford the\n * apps time to boot and shutdown appropriately.\n *\n * Top level pool state such as app loading state, if an app is being shown, or\n * if a requested app is unavailable will be represented in currState and the\n * details will contain applicable details.\n *\n * Individual app state such as loading, bootstrapping, app config changes,\n * runtime problems, etc. will be stored in the instance.\n *\n * Only one instance of an app can be \"active\" (loading, booting, or running)\n * at a given time; however, there may be other instances of the same app that are\n * transitioning out of the pool (e.g. stopping, stopped).\n *\n * Top-level Pool States\n *\n * LOADING - Apps are being loaded for the first time or a load failure is being\n *  retried.  Note that this state is NOT re-entered when apps are periodically\n *  refreshed; Instead, the pool will merge running apps behind the scenes.  See\n *  the AppInstance model for details.\n *  {\n *    loadRetryAttempt: true|false, // Indicates that this is an initial load retry attempt\n *    autoAttempt: true|false, // The loading request was made automatically by the pool\n *  }\n *\n * LOAD_FAILED - Initial load of the pool failed.  This state is recoverable\n *  automatically if loadRetryBaseMillis is configured or manually via the\n *  reloadApps call.  If an app was previously\n *  attempted to be shown, that state will attempt to be restored if the load\n *  eventually succeeds.\n *\n *  This state will not occur if a reloadApps fails after a successful init.  In\n *  this case, the pool will remain with the existing apps until a successful\n *  reload.\n *\n *  {\n *      loadRetryScheduled: true|false\n *  }\n *\n * IDLE - Apps are successfully loaded, but no app is being used\n *  null - No Details\n *\n * APP_NOT_FOUND - The requested app is not known to this pool\n *  {\n *      appId: <id> // The attempted app Id\n *  }\n *\n * ALLOCATING_SPACE - Space is being made for the requested instance\n *  {\n *    // the pending instance's details\n *    appId: app.id,\n *    instanceId: pendingInstance.instanceId,\n *    instance: pendingInstance\n *  }\n *\n * SHOWING_APP - An app is active.  Note: App may be loading or have a problem.\n *  @see {app-instance} for the enumerated states of an instance\n *  {\n *    // active instance details\n *    appId: app.id,\n *    instanceId: pendingInstance.instanceId,\n *    instance: pendingInstance\n *  }\n *\n * ALLOCATION_FAILED - Space could not be made for the requested instance\n *  {\n *    // the failed instance's details\n *    appId: app.id,\n *    app\n *  }\n *\n * Events:\n *  appPoolReloaded - Triggered when this pool's apps have been reloaded either\n *      manually or via a scheduled refresh\n *\n * @see {app-instance} For details on lifecylce, hooks, events, etc.\n */\n\nexport const APPS_RELOADED_EVENT = 'appPoolReloaded';\n\nexport const POOL_STATES = {\n    IDLE: 'idle',\n    LOADING: 'loading',\n    APP_NOT_FOUND: 'appNotFound',\n    ALLOCATING_SPACE: 'allocating',\n    SHOWING_APP: 'showingApp',\n    ALLOCATION_FAILED: 'allocationFailed',\n    LOAD_FAILED: 'loadFailed'\n};\n\nconst AppPool = Ember.Object.extend(Ember.Evented, LoggerMixin, {\n    // Public params\n    /**\n     * Optional, dev-friendly pool name used for logging purposes.\n     */\n    poolName: null,\n\n    /**\n     * A function that returns the maximum number of concurrent running\n     * apps (does not include apps shutting down). The app pool size is not dynamic and\n     * will not properly respond to changing the value this function returns.\n     */\n    getMaxActive: null,\n    /**\n     * Function to fetch apps for this pool.  Must return a Promise.  Will be used\n     * to load and refresh the pool.\n     */\n    fetchAppsFn: null,\n\n    /**\n     * Base millis for incremental backoff retries (with jitter) of initial apps load failures.\n     * Set <= 0 to disable auto retry and allow manual retry.\n     */\n    loadRetryBaseMillis: -1,\n\n    /**\n     * Max base millis to use in the initial apps load retry backoff.  If not specified,\n     * retry will grow without bound.  If specified and reached, retry will be\n     * loadRetryMaxBackoffMillis + random([0, .1loadRetryMaxBackoffMillis]).\n     */\n    loadRetryMaxBackoffMillis: -1,\n\n    /**\n     * Millis to wait until refreshing the list of apps in the pool.\n     * Apps will be smartly merged per logic in reloadApps.\n     */\n    reloadAppsIntervalMillis: -1,\n\n    /**\n     * Base millis for exponential backoff of reload retries if the initial interval attempt fails.\n     * Full jitter will be applied until reloadAppsIntervalMillis is hit.  Once reached,\n     * retry will be reloadAppsIntervalMillis + random([0, .1reloadAppsIntervalMillis]).\n     */\n    reloadAppsRetryBaseMillis: 1000,\n\n    /**\n     * The number of millis to wait between checks for stopped instances.\n     *\n     * Primarily configurable for testing purposes.\n     */\n    stoppedInstanceRemovalInterval: 500,\n\n    // Public Props\n    currState: {\n        name: null,\n        details: null\n    },\n    /**\n     * A list of app instances whose iframe elements MUST be rendered.\n     * This list will include transitional apps and, therefore, is not suitable to query\n     * for which apps are actively being used by the user.\n     */\n    renderedAppInstances: computed.alias('_renderedInstances'),\n\n    // Private Props\n    _loadAppsPromise: null, // Holds the initial apps load promise (and reload promise if the initial load fails)\n    _showFailureRestoreAppId: null, // Holds attempted show appId in case the load fails and needs reloaded\n    _loadRetryAttempts: 0, // Holds the number of load retry attempts (Used to calculate backoff)\n    _loadRetryScheduled: computed.bool('_loadRetryTask.isRunning'), // Computed indicating if a retry is scheduled\n\n    _reloadFailureCount: 0, // Failure attempts since last successful reload\n\n    skipLongRunningTasks: false,\n\n    appAttentionCounts: computed('_renderedInstances.[]', '_renderedInstances.@each.attentionCount', function () {\n        let counts = Ember.Object.create({});\n        let runningInstances = this._searchInstances(this.get('_renderedInstances'), {\n            appId: null,\n            maxState: APP_STATES.RUNNING\n        });\n\n        runningInstances.forEach(currInstance => {\n            counts.set(currInstance.get('app.id'), currInstance.get('attentionCount'));\n        });\n\n        return counts;\n    }),\n\n    totalAttentionCount: computed('appAttentionCounts', function () {\n        let keys = Object.keys(this.get('appAttentionCounts'));\n        let sum = 0;\n        keys.forEach(key => {\n            sum += this.get(`appAttentionCounts.${key}`);\n        });\n        return sum;\n    }),\n\n    init() {\n        this._super(...arguments);\n        this.setProperties({\n            _apps: [],\n            _renderedInstances: [],\n            currState: {\n                name: null,\n                details: null\n            },\n            _fetchFailureLog: {\n                abortedCount: 0,\n                endpointFailureCount: 0\n            }\n        });\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n\n        let instances = this.get('_renderedInstances');\n        if (instances && instances.length > 0) {\n            instances.forEach(currInstance => {\n                if (currInstance && !currInstance.isDestroying && !currInstance.isDestroyed) {\n                    currInstance.destroy();\n                }\n            });\n        }\n    },\n\n    /**\n     * Returns a promise resolving with the list of loaded apps or rejected due to load failure\n     */\n    findAllApps() {\n        return this._loadApps().then(() => {\n            return this.get('_apps');\n        });\n    },\n\n    /**\n     * Returns a promise that will be resolved with the newly shown instance if successful\n     * or rejected if the show operation could not be performed (See pool failure states)\n     */\n    showApp(appId) {\n        return this._findApp(appId)\n            .then(app => {\n                let [existingInstance] = this._searchInstances(this.get('_renderedInstances'), {\n                    appId,\n                    maxState: APP_STATES.RUNNING\n                });\n\n                return new RSVP.Promise(resolve => {\n                    if (existingInstance) {\n                        existingInstance.focus();\n\n                        this._setState(POOL_STATES.SHOWING_APP, {\n                            appId,\n                            instanceId: existingInstance.instanceId,\n                            instance: existingInstance\n                        });\n\n                        resolve(this.get('currState'));\n                    } else {\n                        resolve(this._allocateNewInstance(app));\n                    }\n                });\n            })\n            .catch(reason => {\n                if (reason && typeof reason === 'object' && Object.prototype.hasOwnProperty.call(reason, 'name')) {\n                    // A promise already rejected with state\n\n                    if (reason.name === POOL_STATES.LOAD_FAILED) {\n                        // store the attempted appId here incase the user wants to reload\n                        this.set('_showFailureRestoreAppId', appId);\n                    }\n\n                    // reject it on through\n                    return RSVP.reject(reason);\n                } else {\n                    this._setState(POOL_STATES.APP_NOT_FOUND, {\n                        appId\n                    });\n\n                    return RSVP.reject(this.get('currState'));\n                }\n            });\n    },\n\n    /**\n     * Hides the specified running instance, sets it's last used ts, and sets the pool to idle\n     *\n     * @returns a promise that will be resolved with the hidden instance\n     * details or rejected if the instance could not be found, was not running,\n     * or was not shown.\n     * (See pool failure states)\n     */\n    hideApp(instanceId) {\n        return this._loadApps().then(() => {\n            if (!instanceId) {\n                return RSVP.reject(this.get('currState'));\n            }\n\n            let [runningInstance] = this._searchInstances(this.get('_renderedInstances'), {\n                instanceId,\n                maxState: APP_STATES.STOPPING\n            });\n\n            if (\n                runningInstance &&\n                this.get('currState.name') === POOL_STATES.SHOWING_APP &&\n                this.get('currState.details.instance.instanceId') === runningInstance.get('instanceId')\n            ) {\n                runningInstance.blur();\n                this._setState(POOL_STATES.IDLE);\n                return {\n                    appId: runningInstance.get('appId'),\n                    instanceId: runningInstance.instanceId,\n                    instance: runningInstance\n                };\n            } else {\n                return RSVP.reject(this.get('currState'));\n            }\n        });\n    },\n\n    /**\n     * Stops the specified running instance, if available.  The instance will\n     * still complete its lifecycle as configured.  The pool state will not be\n     * modified.\n     *\n     * @returns a promise that will be resolved with the stopped instance\n     * details or rejected if the instance could not be found or was not running.\n     * (See pool failure states)\n     */\n    stopApp(instanceId) {\n        return this._loadApps().then(() => {\n            if (!instanceId) {\n                return RSVP.reject(this.get('currState'));\n            }\n\n            let [runningInstance] = this._searchInstances(this.get('_renderedInstances'), {\n                instanceId,\n                maxState: APP_STATES.RUNNING\n            });\n\n            if (runningInstance) {\n                runningInstance.stop();\n\n                this._monitorAppLifecycles();\n\n                return {\n                    appId: runningInstance.get('appId'),\n                    instanceId: runningInstance.instanceId,\n                    instance: runningInstance\n                };\n            } else {\n                return RSVP.reject(this.get('currState'));\n            }\n        });\n    },\n\n    /**\n     * Reattempt a failed app load or fetch and merge latest apps with current apps.\n     * Note: if the pool is configured for auto-reload attempts on failure, calling this\n     * manually while in a LOAD_FAILED state will have no effect and always reject\n     * with LOAD_FAILED status.\n     *\n     * If an instance is running and its backing app is updated/removed, the current\n     * app version will be used/retained.  Once the app instance is no longer running,\n     * (i.e. the user confirms removal) a subsequent reloadApps call will\n     * replace/remove the app.\n     *\n     * @returns a promise which resolves/rejects with the current pool state.  Note that\n     * the promise may reject but the pool state will be a success state.  This indicates\n     * that the reload failed, but the existing apps are still being used.\n     */\n    reloadApps() {\n        return this._reloadApps();\n    },\n\n    /**\n     * Helper method to differentiate internal and external requests\n     *\n     * @private\n     */\n    _reloadApps(internalLoadRetry = false) {\n        return this._loadApps()\n            .then(() => {\n                // Fetch current apps and overlay with any running, existing apps\n                return this.__fetchApps().then(latestApps => {\n                    let mergedApps = [];\n\n                    this._searchInstances(this.get('_renderedInstances'), {\n                        appId: null,\n                        maxState: APP_STATES.RUNNING\n                    }).forEach(runningInstance => {\n                        let newApp = find(latestApps, { id: runningInstance.get('appId') });\n\n                        let problem = null;\n                        if (!newApp) {\n                            problem = APP_PROBLEMS.APP_DELETED;\n                        } else if (!isEqual(newApp, runningInstance.app)) {\n                            problem = APP_PROBLEMS.APP_UPDATED;\n                        }\n\n                        if (problem) {\n                            // App has been removed or changed, keep the existing until\n                            // the user shuts down the running app\n                            runningInstance.setProblem(problem);\n                            mergedApps.push(runningInstance.app);\n                        }\n                    });\n\n                    // Add all latestApps that have not been overridden by current apps\n                    latestApps.forEach(currNewApp => {\n                        if (findIndex(mergedApps, { id: currNewApp.id }) < 0) {\n                            mergedApps.push(currNewApp);\n                        }\n                    });\n\n                    this.set('_apps', mergedApps);\n\n                    return this.get('currState');\n                });\n            })\n            .catch(reason => {\n                if (\n                    reason &&\n                    reason.name &&\n                    reason.name === POOL_STATES.LOAD_FAILED &&\n                    (!this.get('_loadRetryScheduled') || internalLoadRetry)\n                ) {\n                    // Initial load previously failed\n                    // OK to retry; this is an manual or internal, automatic reload request\n                    // Reload success will be broadcast in handler below or pass rejection/pool state on through\n                    return this._loadApps(true, internalLoadRetry);\n                }\n\n                // Failed on subsequent app reload\n                // Leave the current pool-state and/or apps alone and just reject this function's promise\n                return RSVP.reject(this.get('currState'));\n            })\n            .then(loadResult => {\n                this.trigger(APPS_RELOADED_EVENT);\n\n                let restoreAppId = this.get('_showFailureRestoreAppId');\n                if (restoreAppId) {\n                    // reload attempt succeeded; retry appId one more time\n                    this.set('_showFailureRestoreAppId', null);\n\n                    return this.showApp(restoreAppId);\n                } else {\n                    return loadResult;\n                }\n            });\n    },\n\n    _setState(name, details = null) {\n        this.set('currState.name', name);\n        this.set('currState.details', details);\n        this.notifyPropertyChange('currState');\n        this._logPoolEvent('stateUpdate');\n    },\n\n    _findApp(appId) {\n        return this._loadApps().then(() => {\n            let app = find(this.get('_apps'), { id: appId });\n            return app || RSVP.reject('appNotFound');\n        });\n    },\n\n    /**\n     * Singleton initial load of apps.  All calls wait on this initial load\n     * to ensure a base state of the pool (loaded or failure).\n     *\n     * LOAD SUCCESS:\n     * Sets the pool state to idle and will initiate automatic app refresh\n     * if the pool owner has configured it via reloadAppsIntervalMillis.  If the\n     * owner has not configured automatic refresh, it can be manually triggered\n     * via reloadApps.\n     *\n     * LOAD FAILURE:\n     * In the event of load failure, load can be retried by passing true for\n     * the forceReload argument. Note that forceReload will still only allow\n     * one concurrent reload call. The pool can be configured to automatically\n     * attempt reloads via loadRetryBaseMillis.\n     *\n     * @private\n     */\n    _loadApps(forceReload = false, autoLoadRetry = false) {\n        this.logger.debug('app-pool:_loadApps', { remoteData: { forceReload, autoLoadRetry } });\n        let result = this.get('_loadAppsPromise');\n\n        if (result === null || (forceReload && this.get('currState.name') === POOL_STATES.LOAD_FAILED)) {\n            this._setState(POOL_STATES.LOADING, {\n                loadRetryAttempt: forceReload,\n                autoAttempt: autoLoadRetry\n            });\n            this.set(\n                '_loadAppsPromise',\n                (result = this.__fetchApps()\n                    .then(apps => {\n                        this.logger.debug('app-pool:_loadApps __fetchApps succeeded', {\n                            apps,\n                            remoteData: { apps: apps.map(app => app.get('id')) }\n                        });\n                        this.set('_apps', apps);\n                        this._setState(POOL_STATES.IDLE);\n                        if (!this.get('skipLongRunningTasks')) {\n                            this._scheduleAppReload();\n                        }\n                        return this.get('currState');\n                    })\n                    .catch(e => {\n                        this.logger.debug('app-pool:_loadApps __fetchApps threw exception', e);\n                        let autoRetry = this.get('loadRetryBaseMillis') > 0;\n                        this._setState(POOL_STATES.LOAD_FAILED, {\n                            loadRetryScheduled: autoRetry\n                        });\n                        if (autoRetry) {\n                            this._retryInitialAppLoad();\n                        }\n                        return RSVP.reject(this.get('currState'));\n                    }))\n            );\n        }\n\n        return result;\n    },\n\n    /**\n     * Schedules an app load retry in the future based on attempt state (backoff, jitter, etc.)\n     *\n     * @private\n     */\n    _retryInitialAppLoad() {\n        let retryBase = this.get('loadRetryBaseMillis');\n        if (retryBase > 0) {\n            // pool owner requested automatic retry\n            let retryAttempts = this.incrementProperty('_loadRetryAttempts');\n\n            let retryInterval = retryBase * Math.pow(2, retryAttempts - 1);\n\n            let maxRetryDuration = this.get('loadRetryMaxBackoffMillis');\n            if (maxRetryDuration > 0 && retryInterval >= maxRetryDuration) {\n                // Max specified and reached; use max and a little jitter\n                retryInterval = maxRetryDuration + Math.floor(Math.random() * (maxRetryDuration * 0.1));\n            } else {\n                // Standard retry, Using \"full jitter\"\n                retryInterval = Math.floor(Math.random() * retryInterval);\n            }\n\n            this.get('_loadRetryTask').perform(retryInterval);\n        }\n    },\n\n    _loadRetryTask: task(function* (retryInterval) {\n        let timeoutVal = retryInterval;\n        this.logger.debug('app-pool:_loadRetryTask Pausing before retry', { remoteData: { timeoutVal } });\n        yield timeout(timeoutVal);\n        try {\n            yield this._reloadApps(true);\n        } catch (e) {\n            let abortedAttempts = this.get('_fetchFailureLog.abortedCount');\n            let endpointAttempts = this.get('_fetchFailureLog.endpointFailureCount');\n            if (abortedAttempts + endpointAttempts === 6) {\n                const msg =\n                    'Apps Initial load and 5 retry attempts failed. Continuing to retry but should be investigated';\n                Ember.Logger.warn(this._decorateLogStatement(msg), {\n                    remoteData: { abortedAttempts, endpointAttempts }\n                });\n            }\n        }\n    }),\n\n    /**\n     * Handles scheduling, rescheduling, and backoff of app refreshes per pool config\n     *\n     * @private\n     */\n    _scheduleAppReload() {\n        let reloadInterval = this.get('reloadAppsIntervalMillis');\n        this.logger.debug('app-pool:_scheduleAppReload', { remoteData: { reloadInterval } });\n        if (reloadInterval > 0) {\n            // pool owner requested automatic refresh\n\n            let reloadWait = reloadInterval;\n\n            let reloadFailureCount = this.get('_reloadFailureCount');\n            this.logger.debug('app-pool:_scheduleAppReload', { remoteData: { reloadFailureCount } });\n            if (reloadFailureCount > 0) {\n                // Previous reload failed; backoff and retry\n                reloadWait = Math.min(\n                    reloadInterval,\n                    this.get('reloadAppsRetryBaseMillis') * Math.pow(2, reloadFailureCount - 1)\n                );\n                if (reloadWait === this.get('reloadAppsIntervalMillis')) {\n                    // Max reached; use max and a little jitter\n                    reloadWait += Math.floor(Math.random() * (reloadWait * 0.1));\n                } else {\n                    // Standard retry, Using \"full jitter\"\n                    reloadWait = Math.floor(Math.random() * reloadWait);\n                }\n            }\n            this.logger.debug('app-pool:_scheduleAppReload Kicking off reloadTimer', { remoteData: { reloadWait } });\n            this.get('_reloadTimerTask').perform(reloadWait);\n        }\n    },\n\n    _reloadTimerTask: task(function* (reloadWait) {\n        yield timeout(reloadWait);\n        try {\n            yield this.reloadApps();\n            this.set('_reloadFailureCount', 0);\n        } catch (e) {\n            this.incrementProperty('_reloadFailureCount');\n            if (this.get('_fetchFailureLog.endpointFailureCount') === 6) {\n                Ember.Logger.warn(\n                    this._decorateLogStatement(\n                        'Apps Reload and 5 retry attempts failed. Continuing to retry but should be investigated'\n                    )\n                );\n            } else if (this.get('_fetchFailureLog.abortedCount') === 11) {\n                Ember.Logger.info(\n                    this._decorateLogStatement(\n                        'Apps Reload and 10 retry attempts have been cancelled. This could indicate a lost network connection or CORS issue. Continuing to retry but should be investigated'\n                    )\n                );\n            }\n        } finally {\n            if (!this.get('skipLongRunningTasks')) {\n                this._scheduleAppReload();\n            }\n        }\n    }),\n\n    /**\n     * Internal utility to fetch the apps via the fetchAppsFn\n     *\n     * Important Note: __fetchApps will fetch regardless of pool state.  It is free of side effects,\n     * but will be wasteful if invoked at the wrong state of the pool.  Specifically,\n     * it is only applicable (and should only be called) during the initial apps\n     * load, load failure retries, and apps reloads after successful, initial load\n     * has occurred.\n     *\n     * @returns A promise that resolves with the list of apps or rejects with the reason\n     *\n     * @private\n     */\n    __fetchApps() {\n        return new RSVP.Promise((resolve, reject) => {\n            this.logger.debug('app-pool:__fetchApps entry');\n            let fetchAppsFn = this.get('fetchAppsFn');\n            if (typeof fetchAppsFn !== 'function') {\n                Ember.Logger.error(this._decorateLogStatement('No/Invalid App Fetch function'));\n                reject('badFetchFunction');\n            } else {\n                try {\n                    fetchAppsFn()\n                        .then(apps => {\n                            this.logger.debug('app-pool:__fetchApps fetchAppsFn returned', apps);\n                            this.set('_fetchFailureLog.abortedCount', 0);\n                            this.set('_fetchFailureLog.endpointFailureCount', 0);\n\n                            if (!Array.isArray(apps)) {\n                                Ember.Logger.error(\n                                    this._decorateLogStatement('Invalid App Fetch Payload. Expected Array.'),\n                                    { remoteData: { typeOfApps: Ember.typeOf(apps) } }\n                                );\n                                reject('invalidFetchPayload');\n                            } else {\n                                resolve(apps);\n                            }\n                        })\n                        .catch(reason => {\n                            this.logger.debug('app-pool:__fetchApps apps fetch failed', reason);\n                            if (isAjaxError(reason) && isAbortError(reason)) {\n                                // Skipping logging to avoid flooding sumo with false positives related to the browser sleeping.\n                                // Will log excessive cancelled retries which might indicate a cors issue\n                                this.incrementProperty('_fetchFailureLog.abortedCount');\n                                reject('abortedRequest');\n                            } else {\n                                Ember.Logger.info(this._decorateLogStatement('App fetch request failed.'), { reason });\n                                this.incrementProperty('_fetchFailureLog.endpointFailureCount');\n                                reject('endpointFailure');\n                            }\n                        });\n                } catch (error) {\n                    Ember.Logger.error(this._decorateLogStatement('Failed to invoke App Fetch function.'), { error });\n                    reject('fetchFunctionRuntimeError');\n                }\n            }\n        });\n    },\n\n    _allocateNewInstance(app) {\n        let pendingInstance = AppInstance.create({\n            app\n        });\n\n        this._setState(POOL_STATES.ALLOCATING_SPACE, {\n            appId: app.id,\n            instanceId: pendingInstance.instanceId,\n            instance: pendingInstance\n        });\n\n        return new RSVP.Promise((resolve, reject) => {\n            this._allocateSpace()\n                .then(() => {\n                    // Room at the inn\n                    pendingInstance.start();\n                    this.get('_renderedInstances').pushObject(pendingInstance);\n\n                    this._setState(POOL_STATES.SHOWING_APP, {\n                        appId: app.id,\n                        instanceId: pendingInstance.instanceId,\n                        instance: pendingInstance\n                    });\n\n                    resolve(this.get('currState'));\n                })\n                .catch(() => {\n                    pendingInstance.destroy();\n\n                    this._setState(POOL_STATES.ALLOCATION_FAILED, {\n                        appId: app.id,\n                        app\n                    });\n\n                    reject(this.get('currState'));\n                });\n        });\n    },\n\n    _allocateSpace() {\n        let getMaxActive = this.get('getMaxActive');\n        if (getMaxActive) {\n            let renderedInstances = this.get('_renderedInstances');\n\n            let existingInstances = this._searchInstances(renderedInstances, {\n                appId: null,\n                maxState: APP_STATES.RUNNING\n            });\n\n            if (existingInstances.length >= getMaxActive()) {\n                // Make way\n                let sortedInstances = orderBy(\n                    existingInstances,\n                    ['app.lifecycle.ephemeral', 'lastUserAccessTimestamp'],\n                    ['desc', 'asc']\n                );\n\n                let instanceToEvict = sortedInstances[0];\n                instanceToEvict.stop();\n                this._logPoolEvent('eviction', { evictedAppId: instanceToEvict.get('appId') });\n                this._monitorAppLifecycles();\n            }\n        }\n\n        return RSVP.resolve();\n    },\n\n    _searchInstances(instances, { instanceId = null, appId = null, states = [], maxState = null } = {}) {\n        let result = [];\n\n        if (instances && Array.isArray(instances) && instances.length > 0) {\n            if (states && Array.isArray(states) && states.length > 0) {\n                result = instances.filter(currInstance => {\n                    let instanceState = currInstance.get('currState');\n                    return states.indexOf(instanceState) >= 0;\n                });\n            } else if (maxState) {\n                result = instances.filter(currInstance => {\n                    let currInstanceState = currInstance.get('currState');\n                    return maxState.compareTo(currInstanceState) >= 0;\n                });\n            } else {\n                result = instances;\n            }\n\n            if (instanceId) {\n                let specificInstance = find(result, { instanceId });\n                result = specificInstance ? [specificInstance] : [];\n            } else if (appId) {\n                result = result.filter(instance => appId === instance.get('appId'));\n            }\n        }\n\n        return result;\n    },\n\n    _monitorAppLifecycles() {\n        if (this._removeStopped() && !this.get('skipLongRunningTasks')) {\n            this.get('_monitorAppLifecyclesTask').perform();\n        }\n    },\n\n    _monitorAppLifecyclesTask: task(function* () {\n        yield timeout(this.get('stoppedInstanceRemovalInterval'));\n        this._monitorAppLifecycles();\n    }),\n\n    _removeStopped() {\n        let renderedInstances = this.get('_renderedInstances');\n\n        let stoppedInstances = this._searchInstances(renderedInstances, {\n            states: [APP_STATES.STOPPED]\n        });\n        stoppedInstances.forEach(currInstance => {\n            currInstance.destroy();\n            renderedInstances.removeObject(currInstance);\n        });\n\n        return (\n            this._searchInstances(renderedInstances, {\n                states: [APP_STATES.STOPPING]\n            }).length > 0\n        );\n    },\n\n    _decorateLogStatement(logText) {\n        let prefix = 'AppPool';\n        let poolName = this.get('poolName');\n        if (poolName && Ember.typeOf(poolName) === 'string') {\n            prefix += ` (${poolName})`;\n        }\n\n        return `${prefix}: ${logText}`;\n    },\n\n    _logPoolEvent(poolEvent, poolEventDetails = {}) {\n        const getMaxActive = this.get('getMaxActive');\n        const attrs = {\n            poolEvent,\n            poolName: this.get('poolName'),\n            poolState: this.get('currState.name'),\n            maxPoolSize: getMaxActive && getMaxActive(),\n            renderedApps: this.get('renderedAppInstances.length'),\n            totalAttentionCount: this.get('totalAttentionCount')\n        };\n\n        // Only grab primitive fields from the current pool state details\n        // to avoid trying to send NR full app/app-instance models\n        const primitivePoolStateDetails = omitBy(\n            this.get('currState.details'),\n            prop => prop && typeof prop === 'object'\n        );\n        const poolStateDetails = reduce(\n            primitivePoolStateDetails,\n            (acc, val, key) => {\n                acc[`poolState.${key}`] = val;\n                return acc;\n            },\n            {}\n        );\n\n        addPageAction('clientAppPoolEvent', merge({}, poolEventDetails, poolStateDetails, attrs));\n    }\n});\n\nexport default AppPool;\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport appUtils from '../utils/apps';\n\nconst { Copyable, computed, copy, getOwner, typeOf, isPresent } = Ember;\n\nconst LIFECYCLE_DEFAULTS = {\n    ephemeral: false,\n    hooks: {\n        bootstrap: false,\n        focus: false,\n        blur: false,\n        stop: false\n    }\n};\n\nexport const DISPLAY_TYPES = {\n    STANDALONE: 'standalone',\n    WIDGET: 'widget',\n    INTERAPPTION: 'interactionWidget'\n};\n\nexport const FEATURE_CATEGORIES = {\n    DIRECTORY: 'directory',\n    CONTACT_CENTER_INSIGHTS: 'contactCenterInsights'\n};\n\nexport const ASSET_CATEGORIES = ['icon', 'monochromicIcon'];\n\nconst URL_REPLACEMENT_PREFIX = '{{';\nconst URL_REPLACEMENT_SUFFIX = '}}';\n// PC\nconst LANG_TAG_URL_REPLACEMENT_VAR_NAME = 'pcLangTag';\nexport const LANG_TAG_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${LANG_TAG_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst PC_ENV_URL_REPLACEMENT_VAR_NAME = 'pcEnvironment';\nexport const PC_ENV_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${PC_ENV_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst PC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME = 'pcConversationId';\nexport const PC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${PC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME = 'pcUsePopupAuth';\nexport const USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\n// GC\nconst GC_LANG_TAG_URL_REPLACEMENT_VAR_NAME = 'gcLangTag';\nexport const GC_LANG_TAG_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_LANG_TAG_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_INTERACTION_ID_URL_REPLACEMENT_VAR_NAME = 'gcInteractionId';\nexport const GC_INTERACTION_ID_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_INTERACTION_ID_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME = 'gcConversationId';\nexport const GC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_INTERACTION_TYPE_URL_REPLACEMENT_VAR_NAME = 'gcInteractionType';\nexport const GC_INTERACTION_TYPE_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_INTERACTION_TYPE_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME = 'gcUsePopupAuth';\nexport const GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_HOST_ORIGIN_REPLACEMENT_VAR_NAME = 'gcHostOrigin';\nexport const GC_HOST_ORIGIN_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_HOST_ORIGIN_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_TARGET_ENV_REPLACEMENT_VAR_NAME = 'gcTargetEnv';\nexport const GC_TARGET_ENV_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_TARGET_ENV_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\n\nconst TOKEN_REPLACEMENTS = {\n    // PC\n    [LANG_TAG_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: LANG_TAG_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'langTag'\n    },\n    [PC_ENV_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: PC_ENV_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'envTld'\n    },\n    [PC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: PC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'interactionId'\n    },\n    [USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'usePopupAuth'\n    },\n    // GC\n    [GC_LANG_TAG_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_LANG_TAG_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'langTag'\n    },\n    [GC_INTERACTION_ID_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_INTERACTION_ID_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'interactionId'\n    },\n    [GC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME,\n        replacementValue: (interactionId, interactionType) => {\n            return interactionType === 'conversation' ? interactionId : '';\n        }\n    },\n    [GC_INTERACTION_TYPE_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_INTERACTION_TYPE_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'interactionType'\n    },\n    [GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'usePopupAuth'\n    },\n    [GC_HOST_ORIGIN_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_HOST_ORIGIN_REPLACEMENT_VAR_NAME,\n        replacementProp: 'gcHostOrigin'\n    },\n    [GC_TARGET_ENV_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_TARGET_ENV_REPLACEMENT_VAR_NAME,\n        replacementProp: 'gcTargetEnv'\n    }\n};\n\nconst URL_REPLACEMENTS = Object.entries(TOKEN_REPLACEMENTS).map(\n    ([replacementToken, { queryParamName, replacementProp, replacementValue }]) => {\n        return {\n            regExp: new RegExp(replacementToken, 'g'),\n            queryParamName,\n            replacementProp,\n            replacementValue\n        };\n    }\n);\n\nexport const INTERAPPTION_PRIMARY_MEDIA_TYPE_FILTERS = ['chat', 'call', 'callback', 'email'];\nexport const INTERAPPTION_MESSAGE_SUB_TYPE_FILTERS = [\n    'apple',\n    'sms',\n    'line',\n    'facebook',\n    'open',\n    'instagram',\n    'twitter',\n    'webmessaging',\n    'whatsapp'\n];\nexport const INTERAPPTION_COMMUNICATION_TYPE_FILTERS = [\n    ...INTERAPPTION_PRIMARY_MEDIA_TYPE_FILTERS,\n    ...INTERAPPTION_MESSAGE_SUB_TYPE_FILTERS\n];\nexport const NO_SUPPORTED_COMMUNICATION_TYPE_FILTER = 'none';\n\nconst App = Ember.Object.extend(Copyable, {\n    typeId: null,\n    id: null,\n    name: null,\n    urlTemplate: null,\n    langTag: null,\n    envTld: null,\n    usePopupAuth: false,\n    displayType: null, // The type of app which dictates how an app behaves, where an app is displayed, etc. - standalone, widget, etc.\n    featureCategory: null, // The category of an app's behavior for grouping purposes - directory, performance, help, etc.\n    permissionsPolicy: null,\n    // sandbox, assets, lifecycle, permissionsPolicy - set in init\n\n    // Interapption specific properties\n    interactionId: null,\n    interactionType: null,\n    /**\n     * When not empty (>= 1 entry), will restrict the interapption to the specified queues\n     */\n    enabledQueueIds: null,\n    /**\n     * When not empty (>= 1 entry), will restrict the interapption to the specified communication types.\n     * Currently, this only includes the initial communication type (it does not include elevations).\n     * When it includes 'none', it will not display the interapption for any communication type.\n     */\n    enabledCommunicationTypes: null,\n    gcHostOrigin: null,\n    gcTargetEnv: null,\n\n    init() {\n        this._super(...arguments);\n\n        if (!this.get('sandbox')) {\n            this.set('sandbox', []);\n        }\n\n        if (!this.get('assets')) {\n            this.set('assets', {});\n        }\n\n        if (!this.get('permissionsPolicy')) {\n            this.set('permissionsPolicy', []);\n        }\n\n        this.set('lifecycle', _.merge(copy(LIFECYCLE_DEFAULTS, true), this.get('lifecycle')));\n    },\n\n    url: computed('urlTemplate', 'langTag', 'envTld', 'interactionId', 'usePopupAuth', 'gcHostOrigin', 'gcTargetEnv', {\n        get() {\n            let result = this.get('urlTemplate');\n            if (typeOf(result) === 'string' && isPresent(result)) {\n                URL_REPLACEMENTS.forEach(currReplacement => {\n                    let replacementValue = '';\n                    if (currReplacement.replacementValue) {\n                        if (this.get('interactionId') && this.get('interactionType'))\n                            replacementValue = currReplacement.replacementValue(\n                                this.get('interactionId'),\n                                this.get('interactionType')\n                            );\n                    } else {\n                        const rawValue = this.get(currReplacement.replacementProp);\n                        replacementValue = isPresent(rawValue) ? rawValue : '';\n                    }\n                    if (encodeURIComponent) {\n                        replacementValue = encodeURIComponent(replacementValue);\n                        result = result.replace(currReplacement.regExp, replacementValue);\n                    }\n                });\n            } else {\n                result = '';\n            }\n            return result;\n        },\n        set() {\n            Ember.Logger.error(\n                appUtils.buildLogMsg('Set called on derived url property instead of new urlTemplate property.'),\n                {\n                    urlTemplate: this.get('urlTemplate'),\n                    remoteData: {\n                        appId: this.get('id')\n                    }\n                }\n            );\n\n            throw new Error('Cannot directly set url.  Use urlTemplate property.');\n        }\n    }),\n\n    getURLTemplateQueryParams() {\n        const result = [];\n        const urlTemplate = this.get('urlTemplate');\n        if (typeOf(urlTemplate) === 'string' && isPresent(urlTemplate)) {\n            URL_REPLACEMENTS.forEach(currReplacement => {\n                if (urlTemplate.search(currReplacement.regExp) !== -1) {\n                    result.push(currReplacement.queryParamName);\n                }\n            });\n        }\n        return result;\n    },\n\n    copy(deep) {\n        let owner = getOwner(this);\n        let ownerMixin = {};\n\n        if (owner) {\n            ownerMixin = owner.ownerInjection();\n        }\n\n        return App.create(ownerMixin, {\n            typeId: this.get('typeId'),\n            id: this.get('id'),\n            name: this.get('name'),\n            urlTemplate: this.get('urlTemplate'),\n            langTag: this.get('langTag'),\n            envTld: this.get('envTld'),\n            usePopupAuth: this.get('usePopupAuth'),\n            displayType: this.get('displayType'),\n            featureCategory: this.get('featureCategory'),\n            sandbox: deep ? _.cloneDeep(this.get('sandbox')) : this.get('sandbox'),\n            assets: deep ? _.cloneDeep(this.get('assets')) : this.get('assets'),\n            lifecycle: deep ? _.cloneDeep(this.get('lifecycle')) : this.get('lifecycle'),\n            permissionsPolicy: deep ? _.cloneDeep(this.get('permissionsPolicy')) : this.get('permissionsPolicy'),\n            // interapption props\n            interactionId: this.get('interactionId'),\n            interactionType: this.get('interactionType'),\n            enabledQueueIds: deep ? _.cloneDeep(this.get('enabledQueueIds')) : this.get('enabledQueueIds'),\n            enabledCommunicationTypes: deep\n                ? _.cloneDeep(this.get('enabledCommunicationTypes'))\n                : this.get('enabledCommunicationTypes'),\n            gcHostOrigin: this.get('gcHostOrigin'),\n            gcTargetEnv: this.get('gcTargetEnv')\n        });\n    }\n});\n\nexport default App;\n","define(\"connections-ui/models/call-communication\", [\"exports\", \"ember-purecloud-components/models/call-communication\"], function (_exports, _callCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _callCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { attr, Model } = DS;\n\nconst { computed } = Ember;\n\nexport default Model.extend({\n    enabled: attr(),\n    phoneNumber: attr(),\n\n    calls: attr(),\n\n    voicemail: attr(),\n\n    isExternalVoicemail: computed.equal('voicemail', 'LASTCALL')\n});\n","define(\"connections-ui/models/callback-communication\", [\"exports\", \"ember-purecloud-components/models/callback-communication\"], function (_exports, _callbackCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _callbackCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { A } from '@ember/array';\nimport { computed, get, set } from '@ember/object';\nimport { inject } from '@ember/service';\nimport DS from 'ember-data';\nimport cloneDeep from 'lodash/cloneDeep';\nimport RSVP from 'rsvp';\n\nconst { attr } = DS;\n\nfunction hasSipErrors(party: any) {\n    const codes = get(party, 'sipResponseCodes');\n    if (!codes || codes.length === 0) {\n        return false;\n    }\n    // 487 is Voicemail Not Available, which is not treated as an error\n    // 410 is a queue call that gets transfered to an agent for some reason\n    return !!party.sipResponseCodes.filter((c: number) => c >= 300 && c !== 487 && c !== 410).length;\n}\n\nexport default DS.Model.extend({\n    // required services\n    session: inject('session'),\n    addressformat: inject('addressformat'),\n    application: inject('application'),\n    ajax: inject('ajax'),\n    intl: inject('intl'),\n\n    /**\n     * The conversation (with the same id as this call)\n     * Fetched when we need to distinguish between participants (if there are 2 or more valid otherParties)\n     * Raw object - Not the EPC model\n     */\n    conversation: null,\n\n    //  The relevant part of conversation. Each participant in this list corresponds to participants on callv2, but has\n    //  extra properties such as monitorParticipantId or coachedParticipantId\n    conversationParticipants: computed('conversation.participants', function () {\n        const conversationParties = this.get('conversation.participants') || [];\n        return conversationParties;\n    }),\n\n    participants: attr(),\n    startTime: attr('date'),\n    direction: attr('string'),\n    missedCall: attr('boolean'),\n    wasConference: attr('boolean'),\n    wasCallback: attr('boolean'),\n    wasOutboundCampaign: attr('boolean'),\n    /**\n     * call went to voicemail\n     */\n    wentToVoicemail: attr('boolean'),\n\n    callStart: computed.alias('startTime'),\n\n    sentToVoicemail: computed('wentToVoicemail', 'voicemailParticipant', function () {\n        // sent to my voicemail\n        if (!this.get('wentToVoicemail')) {\n            return false;\n        }\n        return this.get('voicemailParticipant.user.id') === this.get('myGuid');\n    }),\n    reachedVoicemail: computed.and('wentToVoicemail', 'isOutbound'), // went to other user's voicemail\n\n    // my participant computeds\n    myGuid: computed.reads('session.person.guid'),\n    callEnd: computed.reads('myParticipant.endTime'),\n    isOutbound: computed.equal('myParticipant.direction', 'outbound'),\n    isMultiParty: computed.or(\n        'isOutboundCampaign',\n        'isIvrTransfer',\n        'isBlindTransfer',\n        'isConsultTransfer',\n        'wasConference'\n    ),\n    myself: computed.reads('myParticipant'), // convenience for call-history-entity backward compat\n    allParticipants: computed.union(\n        'internalParticipants',\n        'externalParticipants',\n        'stationParticipants',\n        'ivrParticipants',\n        'queueParticipants'\n    ),\n\n    // an acd call is where any participant is an agent\n    isAcdCall: computed('participants.[]', function () {\n        return A(this.get('participants')).any((participant: any) => participant && participant.purpose === 'agent');\n    }),\n\n    // begin participant computed props: myParticipant, internalParticipants, externalParticipants, voicemailParticipant, otherParties\n    myParticipant: computed('participants.[]', 'myGuid', function () {\n        const nonVoicemail = this.get('participants').rejectBy('purpose', 'voicemail') || A([]);\n        let me = nonVoicemail.findBy('user.id', this.get('myGuid'));\n        if (!me) {\n            me = nonVoicemail.findBy('purpose', 'station');\n        }\n        return me;\n    }),\n\n    // internalParticipants and externalParticipants and combined in allParticipants computed above.\n    internalParticipants: computed('participants.[]', function () {\n        return (this.get('participants') || []).filter(\n            (party: any) => party.user !== undefined && party.monitoredCallId === undefined\n        );\n    }),\n\n    externalParticipants: computed('participants.[]', function () {\n        const participants = this.get('participants').reject(\n            (p: any) => get(p, 'dnis') === 'unknown' || hasSipErrors(p)\n        );\n\n        let externalParticipants = A([\n            ...participants.filterBy('purpose', 'external'),\n            ...participants.filterBy('purpose', 'customer')\n        ]);\n\n        // the edge does dumb stuff like add participants with no error code when\n        // the call gets redirected to another edge. See if there are two identical\n        // participants where both didn't interact, and if so, filter one out.\n        if (\n            externalParticipants.length === 2 &&\n            externalParticipants.filterBy('didInteract').length < 2 &&\n            externalParticipants[0].ani === externalParticipants[0].ani\n        ) {\n            externalParticipants = A([externalParticipants[0]]);\n        }\n        return externalParticipants;\n    }),\n\n    stationParticipants: computed('participants.[]', function () {\n        return this.get('participants')\n            .reject((p: any) => get(p, 'dnis') === 'unknown' || hasSipErrors(p))\n            .filterBy('purpose', 'station');\n    }),\n\n    voicemailParticipant: computed('participants.[]', function () {\n        return this.get('participants').findBy('purpose', 'voicemail');\n    }),\n\n    ivrParticipants: computed('participants.[]', function () {\n        return this.get('participants').filterBy('purpose', 'ivr');\n    }),\n\n    queueParticipants: computed('participants.[]', function () {\n        return this.get('participants').filterBy('purpose', 'acd');\n    }),\n\n    // All participants that aren't the current user, or a monitor, coach, or barged participant\n    otherParties: computed('allParticipants.[]', 'myGuid', 'conversationParticipants.[]', function () {\n        const conversationParticipants = this.get('conversationParticipants');\n        return this.get('allParticipants')\n            .rejectBy('user.id', this.get('myGuid'))\n            .reject((party: any) => get(party, 'startTime') === get(party, 'endTime') || hasSipErrors(party))\n            .filter((party: any) => {\n                //  Only filter out monitors, coaches, or barged participants (if found from conversation.participants)\n                const partyFromConversation = conversationParticipants.find(\n                    (participant: any) => participant.id === party.id\n                );\n                if (partyFromConversation) {\n                    return !(\n                        get(partyFromConversation, 'monitoredParticipantId') ||\n                        get(partyFromConversation, 'coachedParticipantId') ||\n                        get(partyFromConversation, 'bargedParticipantId')\n                    );\n                }\n                return true;\n            });\n    }),\n\n    callParties: computed('otherParties.[]', 'isGroupRing', 'conversationParticipants', function () {\n        const otherParties = this.get('otherParties');\n        const addressformat = this.get('addressformat');\n\n        // We dont display (all) group call participants in any call UIs\n        if (this.get('isGroupRing')) {\n            return [];\n        }\n\n        return otherParties.rejectBy('purpose', 'voicemail').map((p: any) => {\n            const party = cloneDeep(p); // no side effects\n            if (party.purpose === 'user' || party.purpose === 'agent') {\n                const promise = this.get('store').findRecord('person', party.user.id);\n                promise.then((data: any) => {\n                    set(party, 'name', data.get('name'));\n                });\n                return promise.catch(() => party);\n            }\n\n            if (party.purpose === 'acd') {\n                const promise = this.get('store').findRecord('queue', party.queue.id);\n                promise.then((data: any) => {\n                    set(party, 'name', data.get('name'));\n                    set(party, 'address', `sip:${data.get('id')}`);\n                });\n                return promise.catch(() => party);\n            }\n\n            if (party.purpose === 'ivr') {\n                set(party, 'address', get(party, 'dnis'));\n            } else if (party.direction === 'outbound') {\n                const dnis = get(party, 'dnis');\n                set(party, 'isOutbound', true);\n                //  Sometimes in conference calls the address of a participant is not resolved correctly when accessed from the 'history' bulk endpoint\n                //  In that case we try to fallback on the same participant taken fron the GET conversation/{conversationId} endpoint which may be resolved correctly\n                if (party.address && party.address.startsWith('sip:')) {\n                    const conversationParticipants = this.get('conversationParticipants');\n                    const participant = conversationParticipants.find(\n                        (participant: any) => participant.id === party.id\n                    );\n\n                    // If the participant address is also available from the more detailed 'conversationParticipants', use it\n                    if (participant) {\n                        set(party, 'address', get(participant, 'address'));\n                    } else {\n                        // Otherwise fallback to DNIS\n                        set(party, 'address', dnis);\n                    }\n                } else {\n                    set(party, 'address', dnis);\n                }\n            } else {\n                set(party, 'address', get(party, 'ani'));\n            }\n\n            set(party, 'address', addressformat.formatAddressForDisplay(get(party, 'address')));\n            return RSVP.resolve(party);\n        });\n    }),\n\n    initiator: computed('allParticipants.[]', function () {\n        const all = this.get('allParticipants');\n        const outboundParticipant = all.findBy('direction', 'outbound');\n\n        if (outboundParticipant) {\n            return outboundParticipant;\n        }\n\n        const external = this.get('externalParticipants');\n        const inboundExternal = external.findBy('direction', 'inbound');\n        if (inboundExternal) {\n            return inboundExternal;\n        }\n\n        // Sometimes the initiator is indeterminate based on the data we get\n        // but it's not really necessary for rendering the component\n        return null;\n    }),\n\n    disconnectReason: computed('myParticipant.disconnectType', 'isOutbound', 'wentToVoicemail', function () {\n        const intl = this.get('intl');\n\n        const disconnectType = this.get('myParticipant.disconnectType') || 'unknown';\n        let disconnectTypeKey = 'other';\n\n        if (disconnectType === 'client') {\n            disconnectTypeKey = 'you';\n        } else if (disconnectType === 'endpoint') {\n            disconnectTypeKey = 'otherParty';\n        } else if (disconnectType === 'system') {\n            disconnectTypeKey = 'system';\n        } else if (disconnectType && disconnectType.indexOf('transfer') > -1) {\n            if (!this.get('isOutbound') && this.get('wentToVoicemail')) {\n                disconnectTypeKey = 'youDeclined';\n            } else {\n                disconnectTypeKey = 'transfer';\n            }\n        } else if (disconnectType === 'error') {\n            disconnectTypeKey = 'error';\n        }\n\n        return intl.lookup(`purecloud.disconnectReason.${disconnectTypeKey}`);\n    }),\n\n    isIvrTransfer: computed('myParticipant.disconnectType', 'otherParties.[]', function () {\n        return !!this.get('otherParties').filter((p: any) => {\n            const purpose = get(p, 'purpose');\n            return purpose === 'ivr' || purpose === 'acd';\n        }).length;\n    }),\n\n    isOutboundCampaign: computed.readOnly('wasOutboundCampaign'),\n\n    isBlindTransfer: computed('sentToVoicemail', 'myParticipant.disconnectType', function () {\n        // if I'm an agent and there were other agents, it's a transfer situation. We can't\n        // distinguish between consult or blind based on analytics or conversation data\n        if (this.get('myParticipant.purpose') === 'agent') {\n            return this.get('participants').filterBy('purpose', 'agent').length > 1;\n        }\n\n        const participants = this.get('participants').filter((p: any) => {\n            const purpose = get(p, 'purpose');\n            return purpose !== 'ivr' && purpose !== 'acd';\n        });\n\n        if (!participants.any((p: any) => get(p, 'disconnectType') === 'transfer')) {\n            return false;\n        }\n\n        return !this.get('wentToVoicemail');\n    }),\n\n    isConsultTransfer: computed('isBlindTransfer', 'wasConference', 'callParties.[]', function () {\n        // multiple parties, but not marked as a transfer or a conference means consult\n        const parties = this.get('callParties').filter((p: any) => {\n            const purpose = get(p, 'purpose');\n            return purpose !== 'ivr' && purpose !== 'acd';\n        });\n        return !this.get('isBlindTransfer') && !this.get('wasConference') && parties.length > 1;\n    }),\n\n    isPersonalVoicemail: computed('voicemailParticipant.dnis', function () {\n        return this.get('voicemailParticipant')\n            ? this.get('voicemailParticipant.dnis').indexOf('user=voicemailbox') > -1\n            : false;\n    }),\n\n    // This an outbound call initiated by the queue - NOT true for normal inbound/outbound ACD calls\n    isQueueCall: computed('initiator', function () {\n        const queueId = this.get('myParticipant.queue.id') || this.get('myParticipant.queueId');\n        return (\n            !!(\n                this.get('initiator.dnis') &&\n                queueId &&\n                this.get('initiator.dnis').indexOf(queueId > -1) &&\n                this.get('isOutbound')\n            ) && !this.get('isAcdCall')\n        );\n    }),\n\n    invalidNumber: computed('myParticipant.{disconnectType,dnis}', function () {\n        return (\n            this.get('myParticipant.disconnectType') === 'error' && this.get('myParticipant.dnis') === 'Invalidnumber'\n        );\n    }),\n\n    groupRingParticipant: computed('participants.[]', function () {\n        return this.get('participants').find((p: any) => get(p, 'groupId') || get(p, 'group.id'));\n    }),\n\n    isGroupRing: computed.bool('groupRingParticipant'),\n\n    groupRingId: computed('groupRingParticipant', function () {\n        const participant = this.get('groupRingParticipant');\n        if (!participant) {\n            return undefined;\n        }\n        return get(participant, 'groupId') || get(participant, 'group.id');\n    }),\n\n    isOutboundGroupRing: computed('isOutbound', 'groupRingCaller.guid', 'isGroupRing', 'myGuid', function () {\n        return !!(\n            this.get('isOutbound') &&\n            this.get('isGroupRing') &&\n            this.get('groupRingCaller.guid') === this.get('myGuid')\n        );\n    }),\n\n    groupRingGroup: computed('groupRingId', function () {\n        if (this.get('groupRingId')) {\n            return this.get('store').findRecord('group', this.get('groupRingId'), {\n                reload: false,\n                backgroundReload: false\n            });\n        }\n        return RSVP.Promise.resolve(null);\n    }),\n\n    groupRingCaller: computed('isGroupRing', 'initiator', function () {\n        const initiator = this.get('initiator');\n        if (this.get('groupRingParticipant') && initiator) {\n            if (!get(initiator, 'user')) {\n                return RSVP.resolve(initiator);\n            }\n\n            return this.get('store').findRecord('person', get(initiator, 'user.id'), {\n                reload: false,\n                backgroundReload: false\n            });\n        }\n        return RSVP.Promise.resolve(null);\n    }),\n\n    //  If there are more than 2 parties fetch the conversation individually to distinguish them\n    loadConversation: function () {\n        const personParticipants = this.get('participants').filter((participant: any) =>\n            ['user', 'agent', 'external', 'customer'].includes(participant.purpose.toLowerCase())\n        );\n        let promise = Ember.RSVP.Promise.resolve([]);\n        if (!this.get('conversation') && personParticipants.length > 2) {\n            let id = this.get('id');\n            let url = this.get('application').pcV2Uri(`api/v2/conversations/${id}`);\n            promise = this.get('ajax')\n                .request(url)\n                .then(res => {\n                    this.set('conversation', res);\n                    return !!res ? res.participants : [];\n                })\n                .catch(() => []);\n        }\n        return promise;\n    }\n});\n","define(\"connections-ui/models/chat-communication\", [\"exports\", \"ember-purecloud-components/models/chat-communication\"], function (_exports, _chatCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _chatCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport moment from '../utils/dates';\nimport ChatMessageMixin from '../mixins/chat-message-mixin';\nimport ChatMessageMedia from '../mixins/chat-message-media';\nimport { compareJids } from 'ember-purecloud-components/utils/jid-helpers';\n\nconst SECOND_TO_EDIT = 60;\n\nconst ChatMessage = Ember.Object.extend(ChatMessageMedia, ChatMessageMixin, {\n    /**\n    Any new functionality that needs to be added to the Chat Message Model must\n    be added to the ChatMessageMixin instead. Adding functionality to the model\n    instead of the mixin will cause chat messages to break, and cant guarantee\n    that message will render as they should.\n    */\n\n    // Start of chat message attrs\n    id: null,\n    oid: null,\n    from: null,\n    to: null,\n    time: null,\n    corrects: null,\n    raw: null,\n    links: null,\n    stanza: null,\n    files: null,\n    // End of chat message attrs\n\n    // set in services/chat.processNewChatMessage()\n    chatUser: null,\n    messageBody: null,\n    hasMentionLinks: false,\n\n    // set in services/chat.markAsHistory()\n    history: false,\n\n    // set in services/chat.setMessageReadState()\n    unread: false,\n\n    // set in chat-room.processCorrections()\n    correction: null,\n    startOfBlock: null,\n    endOfBlock: null,\n\n    // set in chat-room.addSelfReference()\n    room: null,\n\n    // set in chat-room.addMessage()/markConversationBlockBoundaries()\n    isYourLastMessage: false,\n\n    //set by services/chat.parseWidgetData()\n    widget: null,\n    widgetType: 'default',\n\n    //set by chat-room.processSplitMessage()\n    splitMessageIndex: null,\n\n    init() {\n        this._super(...arguments);\n        this.determineMessageEditability();\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        Ember.run.cancel(this.get('isEditableTimeout'));\n    },\n\n    isSplitMessage: Ember.computed('stanza', function () {\n        const children = this.get('stanza.children');\n        return children.findBy('name', 'multipart-message') !== undefined;\n    }),\n\n    isEditable: false,\n\n    editableEndTime: Ember.computed('time', function () {\n        const time = this.get('time');\n        if (time) {\n            return moment(time).add(SECOND_TO_EDIT, 'seconds');\n        }\n        return time;\n    }),\n\n    isEditing: Ember.computed('widgetType', function () {\n        return 'editor' === this.get('widgetType');\n    }),\n\n    canEdit: Ember.computed(\n        'isEditable',\n        'isYou',\n        'isYourLastMessage',\n        'endOfBlock',\n        'pending',\n        'files.[]',\n        'correction.{isYou,isYourLastMessage,pending}',\n        'room.isAcdRoom',\n        function () {\n            if (!this.get('isEditable') || this.get('files.length') || this.get('room.isAcdRoom')) {\n                return false;\n            }\n\n            const message = this.get('messageDisplay');\n            return (\n                !message.get('pending') &&\n                message.get('isYou') &&\n                message.get('endOfBlock') &&\n                message.get('isYourLastMessage')\n            );\n        }\n    ),\n\n    meAction: Ember.computed('raw', 'correction.raw', function () {\n        const raw = this.get('correction.raw') || this.get('raw');\n        if (raw && raw.indexOf('/me ') === 0) {\n            return raw.substr(4, raw.length);\n        }\n        return null;\n    }),\n\n    startEditing() {\n        this.set('_originalWidgetType', this.get('widgetType'));\n        this.set('widgetType', 'editor');\n    },\n\n    stopEditing() {\n        const originalWidgetType = this.get('_originalWidgetType');\n        if (originalWidgetType && 'editor' === this.get('widgetType')) {\n            this.set('widgetType', originalWidgetType);\n        }\n    },\n\n    determineMessageEditability() {\n        if (!this.get('corrects') && compareJids(this.get('from'), this.get('session.person.jid'))) {\n            const now = moment();\n            const seconds = SECOND_TO_EDIT - now.diff(this.get('time'), 'seconds');\n            const isEditable = seconds > 0;\n            this.set('isEditable', isEditable);\n            if (isEditable) {\n                const isEditableTimeout = Ember.run.later(\n                    this,\n                    () => {\n                        this.stopEditing();\n                        this.set('isEditable', false);\n                    },\n                    seconds * 1000\n                );\n                this.set('isEditableTimeout', isEditableTimeout);\n            }\n        }\n    }\n});\n\nexport default ChatMessage;\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from '../utils/dates';\nimport SortChatUsersMixin from '../mixins/sort-chat-users';\nimport SplitMessage from './split-message';\nimport {\n    compareJids,\n    isAcdJid,\n    isGroupJid,\n    isPersonJid,\n    isRoomJid,\n    isSoftphoneJid,\n    isSupervisorJid\n} from 'ember-purecloud-components/utils/jid-helpers';\n\nconst POPOUT_HEIGHT = 800;\nconst POPOUT_WIDTH = 500;\nconst POPOUT_LOCATION = -2000;\n\nconst haveGroupData = group => {\n    const haveId = !_.isEmpty(group.get('id'));\n    const haveName = !_.isEmpty(group.get('name'));\n    const groupId =\n        group.getFieldValue && group.getFieldValue('general.name') && group.getFieldValue('general.name')._id;\n    const isApiFieldConfigName = groupId && !_.isEmpty(groupId);\n    return haveId && haveName && isApiFieldConfigName;\n};\n\n// TODO: Find a better Ember way/spot for this view oriented behavior.\n// This === shared by all chat-room models on purpose.  Rooms decide based\n// mute setting to animate ||!.\n// Similar code exist in interaction.js service\nconst MAX_WAIT = 8000;\nconst animateChatIcon = _.debounce(\n    () => {\n        Ember.$('.action-item.chat a').addClass('faa-horizontal animated');\n        Ember.run.later(() => {\n            Ember.$('.action-item.chat a').removeClass('faa-horizontal animated');\n        }, MAX_WAIT);\n    },\n    MAX_WAIT,\n    { leading: true, trailing: false, maxWait: MAX_WAIT }\n);\n\n// This size mirrors the 'messagesPerHistoryRequest' property in services/chat\nconst PRUNE_SIZE = 25;\n\nconst ChatRoom = Ember.Object.extend(SortChatUsersMixin, {\n    session: Ember.inject.service('session'),\n    webrtc: Ember.inject.service('webrtc'),\n    batchDataRequests: Ember.inject.service(),\n    chat: Ember.inject.service('chat'),\n\n    jid: null,\n    objectId: null,\n    group: null,\n    oneToOneTarget: null,\n    rawSubject: null,\n    pendingRoom: false,\n\n    firstMessageTime: null,\n    lastMessageTime: null,\n    lastMessageTimeRadix: 0,\n    roomClosedTimeRadix: 0,\n\n    mentions: 0,\n    unseen: 0,\n    messageActivity: 0,\n    userActivity: 0,\n\n    loadingHistory: false,\n    moreHistoryAvailable: false,\n    moreForwardHistoryAvailable: false,\n\n    activated: false,\n\n    participants: null,\n    acdCustomerParticipant: null,\n    messages: null,\n    messageCache: null,\n    splitMessageCache: null,\n    inputCache: null,\n\n    isInRoster: false,\n    participantsVisible: false,\n\n    isFavorite: false,\n\n    invited: false,\n    showingVideo: false,\n    joinCallImmediately: false,\n    joinScreenshareImmediately: false,\n\n    type: 'room',\n\n    deferredParticipants: null,\n\n    roomOwners: [],\n\n    setupProperties: Ember.on('init', function () {\n        this.setProperties({\n            participants: [],\n            messages: [],\n            messageCache: Ember.Object.create({}),\n            splitMessageCache: Ember.Object.create({}),\n            firstMessageTime: moment(0),\n            lastMessageTime: moment(0),\n            deferredParticipants: Ember.A([])\n        });\n    }),\n\n    authenticatedUserIsRoomOwner: Ember.computed('session.person', function () {\n        const group = this.get('group');\n        return group && group.isPersonOwner(this.get('session.person'));\n    }),\n\n    resizeNewPopout: Ember.observer('popout', function () {\n        const popout = this.get('popout');\n        if (popout) {\n            popout.resizeTo(POPOUT_WIDTH, POPOUT_HEIGHT);\n            popout.moveTo(POPOUT_LOCATION, POPOUT_LOCATION);\n            popout.focus();\n        }\n    }),\n\n    videoConversation: Ember.computed('webrtc.conversations.[]', function () {\n        let conversations = this.get('webrtc.conversations');\n        if (conversations) {\n            return conversations.findBy('room.jid', this.get('jid'));\n        }\n        return null;\n    }),\n\n    videoRoomFull: false,\n\n    subject: Ember.computed('rawSubject', 'group.{id,name}', 'oneToOneTarget.name', function () {\n        const group = this.get('group');\n\n        if (!group) {\n            return (\n                this.get('oneToOneTarget.name') || this.get('rawSubject') || this.get('oneToOneTarget.email_main') || ''\n            );\n        }\n\n        const haveId = !_.isEmpty(group.id);\n        const haveName = !_.isEmpty(group.get('name'));\n        const groupId = group.getFieldValue && group.getFieldValue('general.name') && group.id;\n        const isApiFieldConfigName = groupId && !_.isEmpty(groupId);\n        if (haveId && haveName && isApiFieldConfigName) {\n            return this.get('groupName');\n        } else {\n            return (\n                this.get('oneToOneTarget.name') || this.get('rawSubject') || this.get('oneToOneTarget.email_main') || ''\n            );\n        }\n    }),\n\n    mapCanRemoveParticipant(participantList) {\n        const group = this.get('group');\n        const personId = this.get('session.person.id');\n        return participantList.map(participant => {\n            const isMember = group && group.isPersonIndividual(participant);\n            const canRemove = !isMember && !this.isRoomOwner(participant) && participant.id !== personId;\n\n            Ember.set(participant, 'canBeRemovedFromRoom', canRemove);\n            return participant;\n        });\n    },\n\n    sortedParticipants: Ember.computed('participants.@each.presence', 'allowUserRemoval', function () {\n        if (this.get('allowUserRemoval')) {\n            const list = this.mapCanRemoveParticipant(this.get('participants'));\n            return this.sortChatUsers(list);\n        }\n        return this.sortChatUsers(this.get('participants'));\n    }),\n\n    skipGroupDataCheckEnabled: true,\n\n    groupName: Ember.computed.reads('group.name'),\n\n    isAdhocRoom: Ember.computed('jid', function () {\n        const jid = this.get('jid');\n        return isRoomJid(jid) && _.isEmpty(this.get('groupName'));\n    }),\n\n    isAcdRoom: Ember.computed('jid', function () {\n        return isAcdJid(this.get('jid'));\n    }),\n\n    isSupervisorRoom: Ember.computed('jid', function () {\n        return isSupervisorJid(this.get('jid'));\n    }),\n\n    isSoftphoneRoom: Ember.computed('jid', function () {\n        return isSoftphoneJid(this.get('jid'));\n    }),\n\n    isOneToOne: Ember.computed('jid', function () {\n        return this.isOneToOneRoom();\n    }),\n\n    allowUserRemoval: true,\n\n    processRoomDetails({ owners }) {\n        this.set('roomOwners', owners);\n    },\n\n    isRoomOwner(person) {\n        const group = this.get('group');\n        const isGroupOwner = !!group && group.isPersonOwner(person);\n        const personId = Ember.get(person, 'id');\n        const isOwner = this.get('roomOwners').some(owner => owner.id === personId);\n\n        return isOwner || isGroupOwner;\n    },\n\n    getRawDisplaySubject() {\n        // Get a version of the room subject that has! been decorated with markdown, for usages in places where the\n        // data will show up without being html rendered (such as mentions)\n        const group = this.get('group');\n        // we're skipping the haveGroupData check\n        if (this.get('skipGroupDataCheckEnabled')) {\n            if (group) {\n                return this.get('groupName');\n            }\n        } else if (group && haveGroupData(group)) {\n            return this.get('groupName');\n        }\n        return this.get('oneToOneTarget.name') || this.get('rawSubject') || this.get('oneToOneTarget.email_main') || '';\n    },\n\n    clearMessageCache() {\n        this.set('activated', false);\n        this.set('messages', []);\n        this.set('messageCache', Ember.Object.create({}));\n    },\n\n    pruneMessages() {\n        const messages = this.get('messages');\n        if (messages.length > PRUNE_SIZE) {\n            const messageCache = this.get('messageCache');\n            const splitMessageCache = this.get('splitMessageCache');\n            const removeCachedItemsCount = messages.length - PRUNE_SIZE;\n            for (let i = 0; i < removeCachedItemsCount; i++) {\n                const message = messages[i];\n\n                if (message.get('splitMessage')) {\n                    message.get('messageArray').forEach(message => {\n                        delete messageCache[message.get('id')];\n                        delete messageCache[message.get('oid')];\n                        message.destroy();\n                    });\n                    delete splitMessageCache[message.get('splitMessageId')];\n                }\n                delete messageCache[message.get('oid')];\n                delete messageCache[message.get('id')];\n                message.destroy();\n            }\n            this.set('messages', _.takeRight(messages, PRUNE_SIZE));\n            this.set('moreHistoryAvailable', true);\n            this.reconcileMessages();\n        }\n    },\n\n    addHistoryMessages(messages) {\n        if (messages && messages.length > 0) {\n            this.processHistoryModels(messages);\n        }\n    },\n\n    processHistoryModels(history) {\n        history = this.filterSeenMessages(_.uniqBy(history, 'id'));\n        this.addSelfReference(history);\n        this.insertHistory(history);\n        this.reconcileMessages();\n    },\n\n    reconcileMessages() {\n        this.sortChatMessages();\n        this.processCorrections();\n        this.processSplitMessageHistory();\n        this.markConversationBlockBoundaries();\n        this.updateFirstUnread();\n        this.updateMessageTimes();\n    },\n\n    filterSeenMessages(history) {\n        const cache = this.get('messageCache');\n        return _.filter(history, message => {\n            return !Object.prototype.hasOwnProperty.call(cache, message.get('id'));\n        });\n    },\n\n    addSelfReference(history) {\n        _.each(history, message => message.set('room', this));\n        return null;\n    },\n\n    bumpActivityCount(message) {\n        this.incrementProperty('messageActivity');\n        if (compareJids(message.get('chatUser.jid'), this.get('session.person.jid'))) {\n            this.incrementProperty('userActivity');\n        }\n    },\n\n    insertHistory(historyMessages) {\n        this.get('messages').unshiftObjects(historyMessages);\n\n        const cache = this.get('messageCache');\n        _.each(historyMessages, message => {\n            cache.set(message.get('id'), message);\n        });\n    },\n\n    sortChatMessages() {\n        const messages = _.sortBy(this.get('messages'), message => {\n            return message.get('time').valueOf();\n        });\n        this.set('messages', messages);\n    },\n\n    processSplitMessageHistory() {\n        const messages = this.get('messages')\n            .map(message => {\n                if (message.get('isSplitMessage')) {\n                    const splitMessage = this.processSplitMessage(message);\n                    if (splitMessage.get('messageArray.length') <= 1) {\n                        return splitMessage;\n                    }\n                    return null;\n                }\n                return message;\n            })\n            .filter(message => !!message);\n        this.set('messages', messages);\n    },\n\n    processCorrections() {\n        const messages = this.get('messages');\n        _.each(messages, message => {\n            if (message.get('corrects')) {\n                const correctedMessage = _.find(messages, m => {\n                    return m.get('id') === message.get('corrects');\n                });\n                if (correctedMessage) {\n                    correctedMessage.set('correction', message);\n                }\n            } else if (message.get('isEdited')) {\n                message.set('correction', message);\n            }\n        });\n        this.set('messages', messages);\n    },\n\n    markConversationBlockBoundaries() {\n        const messages = this.get('messages');\n\n        if (messages.length === 0) {\n            return;\n        }\n\n        _.head(messages).setProperties({\n            startOfBlock: true,\n            endOfBlock: true,\n            isLastMessage: false,\n            isYourLastMessage: false\n        });\n\n        _.last(messages).setProperties({\n            endOfBlock: true,\n            isLastMessage: true\n        });\n\n        if (messages.length === 1) {\n            const message = messages[0];\n            message.set('isYourLastMessage', message.get('isYou'));\n        }\n\n        if (messages.length === 1) {\n            return;\n        }\n\n        let isYourLastMessage = null;\n\n        for (let i = 0; i <= messages.length - 2; i++) {\n            const last = messages[i];\n            const next = messages[i + 1];\n\n            if (last.get('isYou')) {\n                isYourLastMessage = last;\n            } else {\n                last.set('isYourLastMessage', false);\n            }\n\n            if (next.get('isYou')) {\n                isYourLastMessage = next;\n            } else {\n                next.set('isYourLastMessage', false);\n            }\n\n            if (this.shouldGroupMessages(last, next)) {\n                last.set('endOfBlock', false);\n                next.set('startOfBlock', false);\n            } else {\n                last.set('endOfBlock', true);\n                next.set('startOfBlock', true);\n            }\n        }\n\n        if (isYourLastMessage) {\n            isYourLastMessage.set('isYourLastMessage', true);\n        }\n    },\n\n    updateFirstUnread() {\n        if (this.get('firstUnread')) {\n            this.set('firstUnread.firstUnread', false);\n            this.set('firstUnread', null);\n        }\n\n        const messages = this.get('messages');\n        for (let i = 0; i < messages.length; i++) {\n            const message = messages[i];\n            if (message.get('unread')) {\n                message.set('firstUnread', true);\n                this.set('firstUnread', message);\n                return;\n            }\n        }\n    },\n\n    processSplitMessage(message) {\n        const splitMessageCache = this.get('splitMessageCache');\n        const stanza = message.get('stanza.children').findBy('name', 'multipart-message');\n        const splitMessageData = JSON.parse(Ember.get(stanza, 'children.lastObject'));\n        const splitMessageParentExists = Object.prototype.hasOwnProperty.call(splitMessageCache, splitMessageData.id);\n        if (!splitMessageParentExists) {\n            const owner = Ember.getOwner(this);\n            let splitMessage = SplitMessage.create(\n                {\n                    id: message.id,\n                    oid: message.oid,\n                    from: message.from,\n                    to: message.to,\n                    time: message.time,\n                    chatUser: message.chatUser,\n                    splitMessageId: splitMessageData.id,\n                    totalMessages: splitMessageData.messageCount\n                },\n                owner.ownerInjection()\n            );\n            this.addSelfReference([splitMessage]);\n            splitMessageCache.set(splitMessageData.id, splitMessage);\n        }\n        let splitMessage = splitMessageCache.get(splitMessageData.id);\n        message.set('splitMessageIndex', splitMessageData.index);\n        splitMessage.addSplitMessage(message);\n        return splitMessage;\n    },\n\n    addMessage(message) {\n        const messages = this.get('messages');\n        const cache = this.get('messageCache');\n        const msgId = message.get('id') || message.get('oid');\n\n        this.addSelfReference([message]);\n\n        if (Object.prototype.hasOwnProperty.call(cache, msgId)) {\n            message.set('duplicate', true);\n            return;\n        }\n        cache.set(msgId, message);\n\n        if (message.get('isSplitMessage')) {\n            const splitMessage = this.processSplitMessage(message);\n            if (splitMessage.get('messageArray.length') > 1) {\n                return;\n            }\n            message = splitMessage;\n        }\n\n        const roomJid = message.get('room.jid');\n        const isSupervisor = this.get('isSupervisorRoom');\n        const isAcd = this.get('isAcdRoom');\n\n        if (!isAcd && !isSupervisor) {\n            this.bumpActivityCount(message);\n        }\n\n        if (message.get('unread') && !message.get('corrects')) {\n            if (!this.get('muted')) {\n                if (roomJid && !isAcd && !isSupervisor) {\n                    animateChatIcon();\n                }\n            }\n\n            if (!this.get('firstUnread')) {\n                message.set('firstUnread', true);\n                this.set('firstUnread', message);\n            }\n        }\n\n        // default message to its own block\n        message.set('startOfBlock', true);\n        message.set('endOfBlock', true);\n\n        const lastMessage = _.last(messages);\n        messages.pushObject(message);\n\n        this.updateMessageTimes();\n\n        if (message.get('isYou')) {\n            const yourLast = _.findLast(messages, message => message.get('isYourLastMessage'));\n            if (yourLast) {\n                yourLast.set('isYourLastMessage', false);\n            }\n            message.set('isYourLastMessage', true);\n        }\n\n        if (!lastMessage) {\n            return;\n        }\n\n        if (message.get('time').isBefore(lastMessage.get('time'))) {\n            Ember.Logger.warn('chat-room : Message came in out of order');\n            this.reconcileMessages();\n            return;\n        }\n\n        if (message.get('corrects')) {\n            this.processCorrections();\n        }\n\n        if (this.shouldGroupMessages(lastMessage, message)) {\n            lastMessage.set('endOfBlock', false);\n            message.set('startOfBlock', false);\n        }\n    },\n\n    shouldGroupMessages(oldMessage, newMessage) {\n        return (\n            oldMessage &&\n            newMessage &&\n            oldMessage.get('from') === newMessage.get('from') &&\n            oldMessage.get('unread') === newMessage.get('unread') &&\n            !oldMessage.get('corrects') &&\n            2 >= Math.abs(newMessage.get('time').diff(oldMessage.get('time'), 'minutes'))\n        );\n    },\n\n    updateMessageTimes() {\n        const first = this.get('messages.firstObject');\n        const last = this.get('messages.lastObject');\n        const firstMessageTime = moment(first ? first.get('time') : 0);\n        const lastMessageTime = moment(last ? last.get('time') : 0);\n\n        this.setProperties({ firstMessageTime, lastMessageTime });\n        return this.updateMessageTimeRadix();\n    },\n\n    updateMessageTimeRadix() {\n        // sort messages by last message sent\n        const messages = this.get('messages');\n        const lastMessage = messages[messages.length - 1];\n        return this.set('lastMessageTimeRadix', lastMessage ? lastMessage.get('time').valueOf() : 0);\n    },\n\n    updateClosedTimeRadix() {\n        this.set('roomClosedTimeRadix', moment().valueOf());\n    },\n\n    addParticipant(person) {\n        if (person) {\n            this.get('participants').addObject(person);\n        }\n    },\n\n    removeParticipant(person) {\n        this.get('participants').removeObject(person);\n    },\n\n    clearUnreadMessages() {\n        if (this.get('firstUnread')) {\n            this.get('firstUnread').set('firstUnread', false);\n        }\n        this.set('firstUnread', null);\n        const messages = this.get('messages');\n\n        for (let i = 0; i < messages.length; i++) {\n            const message = messages[i];\n            message.set('unread', false);\n        }\n\n        return this.markConversationBlockBoundaries();\n    },\n\n    isOneToOneRoom() {\n        return isPersonJid(this.get('jid'));\n    },\n\n    isGroupRoom() {\n        return isGroupJid(this.get('jid'));\n    },\n\n    isUserInRoom(userjid) {\n        return this.get('participants').findBy('jid', userjid);\n    },\n\n    clearPending(message) {\n        const existingMessage = this.get(`messageCache.${message.oid}`);\n        if (existingMessage && typeof message === 'object') {\n            existingMessage.set('id', message.id);\n            existingMessage.set('time', moment(message.time));\n            existingMessage.set('pending', false);\n\n            this.set(`messageCache.${message.oid}`, null);\n            this.set(`messageCache.${message.id}`, existingMessage);\n        }\n    },\n\n    setSendError(messageId) {\n        const message = this.get(`messageCache.${messageId}`);\n        if (message) {\n            message.set('pending', false);\n            message.set('sendError', true);\n        }\n    },\n\n    addDeferredParticipant(jid) {\n        this.get('deferredParticipants').addObject(jid);\n    },\n\n    loadDeferredParticipants() {\n        let deferred = Ember.A([...this.get('deferredParticipants')]);\n        deferred.forEach(jid => {\n            this.get('batchDataRequests')\n                .getChatUser(jid)\n                .then(person => {\n                    this.addParticipant(person);\n                });\n            // Semi-deferred to run loop\n            Ember.run.join(() => this.get('deferredParticipants').removeObject(jid));\n        });\n    }\n});\n\nexport default ChatRoom;\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst ZERO_BITRATE_THRESHOLD = 2;\n\nexport default Ember.Object.extend({\n    intl: Ember.inject.service(),\n\n    local: false,\n    person: null,\n    audioMuted: false,\n    videoMuted: false,\n    sharingScreen: false, // deprecated. V1 only\n    major: false,\n    selected: false,\n    connectionState: null,\n    domId: null,\n    hasConnected: false,\n    inLastN: false,\n    cameraStream: null,\n    screenStream: null,\n    sessionId: null,\n    isV1: false,\n    startedVideoMuted: false, // HACK: PCDWEBK-3216; bridge doesn't play well with people who don't join with video\n    associatedInteraction: null,\n    zeroBitrateCount: 0,\n    positiveBitrateCount: 0,\n\n    name: Ember.computed('person.name', 'associatedInteraction.customerName', function () {\n        return (\n            this.get('person.name') ||\n            this.get('associatedInteraction.customerName') ||\n            this.get('intl').t('ewc.unknownParticipant')\n        );\n    }),\n\n    // HACK PCDWEBK-2982: remove when video bridge send video when you dont provide it\n    noVideoTrack: Ember.computed('cameraStream', 'isV1', function () {\n        if (this.get('isV1')) {\n            return false;\n        }\n\n        const stream = this.get('cameraStream');\n        return !(stream && stream.getVideoTracks().length);\n    }),\n\n    speaking: false,\n\n    mediaPresence: Ember.computed.reads('person.mediaPresence'),\n\n    _getInteractionAvatarDisplay() {\n        if (this.get('videoMuted')) {\n            return true;\n        }\n        return false;\n    },\n\n    showAvatar: Ember.computed(\n        'videoMuted',\n        'sharingScreen',\n        'connectionState',\n        'inLastN',\n        'isOffline',\n        'noVideoTrack',\n        'screenStream',\n        'zeroBitrateCount',\n        'positiveBitrateCount',\n        function () {\n            if (this.get('associatedInteraction')) {\n                return this._getInteractionAvatarDisplay();\n            }\n\n            const videoMuted = this.get('videoMuted');\n            const sharingScreen = this.get('sharingScreen') || this.get('screenStream');\n            const state = this.get('connectionState');\n            const isOffline = this.get('isOffline');\n            const inLastN = this.get('inLastN');\n            const noVideo = this.get('noVideoTrack') && !sharingScreen;\n            const zeroBitrateCount = this.get('zeroBitrateCount');\n\n            if (\n                _.includes(['failed', 'checking', 'starting'], state) ||\n                isOffline ||\n                noVideo ||\n                zeroBitrateCount >= ZERO_BITRATE_THRESHOLD\n            ) {\n                return true;\n            }\n            if (!inLastN) {\n                if (this.get('positiveBitrateCount') > 3) {\n                    Ember.Logger.warn('hiding avatar for !inLastN && positiveBitrateCount > 3', {\n                        remoteData: {\n                            kind: 'webrtcSession',\n                            id: this.get('person.id'),\n                            conversationId: this.get('associatedInteraction.id')\n                        }\n                    });\n                    return false;\n                }\n                return true;\n            }\n            return !sharingScreen && videoMuted;\n        }\n    ),\n\n    avatarDisplay: Ember.computed('showAvatar', function () {\n        return this.get('showAvatar') ? 'avatar-visible' : 'avatar-hidden';\n    }),\n\n    isOffline: Ember.computed('connectionState', 'person.presence', 'zeroBitrateCount', function () {\n        if (this.get('local') || this.get('associatedInteraction')) {\n            return false;\n        }\n\n        const connectionState = this.get('connectionState');\n        const presence = this.get('person.presence');\n        const hasOfflinePresence = this.get('person') && (!presence || presence === 'offline');\n        const zeroBitrateCount = this.get('zeroBitrateCount');\n\n        return (\n            connectionState === 'disconnected' ||\n            connectionState === 'interrupted' ||\n            hasOfflinePresence ||\n            zeroBitrateCount >= ZERO_BITRATE_THRESHOLD\n        );\n    }),\n\n    connectionStatus: Ember.computed('connectionState', 'isOffline', 'zeroBitrateCount', function () {\n        const intl = this.get('intl');\n        const state = this.get('connectionState');\n        if (state === 'connected' || state === 'completed') {\n            this.set('hasConnected', true);\n        }\n        if (\n            (state === 'checking' || this.get('isOffline') || this.get('zeroBitrateCount') >= ZERO_BITRATE_THRESHOLD) &&\n            this.get('hasConnected')\n        ) {\n            return intl.lookup('ewc.callStatus.recovering').toString();\n        } else if (state) {\n            return intl.lookup(`ewc.callStatus.${state}`).toString();\n        }\n    }),\n\n    canBeMuted: Ember.computed('audioMuted', 'local', 'associatedInteraction', function () {\n        return !this.get('audioMuted') && !this.get('local') && !this.get('associatedInteraction');\n    })\n});\n","import Ember from 'ember';\n\nexport default Ember.Object.extend({\n    id: null,\n    name: null,\n    markedAsRead: false,\n    actionType: null,\n    relationship: null,\n    dateStart: null,\n    lengthInMinutes: null,\n    status: null,\n\n    appointment: {\n        id: null,\n        selfUri: null,\n        isOverdue: false\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    city: DS.attr(),\n    region: DS.attr(),\n    country: DS.attr(),\n    type: DS.attr(),\n    primary: DS.attr()\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport ExternalContactsMixin from 'connections-ui/mixins/external-contacts';\nimport PersonModel from '../models/person';\nimport moment from '../utils/dates';\nimport { userGuidFromParticipant } from '../utils/conversation';\n\nconst { computed, get, inject, observer, run } = Ember;\n\nfunction maybeLowerCase(str) {\n    return str && str.toLowerCase();\n}\n\nexport default Ember.Object.extend(ExternalContactsMixin, {\n    application: inject.service(),\n    intl: inject.service(),\n    session: inject.service(),\n    chat: inject.service(),\n    phone: inject.service(),\n    addressformat: inject.service(),\n    permissions: inject.service(),\n    names: inject.service(),\n    store: inject.service(),\n\n    id: null,\n    conversationId: null,\n    participants: null,\n    maxParticipants: 0,\n    selfUri: null,\n    acwNotes: null,\n    selectedWrapupCode: null,\n    conversationIsAConsult: false,\n    conversationInitiator: null,\n    lastPartyTalkingTo: null,\n    attemptingToCall: null,\n    webrtcSession: null,\n\n    hasDisplayedDesktopNotification: false,\n    acceptedByClient: false,\n\n    willDestroy() {\n        run.cancel(this.get('_recomputePartiesTimer'));\n        this._super(...arguments);\n    },\n\n    dialingTime: computed('isDialing', 'isContacting', 'participants.[]', function () {\n        if (this.get('isContacting')) {\n            return moment();\n        } else if (this.get('isDialing') && this.get('participants.length') > 1) {\n            return moment();\n        }\n    }),\n\n    otherPartyJid: null,\n    setOtherPartyJid: observer('onCall', 'otherPartyModel', 'otherParty', function () {\n        const promise = Ember.RSVP.resolve(this.get('otherPartyModel'));\n        promise.then(person => {\n            const isOtherPartyPerson = person instanceof PersonModel;\n            if (\n                person &&\n                isOtherPartyPerson &&\n                this.get('onCall') &&\n                this.get('otherParty') &&\n                this.get('otherParty.purpose') !== 'customer'\n            ) {\n                this.set('otherPartyJid', person.get('jid'));\n            } else {\n                this.set('otherPartyJid', null);\n            }\n        });\n    }).on('init'),\n\n    startTime: computed('myself.connectedTime', 'isDialing', 'dialingTime', function () {\n        const connectedTime = this.get('myself.connectedTime');\n        if (this.get('isDialing') && connectedTime === undefined) {\n            return this.get('dialingTime');\n        }\n        if (!this.get('onCall')) {\n            return null;\n        }\n        if (connectedTime) {\n            return connectedTime;\n        }\n    }),\n\n    connectedDuration: computed('myself.{endTime,connectedTime}', function () {\n        const connectedTime = this.get('myself.connectedTime');\n        const endTime = this.get('myself.endTime') || moment();\n        if (connectedTime && endTime) {\n            return moment(endTime).diff(moment(connectedTime));\n        }\n        return null;\n    }),\n\n    iAmInitiatorOfConsult: computed('conversationInitiator', 'conversationIsAConsult', 'myself', function () {\n        return this.get('conversationInitiator.userId') === this.get('myGuid');\n    }),\n\n    otherPartyThatIsNotTheInitiator: computed('participants.[]', 'conversationInitiator', 'myGuid', function () {\n        const initiator = this.get('conversationInitiator');\n        const otherParties = _.reject(this.get('participants'), party => {\n            const partyId = party && party.userId;\n            const initiatorId = initiator && initiator.userId;\n            return partyId === initiatorId || partyId === this.get('myGuid');\n        });\n        return _.last(otherParties);\n    }),\n\n    otherParticipantsThatAreNotTheInitiator: computed(\n        'participants.[]',\n        'conversationInitiator',\n        'myGuid',\n        function () {\n            const initiator = this.get('conversationInitiator');\n            const otherParties = _.reject(this.get('participants'), party => {\n                const partyId = party && party.userId;\n                const initiatorId = initiator && initiator.userId;\n                return partyId === initiatorId || partyId === this.get('myGuid');\n            });\n            return _.map(otherParties, participant => {\n                const name = participant.name || participant.aniName;\n                const model = { name };\n                return Object.assign(participant, { model });\n            });\n        }\n    ),\n\n    otherPartyThatIsNotTheInitiatorModel: computed('otherPartyThatIsNotTheInitiator', function () {\n        const guid = userGuidFromParticipant(this.get('otherPartyThatIsNotTheInitiator'));\n        if (guid) {\n            return this.get('application.store').find('person', guid);\n        }\n        return this.get('otherPartyThatIsNotTheInitiator');\n    }),\n\n    setLastPartyTalkingTo: observer('connectedParties.[]', function () {\n        const connectedParties = _.reject(this.get('connectedParties'), party => {\n            return party && party.userId === this.get('myGuid');\n        });\n        if (connectedParties.length > 0) {\n            return this.set('lastPartyTalkingTo', _.head(connectedParties));\n        }\n    }),\n\n    lastPartyTalkingToModel: computed('lastPartyTalkingTo', function () {\n        const guid = userGuidFromParticipant(this.get('lastPartyTalkingTo'));\n        if (guid) {\n            return this.get('application.store').find('person', guid);\n        }\n        return this.get('lastPartyTalkingTo');\n    }),\n\n    consultOtherParty: computed(\n        'participants.[]',\n        'onCall',\n        'lastDisconnectedPartyModel',\n        'lastPartyTalkingToModel',\n        'otherParties.[]',\n        'conversationIsAConsult',\n        'conversationInitiator',\n        'sortedDisconnectedParties',\n        'connectedParties',\n        'iAmInitiatorOfConsult',\n        'initiatorModel',\n        'otherPartyThatIsNotTheInitiator',\n        function () {\n            const initiatorModel = this.get('initiatorModel');\n            const initiator = _.find(this.get('participants'), party => {\n                return party && party.userId === this.get('conversationInitiator.userId');\n            });\n            const initiatorCall = _.head(initiator && initiator.calls);\n            const initiatorConnected = initiatorCall && initiatorCall.state.toLowerCase() === 'connected';\n            const otherPartyThatIsNotTheInitiatorCall = this.get('otherPartyThatIsNotTheInitiator').calls[0];\n            const otherPartyThatIsNotTheInitiatorConnected =\n                otherPartyThatIsNotTheInitiatorCall.state.toLowerCase() === 'connected';\n            if (this.get('iAmInitiatorOfConsult')) {\n                if (this.get('onCall')) {\n                    return _.head(this.get('otherParties'));\n                }\n                if (this.get('connectedParties.length') < 1) {\n                    return this.get('lastDisconnectedPartyModel');\n                }\n                return _.head(this.get('connectedParties'));\n            } else {\n                if (initiatorConnected) {\n                    return initiatorModel;\n                }\n                if (otherPartyThatIsNotTheInitiatorConnected) {\n                    return this.get('otherPartyThatIsNotTheInitiatorModel');\n                }\n                if (this.get('otherPartyModel') === undefined) {\n                    return this.get('lastPartyTalkingToModel');\n                }\n                return this.get('otherPartyModel');\n            }\n        }\n    ),\n\n    consultOtherPartyModel: computed('consultOtherParty', 'participants.[]', 'onCall', function () {\n        const guid = userGuidFromParticipant(this.get('consultOtherParty'));\n        if (guid) {\n            return this.get('application.store').find('person', guid);\n        }\n        return this.get('consultOtherParty');\n    }),\n\n    participantModels: computed('participants.[]', function () {\n        const participants = _.reject(this.get('participants'), participant => {\n            const guid = userGuidFromParticipant(participant);\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            const isTerminated = maybeLowerCase(communication.state) !== 'terminated';\n            const isNotSelf = this.get('application.session.person.guid') !== guid;\n            return isTerminated && isNotSelf;\n        });\n        return _.map(participants, participant => {\n            const guid = userGuidFromParticipant(participant);\n            const name = participant && participant.name;\n            const model = guid ? this.get('application.store').find('person', guid) : { name };\n            return Object.assign(participant, { model });\n        });\n    }),\n\n    otherPartyModel: computed('otherParty', function () {\n        const otherParty = this.get('otherParty');\n        const guid = userGuidFromParticipant(otherParty);\n        const store = this.get('application.store');\n        if (!guid) {\n            return otherParty;\n        }\n        // running phone service test in isolation always threw an Ember Error:\n        // No model was found for 'person'\n        let personFromStore;\n        try {\n            personFromStore = store.findRecord('person', guid, { reload: false, backgroundReload: false });\n            if (personFromStore.catch) {\n                personFromStore.catch(() => otherParty);\n            }\n        } catch (e) {\n            personFromStore = otherParty;\n        }\n        return personFromStore;\n    }),\n\n    otherPartyNumber: computed('otherParty.address', function () {\n        const number = this.get('otherParty.address');\n        if (number && 'user' !== this.get('otherParty.purpose')) {\n            return this.get('addressformat').formatAddressForDisplay(number, null, { doLookup: true });\n        }\n    }),\n\n    otherParties: computed('participants.[]', function () {\n        const otherParties = _.filter(this.get('participants'), participant => {\n            const guid = userGuidFromParticipant(participant);\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            const purpose = maybeLowerCase(participant.purpose);\n            const state = maybeLowerCase(communication.state);\n            const notTerminatedOrDisconnected = state !== 'terminated' && state !== 'disconnected';\n            const isSelf = this.get('myGuid') === guid;\n            const isMonitor = !!participant.monitoredParticipantId;\n            const isCoach = !!participant.coachedParticipantId;\n            const isBarge = !!participant.bargedParticipantId;\n\n            if (notTerminatedOrDisconnected && !isMonitor && !isCoach && !isBarge) {\n                return !isSelf || (isSelf && purpose !== 'user');\n            }\n            return false;\n        });\n        return otherParties;\n    }),\n\n    disconnectedParties: computed('participants.[]', 'participants.@each.endTime', function () {\n        return _.filter(this.get('participants'), participant => {\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            const isDisconnected =\n                maybeLowerCase(communication.state) === 'disconnected' ||\n                maybeLowerCase(communication.state) === 'terminated';\n            return (\n                isDisconnected &&\n                participant.userId !== this.get('myGuid') &&\n                participant.purpose !== 'ivr' &&\n                participant.purpose !== 'group'\n            );\n        });\n    }),\n\n    sortedDisconnectedParties: computed.sort('disconnectedParties', function (a, b) {\n        return moment(b.endTime).valueOf() - moment(a.endTime).valueOf();\n    }),\n\n    lastDisconnectedPartyModel: computed('sortedDisconnectedParties', function () {\n        const last = _.last(this.get('sortedDisconnectedParties'));\n        const guid = userGuidFromParticipant(last);\n        if (guid) {\n            return this.get('application.store').find('person', guid);\n        }\n    }),\n\n    selfIsDisconnectedOrTerminated: function () {\n        const myself = this.get('myself');\n        if (!myself) {\n            return false;\n        }\n\n        const communication = _.head(myself.calls) || _.head(myself.callbacks) || {};\n        if (!communication) {\n            return false;\n        }\n\n        const myState = maybeLowerCase(communication.state);\n        return myState === 'disconnected' || myState === 'terminated';\n    },\n\n    otherParty: computed('otherParties.[]', 'connectedParties.[]', 'onConsult', function () {\n        const useDisconnectedParties = this.selfIsDisconnectedOrTerminated();\n        let parties = useDisconnectedParties ? this.get('disconnectedParties') : this.get('connectedParties');\n\n        parties = parties.reject(\n            p =>\n                p.purpose === 'ivr' ||\n                p.purpose === 'group' ||\n                p.userId === this.get('myGuid') ||\n                !!p.coachedParticipantId ||\n                !!p.monitoredParticipantId ||\n                !!p.bargedParticipantId // Both ACD and Communicate should not display monitor/coached or barged in users\n        );\n\n        if (parties.length > 0) {\n            return parties.get('lastObject');\n        }\n        const otherParties = this.get('otherParties').reject(p => p.purpose === 'ivr' || p.purpose === 'group');\n        return otherParties.get('lastObject');\n    }),\n\n    allParties: computed('participants.[]', function () {\n        return _.filter(this.get('participants'), participant => {\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            return communication.state && communication.state !== 'terminated';\n        });\n    }),\n\n    connectedParties: computed('participants.[]', function () {\n        return _.filter(this.get('participants'), participant => {\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            return maybeLowerCase(communication.state) === 'connected';\n        });\n    }),\n\n    connectedOnConsult: computed('connectedParties.[]', function () {\n        return _.reject(this.get('connectedParties'), participant => {\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            return communication.confined === 'true';\n        });\n    }),\n\n    callParties: computed('onConference', 'onConsult', 'allParties.[]', 'otherParties.[]', 'otherParty', function () {\n        if (!this.get('onConference')) {\n            return this.get('onConsult') ? this.get('otherParties') : [this.get('otherParty')];\n        }\n        const firstCall = party => _.head(party.calls) || _.head(party.callbacks);\n        const isDisconnected = call =>\n            call && (call.state.toLowerCase() === 'disconnected' || call.state.toLowerCase() === 'terminated');\n        const sortedParties = this.get('allParties').sort((a, b) => {\n            const state = 'disconnected';\n            const callStateA = _.head(a.calls).state.toLowerCase() === state ? 0 : 1;\n            const callStateB = _.head(b.calls).state.toLowerCase() === state ? 0 : 1;\n            return callStateA - callStateB;\n        });\n        const parties = _.reject(sortedParties, party => {\n            const disconnected = isDisconnected(firstCall(party));\n            return disconnected && moment().isAfter(moment(party.endTime).add(20, 'seconds'));\n        });\n        const arePartiesDisconnected = _.some(parties, party => {\n            return isDisconnected(firstCall(party));\n        });\n        if (arePartiesDisconnected) {\n            const timer = run.debounce(this, this.recomputeParties, 12000);\n            this.set('_recomputePartiesTimer', timer);\n        }\n        return parties;\n    }),\n\n    otherDisconnectedParty: computed(\n        'participants.[]',\n        'conversationIsAConsult',\n        'iAmInitiatorOfConsult',\n        'lastPartyTalkingToModel',\n        'sortedDisconnectedParties',\n        function () {\n            const isConsult = this.get('conversationIsAConsult');\n            if (isConsult && !this.get('iAmInitiatorOfConsult')) {\n                return this.get('lastPartyTalkingToModel');\n            }\n            const otherParties = _.filter(this.get('participants'), party => {\n                const guid = userGuidFromParticipant(party);\n                const isSelf = guid === this.get('myGuid');\n                const isOngoing = party.endTime === undefined;\n                const isGroup = party.purpose === 'group';\n                const isStation = party.purpose === 'station';\n                const isIvr = party.purpose === 'ivr';\n                return !isSelf && (isConsult ? isOngoing : true) && !isGroup && !isStation && !isIvr;\n            });\n            if (otherParties.length > 1) {\n                /**\n                 * When group ring call ends, there's a period where the endTime properties are set on some\n                 * of the participants but not all. This can cause the display to be incorrect.\n                 */\n                const otherPartiesNoEndTime = otherParties.filter(otherParty => !Ember.get(otherParty, 'endTime'));\n                return _.head(otherPartiesNoEndTime);\n            }\n\n            return _.head(otherParties);\n        }\n    ),\n\n    otherDisconnectedPartyModel: computed('otherDisconnectedParty', function () {\n        const participant = this.get('otherDisconnectedParty');\n        if (participant) {\n            if (get(participant, 'purpose') === 'acd') {\n                return this.get('application.store').find('queue', participant.queueId);\n            }\n            const guid = userGuidFromParticipant(participant);\n            return guid ? this.get('application.store').find('person', guid) : participant;\n        }\n    }),\n\n    recomputeParties() {\n        return this.notifyPropertyChange('callParties');\n    },\n\n    initiator: computed(\n        'participants.[]',\n        'otherParties.[]',\n        'onConsult',\n        'participants.@each.consultParticipantId',\n        function () {\n            return _.find(this.get('participants'), party => {\n                const initiator = get(party, 'attributes.consultInitiator');\n                return initiator === 'true' || initiator === true;\n            });\n        }\n    ),\n\n    initiatorModel: computed('conversationInitiator', 'initiator', function () {\n        const participant = this.get('conversationInitiator');\n        const guid = userGuidFromParticipant(participant);\n        return guid ? this.get('application.store').find('person', guid) : participant;\n    }),\n\n    isDisconnectedQueueCall: computed('otherDisconnectedParty', function () {\n        return this.get('otherDisconnectedParty.purpose') === 'acd';\n    }),\n\n    setConsultInitiator: observer('initiator', 'conversationIsAConsult', function () {\n        const initiator = this.get('initiator');\n        if (!_.isEmpty(initiator) && this.get('conversationIsAConsult')) {\n            return this.set('conversationInitiator', initiator);\n        }\n    }),\n\n    nonInitiatorNumber: computed('otherParties.[]', 'onConsult', 'myself', function () {\n        const myConsultId = this.get('myself.consultParticipantId');\n        const consultParty = _.filter(this.get('otherParties'), party => {\n            return party.id === myConsultId;\n        });\n        const nonInitiator = _.last(consultParty);\n        return this.get('addressformat').formatAddressForDisplay(nonInitiator.address);\n    }),\n\n    hasActiveAgent: computed('participants.@each.purpose', 'myGuid', function () {\n        // Check to see if the current user has an agent participant\n        // that is not currently wrapped up.\n        return _.some(this.get('participants'), participant => {\n            const isMe = this.get('myGuid') === userGuidFromParticipant(participant);\n            const isAgent = participant.purpose.toLowerCase() === 'agent';\n            const needsWrapup = !!participant.wrapupRequired && participant.wrapup === undefined;\n            return isMe && isAgent && needsWrapup;\n        });\n    }),\n\n    myGuid: computed.reads('session.person.guid'),\n    myself: computed('participants.[]', 'myGuid', 'hasActiveAgent', function () {\n        const hasActiveAgent = this.get('hasActiveAgent');\n        return _.findLast(this.get('participants'), participant => {\n            const isMe = this.get('myGuid') === userGuidFromParticipant(participant);\n            const purpose = (participant.purpose || '').toLowerCase();\n            const isAgent = purpose === 'agent';\n            const isUser = purpose === 'user';\n            const needsWrapup = !!participant.wrapupRequired && participant.wrapup === undefined;\n            let isAlerting = false;\n\n            try {\n                const state = participant.calls[0].state.toLowerCase();\n                isAlerting = state === 'alerting';\n            } catch (e) {\n                isAlerting = false;\n            }\n\n            // If the user has an unwrapped up agent participant, set that as their\n            // current participant.\n            if (hasActiveAgent) {\n                return isMe && isAgent && (needsWrapup || isAlerting);\n            }\n\n            // Otherwise, we just use the last participant for the user\n            // to represent their state.\n            return isMe && (isAgent || isUser);\n        });\n    }),\n\n    myselfIsMonitor: computed.bool('myself.monitoredParticipantId'),\n    myselfIsCoach: computed.bool('myself.coachedParticipantId'),\n\n    myselfIsBarged: computed('myself.bargedParticipantId', function () {\n        const bargedParticipantId = this.get('myself.bargedParticipantId');\n        const bargedParticipant =\n            (this.get('participants') || []).find(participant => participant.id === bargedParticipantId) || {};\n\n        const disconnectType = get(bargedParticipant, 'calls.firstObject.disconnectType');\n        return bargedParticipantId && !disconnectType;\n    }),\n\n    myselfIsMCB: computed.or('myselfIsMonitor', 'myselfIsCoach', 'myselfIsBarged'),\n\n    monitoredParticipant: computed('myselfIsMonitor', 'myself.monitoredParticipantId', 'allParties', function () {\n        if (this.get('myselfIsMonitor')) {\n            return this.get('allParties').findBy('id', this.get('myself.monitoredParticipantId'));\n        }\n        return null;\n    }),\n\n    coachedParticipant: computed('myselfIsCoach', 'myself.coachedParticipantId', 'allParties', function () {\n        if (this.get('myselfIsCoach')) {\n            return this.get('allParties').findBy('id', this.get('myself.coachedParticipantId'));\n        }\n        return null;\n    }),\n\n    bargedParticipant: computed('myselfIsBarged', 'myself.bargedParticipantId', 'allParties', function () {\n        if (this.get('myselfIsBarged')) {\n            return this.get('allParties').findBy('id', this.get('myself.bargedParticipantId'));\n        }\n        return null;\n    }),\n\n    monitoredParticipantPerson: computed('monitoredParticipant', function () {\n        const monitoredParticipant = this.get('monitoredParticipant');\n        const guid = userGuidFromParticipant(monitoredParticipant);\n        const store = this.get('application.store');\n        if (!guid) {\n            return monitoredParticipant;\n        }\n        let personFromStore;\n        try {\n            personFromStore = store.findRecord('person', guid, { reload: false, backgroundReload: false });\n            if (personFromStore.catch) {\n                personFromStore.catch(() => monitoredParticipant);\n            }\n        } catch (e) {\n            personFromStore = monitoredParticipant;\n        }\n        return personFromStore;\n    }),\n\n    coachedParticipantPerson: computed('coachedParticipant', function () {\n        const coachedParticipant = this.get('coachedParticipant');\n        const guid = userGuidFromParticipant(coachedParticipant);\n        const store = this.get('application.store');\n        if (!guid) {\n            return coachedParticipant;\n        }\n        let personFromStore;\n        try {\n            personFromStore = store.findRecord('person', guid, { reload: false, backgroundReload: false });\n            if (personFromStore.catch) {\n                personFromStore.catch(() => coachedParticipant);\n            }\n        } catch (e) {\n            personFromStore = coachedParticipant;\n        }\n        return personFromStore;\n    }),\n    bargedParticipantPerson: computed('bargedParticipant', function () {\n        const bargedParticipant = this.get('bargedParticipant');\n        const guid = userGuidFromParticipant(bargedParticipant);\n        const store = this.get('application.store');\n        if (!guid) {\n            return bargedParticipant;\n        }\n        let personFromStore;\n        try {\n            personFromStore = store.findRecord('person', guid, { reload: false, backgroundReload: false });\n            if (personFromStore.catch) {\n                personFromStore.catch(() => bargedParticipant);\n            }\n        } catch (e) {\n            personFromStore = bargedParticipant;\n        }\n        return personFromStore;\n    }),\n\n    isAgentCall: computed('participants.[]', 'myself', 'myselfIsMCB', function () {\n        const isSelfMCB = this.get('myselfIsMCB');\n\n        // Otherwise, if there is another agent on the call, I want to view this conversation in ACD.\n        const participants = this.get('participants') || [];\n        return participants.some(user => maybeLowerCase(user.purpose) === 'agent') || isSelfMCB;\n    }),\n\n    isAfterCallWorkCompleted: computed('myself.wrapup', 'myself.wrapupRequired', function () {\n        const result = this.get('myself.wrapup') || !this.get('myself.wrapupRequired');\n        return result;\n    }),\n\n    isAfterCallWorkForcedTimeout: computed('myself.{wrapupPrompt,wrapupTimeoutMs}', function () {\n        const prompt = maybeLowerCase(this.get('myself.wrapupPrompt'));\n        return this.get('myself.wrapupTimeoutMs') && prompt === 'forcedtimeout';\n    }),\n    isAfterCallWorkTimeout: computed('myself.{wrapupPrompt,wrapupTimeoutMs}', function () {\n        const prompt = maybeLowerCase(this.get('myself.wrapupPrompt'));\n        return this.get('myself.wrapupTimeoutMs') && prompt === 'timeout';\n    }),\n\n    canUseCommunicationACW: true,\n\n    isWrapupPromptAgentRequested: computed(\n        'myself.{wrapupPrompt,wrapupTimeoutMs}',\n        'canUseCommunicationACW',\n        function () {\n            if (this.get('canUseCommunicationACW')) {\n                const prompt = maybeLowerCase(this.get('myself.wrapupPrompt'));\n                return !!this.get('myself.wrapupTimeoutMs') && prompt === 'agentrequested';\n            } else {\n                return false;\n            }\n        }\n    ),\n\n    isNonDiscretionaryCompletion: computed.or(\n        'isWrapupPromptAgentRequested',\n        'isAfterCallWorkForcedTimeout',\n        'isAfterCallWorkTimeout'\n    ),\n\n    isAfterCallWorkMandatory: computed('myself.wrapupPrompt', 'isNonDiscretionaryCompletion', function () {\n        const prompt = maybeLowerCase(this.get('myself.wrapupPrompt'));\n        return prompt === 'mandatory' || this.get('isNonDiscretionaryCompletion');\n    }),\n\n    callState: computed.reads('myself.calls.firstObject'),\n    peerDisconnectedCall: computed('callState.disconnectType', function () {\n        const disconnectType = maybeLowerCase(this.get('callState.disconnectType'));\n        return disconnectType === 'peer';\n    }),\n\n    myselfDisconnectedCall: computed('callState.disconnectType', function () {\n        const disconnectType = maybeLowerCase(this.get('callState.disconnectType'));\n        return disconnectType === 'client';\n    }),\n\n    errorInfo: computed.reads('callState.errorInfo'),\n    errorInfoMessage: computed.reads('errorInfo.message'),\n\n    isIncoming: computed('callState.state', function () {\n        return maybeLowerCase(this.get('callState.state')) === 'alerting';\n    }),\n\n    isDialing: computed('callState.state', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state === 'alerting' || state === 'contacting' || state === 'dialing';\n    }),\n\n    isRinging: computed('callState.state', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state === 'alerting';\n    }),\n\n    isDialingOrContacting: computed('callState.state', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state === 'contacting' || state === 'dialing';\n    }),\n\n    isContacting: computed('callState.state', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state === 'contacting';\n    }),\n\n    justMyselfOnCall: computed('participants.[]', 'myGuid', 'isContacting', function () {\n        const iAmContacting =\n            this.get('participants.firstObject.userId') === this.get('myGuid') && this.get('isContacting');\n        return this.get('participants').length === 1 && iAmContacting;\n    }),\n\n    theOtherPartyWhileContacting: computed('justMyselfOnCall', 'attemptingToCall', function () {\n        if (!this.get('justMyselfOnCall')) {\n            return;\n        }\n        const address = this.get('attemptingToCall');\n        if (address) {\n            const userId = Ember.get(address, 'userId');\n            const calls = [{ state: 'ALERTING' }];\n            return { userId, address, calls };\n        }\n    }),\n\n    isOutbound: computed('callState.direction', function () {\n        const direction = this.get('callState.direction');\n        return maybeLowerCase(direction) === 'outbound';\n    }),\n\n    isMissed: computed('callState.segments', 'isOutbound', function () {\n        const segments = this.get('callState.segments');\n        if (_.size(segments) === 1 && !this.get('isOutbound')) {\n            const segment = _.last(segments);\n            const { type, howEnded } = segment;\n            const lowType = type.toLowerCase();\n            const endedWithDisconnect = maybeLowerCase(howEnded) === 'disconnect';\n            return (lowType === 'dialing' || lowType === 'alert') && endedWithDisconnect;\n        }\n        return false;\n    }),\n\n    isActive: computed('phone.activeCall', function () {\n        return this.get('id') === this.get('phone.activeCall.id');\n    }),\n\n    isHeld: computed.and('callState.held', 'onCall'),\n    isConfined: computed.and('callState.confined', 'onCall', 'onConsult'),\n    isMuted: computed.and('callState.muted', 'onCall'),\n    isRecording: computed.and('callState.recording', 'onCall'),\n    isDisconnected: computed.not('onCall'),\n    wentToVoicemail: computed('allParties.@each.purpose', function () {\n        const parties = this.get('allParties');\n        if (!parties) {\n            return false;\n        }\n        const voicemail = parties.findBy('purpose', 'Voicemail') || parties.findBy('purpose', 'voicemail');\n        return !_.isEmpty(voicemail);\n    }),\n\n    voicemailParties: computed('wentToVoicemail', function () {\n        return _.filter(this.get('allParties'), party => {\n            return party && party.purpose === 'voicemail';\n        });\n    }),\n\n    onCall: computed('callState', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state !== 'disconnected' && state !== 'terminated';\n    }),\n\n    isConnected: computed('callState.state', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state === 'connected';\n    }),\n\n    onConsult: computed('otherParties.@each.calls', function () {\n        const others = this.get('otherParties');\n        const consultParties = others.filter(other => !!other.consultParticipantId);\n        if (consultParties.length !== 2) {\n            return false;\n        }\n        const found = _.find(others, other => other.consultParticipantId);\n        return !_.isEmpty(found);\n    }),\n\n    markCallAsConsult: observer('onConsult', 'participants.@each.consultParticipantId', 'participants.[]', function () {\n        const consult = _.find(this.get('participants'), participant => {\n            return participant.consultParticipantId;\n        });\n        if (this.get('onConsult') || consult) {\n            return this.set('conversationIsAConsult', true);\n        }\n    }),\n\n    /**\n     * @deprecated use `isActiveConference` from the interaction model instead\n     */\n    onConference: computed('maxParticipants', function () {\n        return this.get('maxParticipants') > 0;\n    }),\n\n    canUpdateConsult: computed('onConsult', 'participants.@each.attributes', function () {\n        const person = this.get('application.session.person');\n        const initiator = _.find(this.get('participants'), participant => {\n            const initiator = participant.attributes.consultInitiator;\n            return initiator === 'true' || initiator === true;\n        });\n        return get(initiator, 'userId') === person.get('guid');\n    }),\n\n    groupRingId: computed('participants.@each.purpose', function () {\n        // grab most recent group participant with endTime\n        // if no endTime, then that group participant is most recent\n        let mostRecentEndTime = null;\n        let groupParticipant = null;\n        for (const participant of this.get('participants')) {\n            const groupId = get(participant, 'groupId') || get(participant, 'group.id');\n            if (groupId) {\n                const currentTimestamp = moment(get(participant, 'endTime'));\n                // Compare with the current most recent timestamp\n                if (mostRecentEndTime === null || currentTimestamp.isAfter(mostRecentEndTime)) {\n                    mostRecentEndTime = currentTimestamp;\n                    groupParticipant = participant;\n                }\n            }\n        }\n        if (groupParticipant) {\n            return groupParticipant.groupId;\n        }\n        return null;\n    }),\n\n    isGroupRing: computed('groupRingId', function () {\n        return !!this.get('groupRingId');\n    }),\n\n    groupRingGroup: computed('groupRingId', function () {\n        const groupId = this.get('groupRingId');\n        if (groupId) {\n            let promise = this.get('application.store').findRecord('group', groupId, {\n                reload: false,\n                backgroundReload: false\n            });\n            return DS.PromiseObject.create({ promise });\n        }\n    }),\n\n    _groupRingCaller: computed('isGroupRing', 'participants', 'connectedParties.@each.purpose', function () {\n        if (!this.get('isGroupRing')) {\n            return null;\n        }\n\n        // We are going to mimic the callv2 behavior, for consistency\n        let participants = this.get('participants');\n        const outboundParticipant = participants.findBy('calls.firstObject.direction', 'outbound');\n\n        if (outboundParticipant) {\n            return outboundParticipant;\n        }\n\n        const externalParticipants = participants\n            .reject(p => {\n                return Ember.get(p, 'dnis') === 'unknown';\n            })\n            .filter(p => p.purpose === 'external' || p.purpose === 'customer');\n        const inboundExternal = externalParticipants.findBy('calls.firstObject.direction', 'inbound');\n        if (inboundExternal) {\n            return inboundExternal;\n        }\n\n        // Sometimes the initiator is indeterminate based on the data we get\n        // but it's not really necessary for rendering the component\n        return null;\n    }),\n\n    isOutboundGroupRing: computed('isOutbound', '_groupRingCaller', 'myGuid', function () {\n        return this.get('isOutbound') && this.get('_groupRingCaller.userId') === this.get('myGuid');\n    }),\n\n    groupRingCaller: computed('_groupRingCaller', function () {\n        const actualCaller = this.get('_groupRingCaller');\n        let caller = actualCaller;\n\n        if (caller && caller.userId) {\n            let promise = this.get('store').findRecord('person', caller.userId, {\n                reload: false,\n                backgroundReload: false\n            });\n            caller = DS.PromiseObject.create({ promise });\n        }\n        return caller;\n    }),\n\n    connectedToStationAndNotConference: computed('participants.[]', 'onConference', function () {\n        const participants = this.get('participants');\n        const anotherPartyIsStation = !!participants.find(p => {\n            const isStation = Ember.get(p, 'purpose') === 'station';\n            if (!isStation) {\n                return false;\n            }\n            const isStandaloneStation = Ember.get(p, 'name');\n            if (isStandaloneStation) {\n                return false;\n            }\n            return Ember.get(p, 'calls.firstObject.disconnectType') !== 'transfer.forward';\n        });\n        const anotherPartyIsVoicemail = !!participants.findBy('purpose', 'voicemail');\n        return anotherPartyIsStation && !this.get('onConference') && !anotherPartyIsVoicemail;\n    }),\n\n    _doesParticipantHaveActiveSessionShare: function (participant) {\n        const screenShares = Ember.get(participant, 'screenShares') || Ember.get(participant, 'screenshares');\n        const cobrowsesessions = Ember.get(participant, 'cobrowsesessions');\n        const videos = Ember.get(participant, 'videos');\n\n        let allMedia = [];\n        if (screenShares) {\n            allMedia = allMedia.concat(screenShares);\n        }\n        if (cobrowsesessions) {\n            allMedia = allMedia.concat(cobrowsesessions);\n        }\n        if (videos) {\n            allMedia = allMedia.concat(videos);\n        }\n\n        let connectedMedia = _.find(allMedia, media => media.state.toLowerCase() === 'connected');\n        return !!connectedMedia;\n    },\n\n    agentParticipants: computed('participants.[]', 'myGuid', function () {\n        return _.filter(this.get('participants'), participant => {\n            const guid = userGuidFromParticipant(participant);\n            const purpose = participant.purpose.toLowerCase();\n            return this.get('myGuid') === guid && (purpose === 'agent' || purpose === 'user');\n        });\n    }),\n\n    conversationHasActiveSessionShare: computed('agentParticipants.[]', function () {\n        let hasActiveMedia = _.some(this.get('agentParticipants'), participant => {\n            return this._doesParticipantHaveActiveSessionShare(participant);\n        });\n        return hasActiveMedia;\n    })\n});\n","define(\"connections-ui/models/conversation\", [\"exports\", \"ember-purecloud-components/models/conversation\"], function (_exports, _conversation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _conversation.default;\n    }\n  });\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    name: DS.attr('string'),\n    description: DS.attr('string'),\n    homeDivision: DS.attr('boolean')\n});\n","define(\"connections-ui/models/email-communication\", [\"exports\", \"ember-purecloud-components/models/email-communication\"], function (_exports, _emailCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emailCommunication.default;\n    }\n  });\n});\n","import TranslationModel from 'ember-intl/models/translation';\n\n/* Allows support for both dot-separated keys and nested objects in the dictionary\n * For example, all of the following are supported\n       {\n            'greeting': \"Hello!\",\n            \"error\": {\n                \"catastrophic.failure\": \"The world has ended.\"\n            },\n            \"my.favorite.color\": \"fuchsia\"\n       }\n*/\nexport default TranslationModel.extend({\n    addTranslation(key, value) {\n        this.get('translations')[key] = value;\n    },\n    getValue(key) {\n        if (key) {\n            let segments = key.split('.');\n            let level = this.get('translations');\n            let i = 0;\n\n            for (i = 0; i < segments.length; i++) {\n                let value = level[segments.slice(i).join('.')];\n\n                if (typeof value === 'string') {\n                    return value;\n                }\n\n                let segment = segments[i];\n\n                if (Object.prototype.hasOwnProperty.call(level, segment)) {\n                    level = level[segment];\n                } else {\n                    break;\n                }\n            }\n        }\n\n        return undefined;\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Object.extend({\n    id: null,\n    agent: null,\n    agentHasRead: null,\n    assignedDate: null,\n    releaseDate: null,\n    changedDate: null,\n    conversation: null,\n    evaluationForm: null,\n    evaluator: null,\n    status: null,\n    redacted: false,\n    selected: false,\n    rescore: false,\n    mediaType: [],\n    conversationDate: null,\n    assignee: null,\n    dateAssigneeChanged: null,\n    declinedReview: false,\n\n    displayThumbnail: Ember.computed('agent.userImages', function () {\n        if (this.get('agent.userImages.length')) {\n            return this.get('agent.userImages.firstObject');\n        }\n        return { imageUri: null };\n    })\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport EntityMixin from '../mixins/entity';\n\nconst { computed } = Ember;\n\nexport default DS.Model.extend(EntityMixin, {\n    title: computed('general.title.@each.value', function () {\n        const field = this.getFieldValue('general.title');\n        return field && field.value;\n    }),\n\n    department: computed('general.department.@each.value', function () {\n        const field = this.getFieldValue('general.department');\n        return field && field.value;\n    }),\n\n    organization: computed('general.organization.@each.value', function () {\n        const field = this.getFieldValue('general.organization');\n        return field && field.value;\n    }),\n\n    description: computed('general.notes.@each.value', function () {\n        const field = this.getFieldValue('general.notes')[0];\n        return field && field.value;\n    }),\n\n    phone: computed('contactInfo.phone.@each.value', function () {\n        const field = this.getFieldValue('contactInfo.phone');\n        return field && field[0];\n    }),\n\n    email: computed('contactInfo.email.@each.value', function () {\n        const field = this.getFieldValue('contactInfo.email');\n        return field && field.value;\n    })\n});\n","import DS from 'ember-data';\n\n// This is like a \"union\" type pf the various Relate domain messaging ID types (see the FacebookId, LineId, TwitterId\n// and WhatsApp domain classes in the Relate contact-service project).\n//\n// Also refer to the *_id models in this directory\n//\n// An Ember DS record of this type is built from the inbound message to help detect changes between the message's info, and\n// channel info from an external contact in Relate for the same channel.\nexport default DS.Model.extend({\n    type: DS.attr('string'), // Meta info about the channel\n    channelIdProperty: DS.attr('string'), // Meta info about the domain class property name for the channel (e.g. \"lineId\" or \"twitterId\")\n    isNewChannel: DS.attr('boolean'), // Meta info -- true if this is a new channel for an external contact\n    changesIgnoredByAgent: DS.attr('boolean'), // Meta info -- true if the agent was prompted to accept or ignore detected channel info changes, and they elected to ignore\n    agentRespondedToPrompt: DS.attr('boolean'), // Meta info -- true if the agent was prompted to accept or ignore detected channel info changes, and they responded\n    userId: DS.attr('string'), // The ID of the user from the channel\n    ids: DS.attr(), // An array of strings representing an array of user IDs for the channel (for Facebook or LINE)\n    name: DS.attr('string'), // The name of the user (for Twitter)\n    displayName: DS.attr('string'), // For display name of the user (for LINE, Facebook, and WhatsApp)\n    screenName: DS.attr('string'), // The screen name (AKA handle) of the user (for Twitter)\n    phoneNumber: DS.attr() // Includes e164: an e164-formatted phone number, and display: a display-friendly phone number (for Whatsapp),\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    channelId: DS.attr('string'),\n    isNewChannel: DS.attr('boolean')\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport moment from '../../utils/dates';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\n\nexport const PreferredPhoneContactOrder = ['workPhone', 'homePhone', 'cellPhone', 'otherPhone', 'whatsAppId'];\nexport const PreferredEmailContactOrder = ['workEmail', 'personalEmail', 'otherEmail'];\nexport const ENTITY_TYPE = 'externalcontacts/contact';\n\nconst { computed } = Ember;\nconst SERVICE_ERROR = 'SERVICE_ERROR';\n\nexport default DS.Model.extend(RelateFeaturesMixin, {\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    names: Ember.inject.service(),\n    schemaService: Ember.inject.service('schema'),\n    schemaType: 'contact',\n    type: ENTITY_TYPE,\n    externalDataSources: DS.attr(),\n    externalOrganizationId: DS.attr('string'),\n    createDate: DS.attr('string'),\n    modifyDate: DS.attr('string'),\n    firstName: DS.attr('string'),\n    middleName: DS.attr('string'),\n    lastName: DS.attr('string'),\n    title: DS.attr('string'),\n    address: DS.attr(),\n    workPhone: DS.attr(),\n    cellPhone: DS.attr(),\n    homePhone: DS.attr(),\n    otherPhone: DS.attr(),\n    workEmail: DS.attr('string'),\n    personalEmail: DS.attr('string'),\n    otherEmail: DS.attr('string'),\n    twitterId: DS.attr(),\n    lineId: DS.attr(),\n    facebookId: DS.attr(),\n    whatsAppId: DS.attr(),\n    surveyOptOut: DS.attr('boolean', { defaultValue: false }),\n\n    schema: DS.attr(),\n    customFields: DS.attr(),\n\n    division: DS.attr(),\n\n    contactType: DS.attr(),\n    mergedTo: DS.attr(),\n    mergedFrom: DS.attr(),\n    canonicalContact: DS.attr(),\n    mergeSet: DS.attr(),\n\n    isCurated: computed('contactType', function () {\n        return this.get('contactType') === 'curated';\n    }),\n    isIdentified: computed('contactType', function () {\n        return this.get('contactType') === 'identified';\n    }),\n\n    canonicalId: computed.alias('canonicalContact.id'),\n    divisionName: computed.alias('division.name'),\n    isCanonical: computed('id', 'canonicalId', function () {\n        const { canonicalId, id } = this.getProperties('canonicalId', 'id');\n        return canonicalId === id;\n    }),\n\n    phoneNumber: null, // Set by the entity-mini/external-contact/component as the phone number the user selected\n    phoneType: null, // Set by the entity-mini/external-contact/component as the phone numbers type the user selected\n    externalOrganization: DS.belongsTo('externalcontacts/externalOrganization', { async: false }),\n    externalSystemUrl: DS.attr('string'),\n\n    createdDate: computed('createDate', function () {\n        return moment(this.get('createDate')).format('L');\n    }),\n    lastUpdated: computed('modifyDate', function () {\n        return moment(this.get('modifyDate')).format('L');\n    }),\n\n    hasEmailAddresses: Ember.computed.bool('bestEmailAddress'),\n\n    //these aliases are used to aid in validation.\n    address1: computed.alias('address.address1'),\n    address2: computed.alias('address.address2'),\n    city: computed.alias('address.city'),\n    state: computed.alias('address.state'),\n    postalCode: computed.alias('address.postalCode'),\n    countryCode: computed.alias('address.countryCode'),\n\n    twitter: computed.alias('twitterId.screenName'),\n\n    isSalesForce: computed.bool('salesforceLink'),\n    acdOutboundWhatsApp: true,\n\n    init() {\n        this._super(...arguments);\n        PreferredPhoneContactOrder.forEach(phoneName => {\n            const featureKey =\n                phoneName === 'whatsAppId' ? phoneName.replace('Id', 'Number') : phoneName.replace('Phone', 'Number');\n            const featureKeyExt = `${featureKey}Ext`;\n            const featureKeyAcceptsSMS = `${featureKey}AcceptsSMS`;\n\n            this.set(featureKey, computed.alias(`${phoneName}.display`));\n            this.set(featureKeyExt, computed.alias(`${phoneName}.extension`));\n            this.set(featureKeyAcceptsSMS, computed.alias(`${phoneName}.acceptsSMS`));\n        });\n    },\n\n    initials: computed('firstName', 'lastName', function () {\n        return this.get('names').initials(this);\n    }),\n    name: computed('firstName', 'lastName', 'middleName', function () {\n        return this.get('names').fullName(this);\n    }),\n    /**\n     * Gets the best email available for this contact, or undefined if there is none\n     */\n    bestEmailAddress: computed(...PreferredEmailContactOrder, function () {\n        const preferredEmailType = this._bestEmailType();\n        return preferredEmailType ? this.get(preferredEmailType) : null;\n    }),\n\n    /**\n     * Gets the best email type available for this contact, or undefined if there is none\n     */\n    bestEmailType: computed(...PreferredEmailContactOrder, function () {\n        return this._bestEmailType();\n    }),\n\n    /**\n     * Gets the best number available for this contact, or undefined if there is none\n     */\n    bestPhoneNumber: computed('phoneNumber', ...PreferredPhoneContactOrder, function () {\n        const phoneType = this._bestPhoneType(PreferredPhoneContactOrder);\n        return this.get('acdOutboundWhatsApp') && phoneType === 'whatsAppId'\n            ? this.get(`${phoneType}.phoneNumber.e164`) || this.get(`${phoneType}.phoneNumber.display`)\n            : this.get(`${phoneType}.e164`) || this.get(`${phoneType}.display`);\n    }),\n\n    /**\n     * Gets the best number available for this contact, or undefined if there is none\n     */\n    bestPhoneNumberDisplay: computed('phoneNumber', ...PreferredPhoneContactOrder, function () {\n        const phoneType = this._bestPhoneType(PreferredPhoneContactOrder);\n        return phoneType === 'whatsAppId'\n            ? this.get(`${phoneType}.phoneNumber.display`) || this.get(`${phoneType}.phoneNumber.e164`)\n            : this.get(`${phoneType}.display`) || this.get(`${phoneType}.e164`);\n    }),\n\n    /**\n     * Gets the best phone type localized string available for this contact, or undefined if there is none\n     */\n    bestPhoneType: computed(...PreferredPhoneContactOrder, function () {\n        const bestPhoneType = this._bestPhoneType(PreferredPhoneContactOrder);\n        if (bestPhoneType === 'whatsAppId')\n            return this.get('intl').t('purecloud.acdInteraction.relate.channelTypes.whatsapp');\n        return bestPhoneType\n            ? this.get('intl').t(`purecloud.acdInteraction.relate.phoneTypes.${bestPhoneType}`)\n            : undefined;\n    }),\n\n    /**\n     * Gets the best phone type parameter key available for this contact, or undefined if there is none\n     */\n    bestPhoneTypeKey: computed(...PreferredPhoneContactOrder, function () {\n        const bestPhoneType = this._bestPhoneType(PreferredPhoneContactOrder);\n        return bestPhoneType ? bestPhoneType : undefined;\n    }),\n\n    adapterDidCommit() {\n        return; // Does nothing but prevent \"TypeError: _this.adapterDidCommit is not a function(�)\" when canceling an edit due to a EntityMixin call to that method\n    },\n\n    getEmailTitleFor(emailType) {\n        return emailType\n            ? this.get('intl').t(`purecloud.acdInteraction.relate.emailTypes.${emailType}`)\n            : this.get('intl').t('purecloud.acdInteraction.relate.emailTypes.otherEmail');\n    },\n\n    getPhoneTitleFor(phoneType) {\n        if (phoneType === 'whatsAppId')\n            return this.get('intl').t('purecloud.acdInteraction.relate.channelTypes.whatsapp');\n        return phoneType\n            ? this.get('intl').t(`purecloud.acdInteraction.relate.phoneTypes.${phoneType}`)\n            : this.get('intl').t('purecloud.acdInteraction.relate.phoneTypes.otherPhone');\n    },\n\n    _bestEmailType() {\n        return PreferredEmailContactOrder.find(emailType => this.get(emailType));\n    },\n\n    _bestPhoneType(types) {\n        return (\n            this.get('phoneType') ||\n            types.find(type => {\n                return this.get(`${type}.e164`) || this.get(`${type}.display`);\n            }) ||\n            types.find(type => {\n                return this.get(`${type}.phoneNumber.e164`) || this.get(`${type}.phoneNumber.display`);\n            })\n        );\n    },\n\n    hasEmailAddress(address) {\n        return PreferredEmailContactOrder.some(emailType => this.get(emailType) && this.get(emailType) === address);\n    },\n\n    externalDataSourcesAlert: computed('externalDataSources', function () {\n        const externalDataSources = this.get('externalDataSources') || [];\n        return externalDataSources.any(externalDataSource => externalDataSource.platform === '');\n    }),\n\n    salesforceLink: computed('externalDataSources', function () {\n        const externalDataSources = this.get('externalDataSources') || [];\n        return externalDataSources\n            .filter(externalDataSource => externalDataSource.platform === 'SALESFORCE')\n            .mapBy('url')\n            .get('firstObject');\n    }),\n\n    expandedSchema: computed('schema.id', 'canShowCustomFields', 'schemaType', async function () {\n        const id = this.get('schema.id');\n        const schemaType = this.get('schemaType');\n\n        if (this.get('canShowCustomFields') && id) {\n            return await this.get('schemaService')\n                .getSchema(schemaType, id)\n                .catch(() => {\n                    return SERVICE_ERROR;\n                });\n        } else {\n            return '';\n        }\n    }),\n\n    schemaTitle: computed('expandedSchema', async function () {\n        const schemaData = await this.get('expandedSchema').catch(() => {\n            return SERVICE_ERROR;\n        });\n\n        return schemaData && schemaData !== SERVICE_ERROR ? schemaData.get('name') : schemaData;\n    })\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\nimport moment from '../../utils/dates';\n\nconst { computed } = Ember;\nexport const PreferredPhoneContactOrder = ['phoneNumber', 'faxNumber'];\nconst getSetter = function (index) {\n    return {\n        get() {\n            const websites = this.get('websites');\n            return websites ? websites[index] : null;\n        },\n        set(key, value) {\n            const websites = this.get('websites');\n            websites[index] = value;\n            return websites[index];\n        }\n    };\n};\nconst SERVICE_ERROR = 'SERVICE_ERROR';\n\nexport default DS.Model.extend(RelateFeaturesMixin, {\n    isOrganization: true,\n    schemaService: Ember.inject.service('schema'),\n    schemaType: 'external-org',\n    type: 'externalcontacts/externalOrganization',\n    name: DS.attr('string'),\n    createDate: DS.attr('string'),\n    modifyDate: DS.attr('string'),\n    companyType: DS.attr('string'),\n    industry: DS.attr('string'),\n    primaryContactId: DS.attr('string'),\n    address: DS.attr(),\n    phoneNumber: DS.attr(),\n    faxNumber: DS.attr(),\n    employeeCount: DS.attr('number'),\n    revenue: DS.attr('number'),\n    tags: DS.attr(),\n    tickers: DS.attr(),\n    websites: DS.attr(),\n    twitterId: DS.attr(),\n    contact: DS.hasMany('externalcontacts/contact', { async: false }),\n    externalDataSources: DS.attr(),\n    externalSystemUrl: DS.attr('string'),\n    isSalesForce: computed.bool('salesforceLink'),\n    schema: DS.attr(),\n    customFields: DS.attr(),\n\n    init() {\n        this._super(...arguments);\n        PreferredPhoneContactOrder.forEach(phoneName => {\n            const featureKey = phoneName.replace('Number', '');\n            const featureKeyExt = `${featureKey}Ext`;\n            const featureKeyAcceptsSMS = `${featureKey}AcceptsSMS`;\n\n            this.set(featureKey, computed.alias(`${phoneName}.display`));\n            this.set(featureKeyExt, computed.alias(`${phoneName}.extension`));\n            this.set(featureKeyAcceptsSMS, computed.alias(`${phoneName}.acceptsSMS`));\n        });\n    },\n\n    createdDate: computed('createDate', function () {\n        return moment(this.get('createDate')).format('L');\n    }),\n    lastUpdated: computed('modifyDate', function () {\n        return moment(this.get('modifyDate')).format('L');\n    }),\n\n    website1: computed('websites.[]', getSetter.call(this, 0)),\n    website2: computed('websites.[]', getSetter.call(this, 1)),\n    //these aliases are used to aid in validation.\n\n    address1: computed.alias('address.address1'),\n    address2: computed.alias('address.address2'),\n    city: computed.alias('address.city'),\n    state: computed.alias('address.state'),\n    postalCode: computed.alias('address.postalCode'),\n    countryCode: computed.alias('address.countryCode'),\n\n    twitter: computed.alias('twitterId.screenName'),\n\n    externalDataSourcesAlert: computed('externalDataSources', function () {\n        const externalDataSources = this.get('externalDataSources') || [];\n        return externalDataSources.any(externalDataSource => externalDataSource.platform === '');\n    }),\n\n    salesforceLink: computed('externalDataSources', function () {\n        const externalDataSources = this.get('externalDataSources') || [];\n        return externalDataSources\n            .filter(externalDataSource => externalDataSource.platform === 'SALESFORCE')\n            .mapBy('url')\n            .get('firstObject');\n    }),\n\n    expandedSchema: computed('schema.id', 'canShowCustomFields', 'schemaType', async function () {\n        const id = this.get('schema.id');\n        const schemaType = this.get('schemaType');\n\n        return this.get('canShowCustomFields') && id ? await this.get('schemaService').getSchema(schemaType, id) : '';\n    }),\n\n    schemaTitle: computed('expandedSchema', async function () {\n        const schemaData = await this.get('expandedSchema').catch(() => {\n            return SERVICE_ERROR;\n        });\n\n        return schemaData ? schemaData.get('name') : '';\n    })\n});\n","import DS from 'ember-data';\nimport Channel from './channel';\n\nexport const FACEBOOKID_TYPE = 'externalcontacts/facebook-id';\n\nexport default Channel.extend({\n    type: 'facebook',\n    ids: DS.attr(),\n    displayName: DS.attr('string')\n});\n","import DS from 'ember-data';\nimport Channel from './channel';\n\nexport const LINEID_TYPE = 'externalcontacts/line-id';\n\nexport default Channel.extend({\n    type: 'line',\n    ids: DS.attr(),\n    displayName: DS.attr('string')\n});\n","import DS from 'ember-data';\nimport Channel from './channel';\n\nexport const TWITTERID_TYPE = 'externalcontacts/twitter-id';\n\nexport default Channel.extend({\n    type: 'twitter',\n    id: DS.attr('string'),\n    name: DS.attr('string'),\n    screenName: DS.attr('string')\n});\n","import DS from 'ember-data';\nimport Channel from './channel';\n\nexport const WHATSAPP_TYPE = 'externalcontacts/whatsapp-id';\n\nexport default Channel.extend({\n    type: 'whatsapp',\n    displayName: DS.attr('string'),\n    phoneNumber: DS.attr() // includes e164: an e164-formatted phone number, and display: a display-friendly phone number\n});\n","import Ember from 'ember';\n\nconst { computed, inject } = Ember;\n\nexport default Ember.Object.extend({\n    intl: inject.service(),\n\n    id: null,\n    name: null,\n    dateCreated: null,\n    dateModified: null,\n    contentUri: null,\n    workspace: null,\n    createdBy: null,\n    contentType: null,\n    contentLength: null,\n    filename: null,\n    read: false,\n    thumbnails: null,\n    selfUri: null,\n    callerAddress: '',\n    receiverAddress: '',\n    selected: false,\n\n    isDefaultName: computed('name', 'callerAddress', function () {\n        let name = this.get('name');\n        if (!name) {\n            return false;\n        }\n        return name.toLowerCase().indexOf('fax from ') === 0;\n    }),\n\n    faxName: computed('isDefaultName', 'name', 'callerAddress', function () {\n        if (this.get('isDefaultName')) {\n            return this.get('intl')\n                .t('notification.inbox.faxFrom', { callerAddress: this.get('callerAddress') })\n                .toString();\n        }\n        return this.get('name');\n    }),\n\n    faxFrom: computed('callerAddress', 'createdBy', function () {\n        const callerAddress = this.get('callerAddress');\n        if (callerAddress) {\n            return callerAddress;\n        }\n        return this.get('intl').lookup('notification.inbox.unknownSender');\n    }),\n\n    faxFile: computed('filename', 'name', function () {\n        const name = this.get('name');\n        if (name) {\n            return name;\n        }\n        return this.get('filename');\n    }),\n    displayThumbnail: computed('thumbnails.[]', function () {\n        const thumbnails = this.get('thumbnails');\n        return (\n            thumbnails[0] || {\n                imageUri: null\n            }\n        );\n    }),\n    /**\n     *  Converts 'this' into an object that can be passed to the faxes standalone app\n     * @returns An object with all of the properties of 'this' that are specified in props\n     */\n    getProperties: function () {\n        const props = [\n            'id',\n            'name',\n            'dateCreated',\n            'dateModified',\n            'contentUri',\n            'workspace',\n            'createdBy',\n            'contentType',\n            'contentLength',\n            'filename',\n            'read',\n            'thumbnails',\n            'pageCount',\n            'selfUri',\n            'callerAddress',\n            'receiverAddress',\n            'selected'\n        ];\n        return props.reduce((accumulator, prop) => {\n            return Object.assign(accumulator, { [prop]: this.get(prop) });\n        }, {});\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    enabled: DS.attr()\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    longitude: DS.attr(),\n    latitude: DS.attr(),\n    type: DS.attr(),\n    primary: DS.attr()\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { inject, computed, observer } = Ember;\n\nconst ISSUE_REGEX = /http(?:s)?:\\/\\/github\\.com\\/[a-zA-Z0-9_\\-.]+\\/[a-zA-Z0-9\\-.]+\\/issues\\/([0-9]+)$/i;\n\nexport default Ember.Object.extend({\n    intl: inject.service(),\n    preferences: inject.service(),\n\n    mediaType: null,\n\n    username: null,\n    url: null,\n    repo: null,\n    link: null,\n\n    data: null,\n\n    settings: {},\n    showEmbedConfirmation: false,\n\n    init() {\n        this._super(...arguments);\n\n        this.get('preferences.widgets.githubRepo'); // setup observer\n\n        this.get('preferences')\n            .getPreference('widgets.githubRepo')\n            .then(settings => {\n                if (settings === undefined) {\n                    this.set('showEmbedConfirmation', true);\n                } else {\n                    let showEmbed = false;\n                    if (settings.showEmbedConfirmation === undefined) {\n                        showEmbed = true;\n                    }\n                    this.set('settings', settings);\n                    this.set('showEmbedConfirmation', showEmbed);\n                }\n            });\n    },\n\n    isRepo: computed.equal('mediaType', 'github-repo'),\n    isGist: computed.equal('mediaType', 'github-gist'),\n\n    isIssue: computed('link', 'isRepo', function () {\n        if (!this.get('isRepo')) {\n            return false;\n        }\n\n        return ISSUE_REGEX.test(this.get('link'));\n    }),\n\n    issueNumber: computed('link', function () {\n        return _.last(this.get('link').match(ISSUE_REGEX));\n    }),\n\n    title: computed('username', 'repo', 'isRepo', 'isGist', 'isIssue', function () {\n        const intl = this.get('intl');\n        const username = this.get('username');\n        if (this.get('isGist')) {\n            return intl.t('chat.inlineMedia.gistTitle', { username }).toString();\n        } else if (this.get('isRepo')) {\n            const repo = this.get('repo');\n            if (this.get('isIssue')) {\n                const issue = this.get('issueNumber');\n                return intl.t('chat.inlineMedia.githubIssueTitle', { issue, repo }).toString();\n            }\n            return intl.t('chat.inlineMedia.githubRepoTitle', { username, repo }).toString();\n        }\n    }),\n\n    embedString: computed(function () {\n        return this.get('intl').lookup('chat.inlineMedia.githubItems.embedSupport');\n    }),\n\n    shouldEmbed: computed('settings.embed', function () {\n        return this.get('settings.embed') || false;\n    }),\n\n    onSettingsChange: observer('preferences.widgets.githubRepo', function () {\n        this.get('preferences')\n            .getPreference('widgets.githubRepo')\n            .then(settings => {\n                this.set('settings', settings);\n                this.set('showEmbedConfirmation', settings.showEmbedConfirmation);\n            });\n    }),\n\n    setEmbedPreference(pref) {\n        let settings = this.get('settings');\n        Ember.setProperties(settings, {\n            embed: pref,\n            showEmbedConfirmation: false\n        });\n\n        this.set('showEmbedConfirmation', false);\n\n        this.get('preferences').setPreference('widgets.githubRepo', settings);\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    division: DS.attr(),\n    role: DS.attr(),\n    subjectId: DS.attr('string')\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    group: DS.attr(),\n    enabled: DS.attr(),\n    groupAlertType: DS.attr(),\n    overflowGroupId: DS.attr(),\n    rotateCallsSecs: DS.attr(),\n    sendEmailNotifications: DS.attr(),\n    disableEmailPii: DS.attr(),\n    stopRingingAfterRotations: DS.attr(),\n    includeEmailTranscriptions: DS.attr(),\n    languagePreference: DS.attr()\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport EntityMixin from '../mixins/entity';\nimport EntityImageComponent from 'ember-purecloud-components/components/entity-image/component';\n\nexport const BASE_GROUP_FIELDS = [\n    'general',\n    'owners',\n    'membership',\n    'individuals',\n    'images.activeProfilePicture',\n    'extMongoId',\n    'contactInfo'\n];\n\nexport const BASE_GROUP = BASE_GROUP_FIELDS.join(',');\n\nconst COMPARATORS = {\n    EqualTo: {\n        label: 'equals (==)',\n        value: 'EqualTo',\n        op: '=='\n    },\n    NotEqualTo: {\n        label: 'not equals (!=)',\n        value: 'NotEqualTo',\n        op: '!='\n    },\n    GreaterThan: {\n        label: 'greater than (>)',\n        value: 'GreaterThan',\n        op: '>'\n    },\n    GreaterThanOrEqualTo: {\n        label: 'greater than or equal to (>=)',\n        value: 'GreaterThanOrEqualTo',\n        op: '>='\n    },\n    LessThan: {\n        label: 'less than (<)',\n        value: 'LessThan',\n        op: '<'\n    },\n    LessThanOrEqualTo: {\n        label: 'less than or equal to (<=)',\n        value: 'LessThanOrEqualTo',\n        op: '<='\n    }\n};\n\nconst PROFICIENCIES = [\n    { name: '0', value: 0 },\n    { name: '1', value: 1 },\n    { name: '2', value: 2 },\n    { name: '3', value: 3 },\n    { name: '4', value: 4 },\n    { name: '5', value: 5 }\n];\n\nvar GroupModel = DS.Model.extend(EntityMixin, {\n    ajax: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    permissions: Ember.inject.service(),\n\n    meta: DS.attr(),\n    policy: DS.belongsTo('group-policy'),\n\n    acdSkills: null,\n\n    lastSavedExpression: null,\n\n    expression: Ember.computed('_expression.content', function () {\n        if (!this.get('_expression.content')) {\n            return null;\n        }\n        return this.parseExpression(this.get('_expression.content.skillConditions'));\n    }),\n\n    isDynamicGroup: Ember.computed(\n        'expression',\n        'session.features.PURE3301-dynamicGroups',\n        'permissions.canViewGroups',\n        function () {\n            return this.get('session.features.PURE3301-dynamicGroups') && this.get('permissions.canViewGroups')\n                ? !!this.get('expression')\n                : false;\n        }\n    ),\n\n    reload() {\n        this.notifyPropertyChange('greeting');\n        this.get('policy').then(policy => {\n            if (policy) {\n                policy.reload();\n            }\n        });\n        return this._super(...arguments);\n    },\n\n    rollbackAttributes() {\n        this.notifyPropertyChange('greeting');\n        this.notifyPropertyChange('individuals');\n        this.get('policy').then(policy => {\n            if (policy) {\n                policy.rollbackAttributes();\n            }\n        });\n        return this._super(...arguments);\n    },\n\n    // convert to attribute on Ember-Data upgrades\n    greeting: Ember.computed('guid', function () {\n        const path = `api/v2/groups/${this.get('guid')}/greetings/defaults`;\n        const url = this.get('application').pcV2Uri(path);\n\n        return DS.PromiseObject.create({\n            promise: this.get('ajax').request(url)\n        });\n    }),\n\n    _expression: Ember.computed(\n        'guid',\n        'session.features.PURE3301-dynamicGroups',\n        'permissions.canViewGroups',\n        function () {\n            if (this.get('session.features.PURE3301-dynamicGroups') && this.get('permissions.canViewGroups')) {\n                const path = `api/v2/groups/${this.get('guid')}/dynamicsettings`;\n                const url = this.get('application').pcV2Uri(path);\n                return DS.PromiseObject.create({\n                    promise: this.get('ajax')\n                        .ajaxGet(url, {\n                            retry: true\n                        })\n                        .then(res => {\n                            return Ember.RSVP.resolve(res.query);\n                        })\n                        .catch(err => {\n                            if (err.status === 404) {\n                                //this group is confirmed not a dynamic group\n                                return Ember.RSVP.resolve(null);\n                            } else if (\n                                err.status === 403 && // check and see if it's a permission issue\n                                err.payload.code === 'missing.any.permissions' &&\n                                err.payload.message.indexOf('directory:group:view') > 0\n                            ) {\n                                // this user needs the updated group:view permissions\n                                this.get('logger').error('Error trying to load dynamic expression for group', {\n                                    err\n                                });\n                                this.get('notification').error(\n                                    this.get('intl').t('groups.expressions.loadErrorTitle'),\n                                    this.get('intl').t('groups.expressions.permissionErrorMessage')\n                                );\n                            } else {\n                                //actual error\n                                this.get('logger').error('Error trying to load dynamic expression for group', {\n                                    err\n                                });\n                                this.get('notification').error(\n                                    this.get('intl').t('groups.expressions.loadErrorTitle'),\n                                    this.get('intl').t('groups.expressions.loadErrorMessage')\n                                );\n                                return Ember.RSVP.resolve(null);\n                            }\n                        })\n                });\n            }\n        }\n    ),\n\n    description: Ember.computed('general.description.@each.value', function () {\n        return this.getFieldValue('general.description').value;\n    }),\n\n    groupType: Ember.computed('general.groupType', function () {\n        var groupTypeValue = this.getFieldValue('general.groupType').value;\n        if (groupTypeValue) {\n            var actualType = groupTypeValue.split('.')[1];\n            var key = `group_general_groupType_value_${actualType}`;\n\n            return this.get('intl').lookup(key, null, true).toString();\n        }\n\n        return '';\n    }),\n\n    memberCount: Ember.computed('general.memberCount.@each.value', function () {\n        if (this.get('general.memberCount')) {\n            return this.getFieldValue('general.memberCount').value;\n        }\n\n        return 0;\n    }),\n\n    profilePictureURL: Ember.computed('images.activeProfilePicture', function () {\n        var images = this.get('images');\n\n        if (images && images.activeProfilePicture && images.activeProfilePicture[0].ref) {\n            return images.activeProfilePicture[0].ref.x128;\n        } else {\n            return EntityImageComponent.placeholderImageForSize(this, 'x200');\n        }\n    }),\n\n    uploadedProfilePictures: Ember.computed('images.profilePictures', function () {\n        var field = this.getFieldValue('images.profilePictures');\n        if (field && field.length && field[0].value) {\n            return field;\n        }\n\n        return [];\n    }),\n\n    uploadedInformalPhotos: Ember.computed('images.gallery', function () {\n        var field = this.getFieldValue('images.gallery');\n        if (field && field.length && field[0].value) {\n            return field;\n        }\n\n        return [];\n    }),\n\n    groupVisibility: Ember.computed('privacy.groupVisibility', function () {\n        return this.getFieldValue('privacy.groupVisibility').value;\n    }),\n\n    membershipVisible: Ember.computed('privacy.membershipVisible', function () {\n        return this.getFieldValue('privacy.membershipVisible').value;\n    }),\n\n    includeOwners: Ember.computed('membership.includeOwners', function () {\n        var visible = this.getFieldValue('membership.includeOwners').value;\n        return this.get('intl').lookup(`entity.fieldTypes.boolean.checked-${visible}`).toString();\n    }),\n\n    areOwnersIncluded: Ember.computed('membership.includeOwners', function () {\n        return this.getFieldValue('membership.includeOwners').value;\n    }),\n\n    groupEmailAddress: Ember.computed('general.exchangeNameOverride', {\n        get() {\n            return this.getFieldValue('general.exchangeNameOverride').value;\n        },\n        set(key, value) {\n            if (value === undefined) {\n                value = '';\n            }\n            return this.set('general.exchangeNameOverride', value)[0].value;\n        }\n    }),\n\n    needsCommit: Ember.computed('general.needsCommit', function () {\n        return this.getFieldValue('general.needsCommit').value;\n    }),\n\n    membershipSearchQuery: Ember.computed('membership.compiledQuery.[]', function () {\n        var compiledQuery = this.getFieldValue('membership.compiledQuery');\n        var query = Ember.get(compiledQuery, 'value.q');\n        if (query && query.length) {\n            return query[0].value;\n        }\n\n        return '';\n    }),\n\n    generalSearchQuery: Ember.computed('id', 'general.groupType', function () {\n        var groupType = this.getFieldValue('general.groupType').value;\n        return `${groupType}:${this.get('guid')}`;\n    }),\n\n    isActive: Ember.computed('state', function () {\n        return this.get('state') === 'active';\n    }),\n\n    isDeleted: Ember.computed('state', function () {\n        return this.get('state') === 'deleted';\n    }),\n\n    jid: Ember.computed('_id', function () {\n        const id = this.get('_id');\n        var org = this.get('application.session.org');\n        var name = Ember.get(org, 'general.shortName')[0].value;\n        return `${id}@conference.${name}.orgspan.com`;\n    }),\n\n    readWritePermissions: Ember.computed(function () {\n        return DS.PromiseArray.create({\n            promise: Ember.RSVP.resolve()\n        });\n    }),\n\n    // -- Handles Grants and Roles Associated with the Group --\n\n    allowPermissionGroup: Ember.computed('general.allowPermissionGroup', {\n        get() {\n            return this.getFieldValue('general.allowPermissionGroup').value;\n        },\n        set(key, value) {\n            return this.set('general.allowPermissionGroup', value)[0].value;\n        }\n    }),\n\n    uniqueRoleCount: 0,\n    grantVersion: -1,\n\n    getGrants() {\n        return new Ember.RSVP.Promise(resolve => {\n            var path = `api/v2/authorization/subjects/${this.get('guid')}`;\n            var url = this.get('application').pcV2Uri(path);\n            this.get('ajax')\n                .ajaxGet(url)\n                .then(data => {\n                    let rolesMap = {};\n                    let uniqueRoleCount = 0;\n                    data.grants.forEach(grant => {\n                        if (!rolesMap[grant.role.id]) {\n                            rolesMap[grant.role.id] = true;\n                            uniqueRoleCount++;\n                        }\n                    });\n                    this.set('uniqueRoleCount', uniqueRoleCount);\n                    this.set('grantVersion', data.version);\n                    resolve(data.grants);\n                });\n        });\n    },\n\n    // --\n\n    number: Ember.computed('contactInfo.groupNumber.@each.value', 'contactInfo.groupNumber.@each.rel', function () {\n        return this.getFieldValue('contactInfo.groupNumber');\n    }),\n\n    //TODO: Delete these references to the policy model when group contact modal is deleted\n    numberOfRotations: Ember.computed('policy.stopRingingAfterRotations', function () {\n        return DS.PromiseObject.create({\n            promise: (() => {\n                return this.get('policy').then(policy => policy.get('stopRingingAfterRotations'));\n            })()\n        });\n    }),\n\n    rotateCallSeconds: Ember.computed('policy.rotateCallsSecs', function () {\n        return DS.PromiseObject.create({\n            promise: (() => {\n                return this.get('policy').then(policy => policy.get('rotateCallsSecs'));\n            })()\n        });\n    }),\n\n    emailNotificationEnabled: Ember.computed.reads('policy.sendEmailNotifications', function () {\n        return DS.PromiseObject.create({\n            promise: (() => {\n                return this.get('policy').then(policy => policy.get('sendEmailNotifications'));\n            })()\n        });\n    }),\n\n    voicemailEnabled: Ember.computed('policy.enabled', function () {\n        return DS.PromiseObject.create({\n            promise: (() => {\n                return this.get('policy').then(policy => policy.get('enabled'));\n            })()\n        });\n    }),\n\n    membershipChange: Ember.observer('membership.inclusions.[]', 'membership.exclusions.[]', function () {\n        var membership = this.get('membership');\n        this.set('membershipDraft', membership);\n    }),\n\n    isPersonOwner(person) {\n        if (!person) {\n            return false;\n        }\n\n        let owner = this.getFieldValue('owners.owners').findBy('value', person.get('id'));\n        let guidOwner = this.getFieldValue('owners.owners').findBy('guid', person.get('id'));\n        return !_.isEmpty(owner) || !_.isEmpty(guidOwner);\n    },\n\n    /**\n     * We derive the Jabber ID for a group from the `_id` property.\n     * Normally, this is set in the group serializer.\n     * Search results do not go through the group serializer.\n     * We need to set the `_id` on the group entity so that `group.get('jid')` resolves properly.\n     * @returns\n     */\n    setIdForGroupEntity() {\n        const existingId = this.get('_id');\n        if (existingId) {\n            return;\n        }\n        const jid = this.get('contactInfo.chat.firstObject.value.jid');\n        if (jid) {\n            const idParts = jid.split('@');\n            const id = idParts.length > 0 ? idParts[0] : '';\n            Ember.run(() => {\n                this.set('_id', id);\n            });\n        }\n    },\n\n    isPersonIndividual(person) {\n        if (!person) {\n            return false;\n        }\n\n        var individual = this.getFieldValue('individuals.individuals').findBy('value', person.get('id'));\n        var guidIndividual = this.getFieldValue('individuals.individuals').findBy('guid', person.get('id'));\n        return !_.isEmpty(individual) || !_.isEmpty(guidIndividual);\n    },\n\n    getReadableSections() {\n        return this.fieldConfig.get('sections').mapBy('key');\n    },\n\n    getWriteableSections() {\n        var currentPerson = this.get('application.session.person');\n        var ownerIds = this.get('owners.owners').mapBy('value');\n        var sections = this.fieldConfig.get('sections').mapBy('key');\n\n        if (currentPerson && currentPerson.get('isAdmin')) {\n            return sections;\n        }\n\n        if (currentPerson && ownerIds.indexOf(currentPerson.get('id')) !== -1) {\n            return sections;\n        }\n\n        return [];\n    },\n\n    getReadableFieldsForSection(section) {\n        return section.get('fieldList').mapBy('key');\n    },\n\n    setProfilePicture(image) {\n        var profileImageSection = this.get('images.activeProfilePicture');\n\n        if (profileImageSection === undefined) {\n            this.set('images.activeProfilePicture', {});\n            profileImageSection = this.get('images.activeProfilePicture');\n        }\n\n        if (profileImageSection && profileImageSection.length) {\n            var profileImage = profileImageSection[0];\n\n            Ember.set(profileImage, 'ref', image.value);\n            Ember.set(profileImage, 'value.fieldId', image._id);\n            Ember.set(profileImage, 'value.fieldPath', 'images.profilePictures');\n\n            this.notifyPropertyChange('profilePicture');\n        }\n    },\n\n    deleteGrant(grant) {\n        var path = `/api/v2/authorization/subjects/${this.get('id')}/scopes/${grant.get('scope.id')}/roles/${grant.get(\n            'role.id'\n        )}`;\n        var url = this.get('application').pcV2Uri(path);\n        return this.get('ajax').del(url);\n    },\n\n    parseExpression(input) {\n        let output = [];\n\n        if (!input || input.length === 0) {\n            //no need to parse an empty array\n            return output;\n        }\n\n        // childConditions are all nested, so we gotta recurse\n        const addRule = function (condition, rule) {\n            let newSkill =\n                rule.routingSkillConditions.length === 0\n                    ? {\n                          name: rule.languageSkillConditions[0].languageSkill,\n                          type: 'language'\n                      }\n                    : {\n                          name: rule.routingSkillConditions[0].routingSkill,\n                          type: 'routing'\n                      };\n            let skill =\n                rule.routingSkillConditions.length === 0\n                    ? rule.languageSkillConditions[0]\n                    : rule.routingSkillConditions[0];\n            let children = skill.childConditions;\n            let op = rule.operation ? rule.operation.toUpperCase() : null;\n            if (\n                children &&\n                (!_.isEmpty(children.routingSkillConditions) || !_.isEmpty(children.languageSkillConditions))\n            ) {\n                op = children.operation.toUpperCase();\n            }\n\n            condition.rules.pushObject({\n                comparator: COMPARATORS[skill.comparator],\n                proficiency: PROFICIENCIES[skill.proficiency],\n                operation: op,\n                opAnd: op == 'AND' ? true : false,\n                skill: newSkill\n            });\n\n            if (\n                children &&\n                (!_.isEmpty(children.routingSkillConditions) || !_.isEmpty(children.languageSkillConditions))\n            ) {\n                addRule(condition, children);\n            }\n        };\n\n        // so here we'll go through each top-level condition and check recursively for children\n        input.forEach(condition => {\n            let conOp = condition.operation ? condition.operation.toUpperCase() : null;\n\n            let newCondition = {\n                rules: [],\n                lastCondition: false,\n                operation: conOp,\n                opAnd: conOp == 'AND' ? true : false\n            };\n\n            addRule(newCondition, condition);\n\n            newCondition.rules.set('lastObject.lastRule', true);\n            newCondition.rules.set('lastObject.operation', 'OR');\n            newCondition.rules.set('lastObject.opAnd', false);\n            output.pushObject(newCondition);\n        });\n        output.set('lastObject.lastCondition', true);\n        output.set('lastObject.operation', 'OR');\n        output.set('lastObject.opAnd', false);\n        return output;\n    }\n});\n\nGroupModel.reopenClass({\n    apiEndpoint: 'v2/groups'\n});\n\nexport default GroupModel;\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport App, {\n    PC_ENV_URL_REPLACEMENT_TOKEN,\n    GC_HOST_ORIGIN_REPLACEMENT_TOKEN,\n    GC_TARGET_ENV_REPLACEMENT_TOKEN,\n    GC_LANG_TAG_URL_REPLACEMENT_TOKEN,\n    GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN\n} from './app';\nimport appUtils from '../utils/apps';\nimport netUtils from '../utils/net';\n\nconst { getOwner, computed, copy, typeOf, isPresent } = Ember;\n\n/**\n * An internally-built PureCloud Client App that is hosted on PureCloud's own infrastructure.\n *\n * The url will be dynamically generated based on the specified config:\n *\n * subdomain=apps: Optional. Subdomain to be prepended to the current purecloud domain.\n * envDetails: Required.  The environment details to build the PureCloud domain.\n * path: Required. The path to the app.  Leading slash will be prepended if omitted.\n * query=?gcHostOrigin={{gcHostOrigin}}&gcTargetEnv={{gcTargetEnv}}&gcLangTag={{gcLangTag}}&gcUsePopupAuth={{gcUsePopupAuth}}: Optional. The querystring for the app. Leading ? will be prepended if omitted.\n *\n * [SECURITY NOTE]: Because these apps will have the same purecloud env tld as the host PureCloud app,\n * they can elevate out of the iframe sandbox.  Because of this, this must always be internal code.\n * This is NOT a hosting option for external apps.\n */\nconst InternallyHostedApp = App.extend({\n    subdomain: null,\n    envDetails: null,\n    path: null,\n    query: null,\n    urlTemplate: computed('subdomain', 'envDetails', 'path', 'query', 'gcHostOrigin', 'gcTargetEnv', {\n        get() {\n            let result = null;\n\n            let subdomain = this.get('subdomain') || netUtils.getPcApplicationsSubdomain();\n            let envDetails = this.get('envDetails');\n            let path = this.get('path');\n            let query = this.get('query');\n\n            if (typeOf(path) === 'string' && isPresent(path) && envDetails) {\n                result = `https://${subdomain}.${envDetails.runtime.currentDomainName}`;\n\n                path = path.trim();\n                if (path.charAt(0) !== '/') {\n                    result += '/';\n                }\n                result += path;\n\n                if (query && typeOf(query) === 'string') {\n                    query = query.trim();\n                    if (query.charAt(0) !== '?') {\n                        result += '?';\n                    }\n                    result += query;\n                } else {\n                    result += `?gcHostOrigin=${GC_HOST_ORIGIN_REPLACEMENT_TOKEN}&gcTargetEnv=${GC_TARGET_ENV_REPLACEMENT_TOKEN}&pcEnvironment=${PC_ENV_URL_REPLACEMENT_TOKEN}&pcLangTag=${GC_LANG_TAG_URL_REPLACEMENT_TOKEN}&pcUsePopupAuth=${GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN}&gcLangTag=${GC_LANG_TAG_URL_REPLACEMENT_TOKEN}&gcUsePopupAuth=${GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN}`;\n                }\n            }\n\n            return result;\n        },\n        set() {\n            Ember.Logger.error(\n                appUtils.buildLogMsg('Set called on derrived urlTemplate property instead of path property.'),\n                {\n                    path: this.get('path'),\n                    remoteData: {\n                        appId: this.get('id')\n                    }\n                }\n            );\n\n            throw new Error('Cannot directly set urlTemplate. Use path property.');\n        }\n    }),\n\n    copy(deep) {\n        let owner = getOwner(this);\n        let ownerMixin = {};\n\n        if (owner) {\n            ownerMixin = owner.ownerInjection();\n        }\n\n        return InternallyHostedApp.create(ownerMixin, {\n            typeId: this.get('typeId'),\n            id: this.get('id'),\n            name: this.get('name'),\n            subdomain: this.get('subdomain'),\n            envDetails: copy(this.get('envDetails'), deep),\n            path: this.get('path'),\n            query: this.get('query'),\n            langTag: this.get('langTag'),\n            envTld: this.get('envTld'),\n            usePopupAuth: this.get('usePopupAuth'),\n            displayType: this.get('displayType'),\n            featureCategory: this.get('featureCategory'),\n            sandbox: deep ? copy(this.get('sandbox'), true) : this.get('sandbox'),\n            assets: copy(this.get('assets'), deep),\n            lifecycle: copy(this.get('lifecycle'), deep),\n            permissionsPolicy: deep ? copy(this.get('permissionsPolicy'), true) : this.get('permissionsPolicy'),\n            // interapption props\n            interactionId: this.get('interactionId'),\n            interactionType: this.get('interactionType'),\n            enabledQueueIds: deep ? _.cloneDeep(this.get('enabledQueueIds')) : this.get('enabledQueueIds'),\n            enabledCommunicationTypes: deep\n                ? _.cloneDeep(this.get('enabledCommunicationTypes'))\n                : this.get('enabledCommunicationTypes'),\n            gcHostOrigin: this.get('gcHostOrigin'),\n            gcTargetEnv: this.get('gcTargetEnv')\n        });\n    }\n});\n\nexport default InternallyHostedApp;\n","import DS from 'ember-data';\n\nvar LibraryModel = DS.Model.extend({\n    name: DS.attr(),\n    dateCreated: DS.attr(),\n    version: DS.attr(),\n    responses: DS.attr()\n});\n\nexport default LibraryModel;\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nexport const BASE_LOCATION_FIELDS = ['name', 'address', 'images', 'contactPersonId', 'sublocationOrder'];\nexport const BASE_LOCATION = {\n    fl: BASE_LOCATION_FIELDS.join(',')\n};\n\nvar LocationModel = DS.Model.extend({\n    ajax: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    _id: DS.attr(),\n    name: DS.attr(),\n    address: DS.attr(),\n    imageHistory: DS.attr(),\n    contactPersonId: DS.attr(),\n    notes: DS.attr(),\n    sublocationOrder: DS.attr(),\n    images: DS.attr(),\n\n    profileImage: DS.attr(),\n    floorplanImage: DS.attr(),\n    floorplanImageHistory: DS.attr(),\n\n    path: DS.attr(),\n    orgId: DS.attr(),\n\n    version: DS.attr(),\n\n    _entity: DS.attr(),\n\n    floors: DS.attr(),\n\n    init() {\n        this._super(...arguments);\n    },\n\n    profilePicture: Ember.computed('profileImage', 'parent.{images,isFulfilled}', 'images', function () {\n        let profileImages = this.get('profileImage');\n\n        if (!_.isEmpty(profileImages)) {\n            let imagex48 = profileImages.find(image => image.resolution === 'x48');\n            let imagex96 = profileImages.find(image => image.resolution === 'x96');\n            let imagex128 = profileImages.find(image => image.resolution === 'x128');\n            let imagex200 = profileImages.find(image => image.resolution === 'x200');\n\n            if (imagex48 && imagex96 && imagex128 && imagex200) {\n                return {\n                    x48: `${imagex48.imageUri}`,\n                    x96: `${imagex96.imageUri}`,\n                    x128: `${imagex128.imageUri}`,\n                    x200: `${imagex200.imageUri}`\n                };\n            }\n        } else if (this.get('images')) {\n            let images = this.get('images');\n            return images;\n        }\n\n        return undefined;\n    }),\n\n    floorCount: Ember.computed('sublocationOrder', function () {\n        var subs = this.get('sublocationOrder');\n\n        if (_.isEmpty(subs)) {\n            return 0;\n        }\n\n        return subs.length;\n    }),\n\n    type: Ember.computed('path', function () {\n        var path = this.get('path');\n\n        if (path && Array.isArray(path) && path.length > 0) {\n            return 'floor';\n        }\n\n        return 'location';\n    }),\n\n    isFloor: Ember.computed('type', function () {\n        return this.get('type') === 'floor';\n    }),\n\n    deleted: Ember.computed('state', function () {\n        return this.get('state') === 'deleted';\n    }),\n\n    hasContactPerson: Ember.computed('contactPersonId', function () {\n        return this.get('contactPersonId') !== null && this.get('contactPersonId') !== undefined;\n    }),\n\n    contactPerson: Ember.computed('contactPersonId', function () {\n        var id = this.get('contactPersonId');\n        if (id) {\n            return this.store.find('person', id);\n        }\n    }),\n\n    floorplan: Ember.computed('floorplanImage', function () {\n        let images = this.get('floorplanImage');\n        if (!_.isEmpty(images)) {\n            let image = images.find(image => image.resolution === 'x1024');\n            if (image) {\n                return image.imageUri;\n            }\n        }\n\n        return undefined;\n    }),\n\n    _parent: null,\n    parent: Ember.computed('type', 'path', function () {\n        if (this.get('type') === 'floor') {\n            let promise;\n            if (this.get('_parent')) {\n                promise = this.get('_parent');\n            } else {\n                promise = this.get('store').findRecord('location', this.get('path')[0]);\n                this.set('_parent', promise);\n            }\n            return DS.PromiseObject.create({\n                promise\n            });\n        }\n\n        return DS.PromiseObject.create({\n            promise: Ember.RSVP.resolve(undefined)\n        });\n    }),\n\n    containsRichAddress: Ember.computed('address', function () {\n        let address = this.get('address');\n        return typeof address !== 'string';\n    }),\n\n    setFloor() {\n        return;\n    }\n});\n\nexport default LocationModel;\n","import Model from 'ember-data/model';\nimport attr from 'ember-data/attr';\nimport Ember from 'ember';\n\nexport default Model.extend({\n    //id on the model is the occurrence id, not the meeting id\n    roomId: attr(),\n    subject: attr(),\n    description: attr(),\n    organizer: attr(),\n\n    attendees: attr(),\n    notifyAttendees: attr(),\n\n    startDate: attr('iso-date'),\n    endDate: attr(),\n    duration: attr(),\n    recurringType: attr(),\n\n    version: attr(),\n    meeting: attr(), //object that holds the meeting id\n\n    meetingAttendees: Ember.computed('attendees', function () {\n        if (this.get('attendees')) {\n            return Ember.RSVP.resolve(this.get('attendees'));\n        }\n        return this.get('store')\n            .findRecord('meeting', this.get('id'), { reload: true })\n            .then(meeting => meeting.get('attendees'));\n    })\n});\n","define(\"connections-ui/models/message-communication\", [\"exports\", \"ember-purecloud-components/models/message-communication\"], function (_exports, _messageCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _messageCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport EntityMixin from '../mixins/entity';\n\nconst { computed } = Ember;\n\nexport default DS.Model.extend(EntityMixin, {\n    name: computed('general.name.@each.value', function () {\n        const name = this.getFieldValue('general.name');\n        if (name.value) {\n            return name.value;\n        }\n        return '';\n    }),\n\n    shortName: computed('general.shortName.@each.value', function () {\n        const shortName = this.getFieldValue('general.shortName');\n        if (shortName.value) {\n            return shortName.value;\n        }\n        return '';\n    }),\n\n    hasUnifiedCommunications: computed('enabledFeatures.unifiedCommunications.@each.value', function () {\n        const comms = this.getFieldValue('enabledFeatures.unifiedCommunications');\n        if (_.isEmpty(comms)) {\n            return false;\n        }\n        return comms.value;\n    }),\n\n    hasChatEnabled: computed('enabledFeatures.chat.@each.value', function () {\n        const chat = this.getFieldValue('enabledFeatures.chat');\n        return chat.value;\n    }),\n\n    hasHipaaEnabled: computed('enabledFeatures.hipaa.@each.value', function () {\n        const hipaa = this.getFieldValue('enabledFeatures.hipaa');\n        return hipaa.value;\n    }),\n\n    orgDefaultCountryCode: computed('general.defaultCountryCode.@each.value', function () {\n        return this.getFieldValue('general.defaultCountryCode')\n            ? this.getFieldValue('general.defaultCountryCode').value\n            : null;\n    }),\n\n    orgPreferences: computed('preferences.preferences.@each.value', function () {\n        const preferences = this.getFieldValue('preferences.preferences');\n        let parsedPreferences;\n        try {\n            parsedPreferences = JSON.parse(preferences.value);\n        } catch (err) {\n            parsedPreferences = {};\n        }\n        return parsedPreferences;\n    })\n});\n","define(\"connections-ui/models/participant\", [\"exports\", \"ember-purecloud-components/models/participant\"], function (_exports, _participant) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _participant.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport { getEntityObjectId } from 'ember-purecloud-components/utils/jid-helpers';\n\nimport EntityMixin from '../mixins/entity';\nimport ChatUserMixin from '../mixins/chat-user';\nimport EntityPresenceMixin from '../mixins/entity-presence';\n\nimport { BASE_GROUP } from '../models/group';\n\n/* /platform/api/v2/users/{id}/profile (or /platform/api/v2/profiles/users) default field list (fl query parameter) */\nexport const BASE_PERSON_FIELDS = [\n    'extMongoId',\n    'general',\n    'contactInfo',\n    'primaryContactInfo',\n    'images.profile',\n    'version'\n];\n/* /platform/api/users expand query parameter list */\nexport const BASE_PERSON_EXPANDS = [\n    'routingStatus',\n    'primaryPresence',\n    'conversationSummary',\n    'outOfOffice',\n    'geolocation',\n    'presence',\n    'locations',\n    'authorization'\n];\nexport const BASE_PERSON = {\n    fl: BASE_PERSON_FIELDS.join(','),\n    expand: BASE_PERSON_EXPANDS.join(',')\n};\n\nexport const FULL_PERSON = {\n    fl: '*',\n    expand: BASE_PERSON_EXPANDS.join(',')\n};\n\nconst { get, set, computed } = Ember;\n\nlet permissionRoutes = ['person.detail', 'person.detail.index', 'card.detail'];\n\n// We need to change how data gets merged in Ember-Data to support our field\n// config...not sure of a way around this...\nfunction merge(original, updates) {\n    _.forEach(updates, (sectionValue, sectionKey) => {\n        if (typeof sectionValue !== 'object' || Array.isArray(sectionValue)) {\n            original[sectionKey] = sectionValue;\n            return;\n        }\n\n        _.forEach(sectionValue, (fieldValue, fieldKey) => {\n            if (!original[sectionKey]) {\n                original[sectionKey] = {};\n            }\n\n            Ember.set(original[sectionKey], fieldKey, fieldValue);\n        });\n    });\n}\n\nfunction clearProperties(original, updates, changedKeys, type) {\n    const originalKeys = Object.keys(original);\n    originalKeys.forEach(sectionKey => {\n        if (updates[sectionKey] === undefined) {\n            set(original, sectionKey, {});\n            changedKeys.push(sectionKey);\n        } else {\n            if (type === 'group') {\n                const sectionData = original[sectionKey];\n                const fieldKeys = Object.keys(sectionData);\n                fieldKeys.forEach(fieldKey => {\n                    const pathKey = `${sectionKey}.${fieldKey}`;\n                    if (get(updates, pathKey) === undefined) {\n                        set(original, pathKey, {});\n                        changedKeys.push(pathKey);\n                    }\n                });\n            }\n        }\n    });\n}\n\n/**\n * @param {object | number} contactCenter contact center conversations\n * @param {object | number} enterprise enterprise  conversations\n * @returns {number} The sum of the active conversations for the two arguments, or 0.\n */\nfunction activityCounter(contactCenter, enterprise) {\n    const contactCenterCount = typeof contactCenter === 'object' ? contactCenter.active : contactCenter || 0;\n    const enterpriseCount = typeof enterprise === 'object' ? enterprise.active : enterprise || 0;\n    return contactCenterCount + enterpriseCount;\n}\n\nlet Internal = DS.InternalModel.prototype;\nlet _setupData = Internal.setupData;\nInternal.setupData = function (data) {\n    const type = data.modelName || data.type;\n    if (type === 'person' || type === 'group') {\n        let changedKeys = [];\n        if (this.hasRecord) {\n            changedKeys = this._changedKeys(data.attributes);\n        }\n\n        merge(this._data, data.attributes);\n\n        // Partial reloading is not a thing for people/groups\n        // So we've gotta clear the data that no longer exists\n        if (this.isReloading) {\n            clearProperties(this._data, data.attributes, changedKeys, type);\n        }\n\n        this.pushedData();\n\n        const record = this.record || this._record;\n        if (record) {\n            record._notifyProperties(changedKeys);\n        }\n        if (this.didInitializeData) {\n            this.didInitializeData();\n        }\n    } else {\n        _setupData.apply(this, arguments);\n    }\n};\n\nlet PersonModel = DS.Model.extend(EntityMixin, ChatUserMixin, EntityPresenceMixin, {\n    ajax: Ember.inject.service(),\n    search: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    preferences: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    presenceSubscription: Ember.inject.service(),\n\n    _readWritePermissions: null,\n\n    _directReports: null,\n    _siblings: null,\n    _superiors: null,\n\n    namedPermissions: Ember.computed.reads('application.session.namedPermissions'),\n\n    // attributes guaranteed to be on models\n    parent: DS.attr(),\n    path: DS.attr(),\n    children: DS.attr(),\n    roleIds: DS.attr(),\n    expands: DS.attr(),\n    version: DS.attr(),\n    divisionId: DS.attr(),\n\n    _activities: computed.alias('expands'),\n    activities: computed.alias('_activities'),\n\n    // private values just used to simplify computed functions\n    _activityCall: computed.reads('activities.conversationSummary.call'),\n    _activityCallback: computed.reads('activities.conversationSummary.callback'),\n    _activityChat: computed.reads('activities.conversationSummary.message'),\n    _activityWebChat: computed.reads('activities.conversationSummary.chat'),\n    _activityEmail: computed.reads('activities.conversationSummary.email'),\n\n    guid: computed.reads('id'),\n\n    // this computed is used in ember-purecloud-components (EPC) addon\n    // to reduce changes across deprecated projects, we are defaulting this to true.\n    // Once EPC is removed, we can remove this property.\n    showConversationSummaryIndicator: true,\n\n    presenceList: null,\n\n    // We will want to switch completely to 'default' as the only default presence source\n    // but will be blocked until the Presence Service is only returning 'default'.\n    currentPresenceSource: 'PURECLOUD',\n\n    init: function () {\n        this._super(...arguments);\n        this.set('presenceList', Ember.A());\n        this.set('personDetail', Ember.getOwner(this).lookup('controller:person/detail'));\n\n        if (this.onProfilePage()) {\n            this.get('readWritePermissions');\n        }\n        // convert current presence source to 'default'\n        this.set('currentPresenceSource', 'default');\n    },\n\n    totalCalls: computed('_activityCall', function () {\n        const contactCenter = this.get('_activityCall.contactCenter.active');\n        const enterprise = this.get('_activityCall.enterprise.active');\n        return activityCounter(contactCenter, enterprise);\n    }),\n\n    totalCallbacks: computed('_activityCallback', function () {\n        const contactCenter = this.get('_activityCallback.contactCenter.active');\n        const enterprise = this.get('_activityCallback.enterprise.active');\n        return activityCounter(contactCenter, enterprise);\n    }),\n\n    totalChats: computed('_activityChat', function () {\n        const contactCenter = this.get('_activityChat.contactCenter.active');\n        const enterprise = this.get('_activityChat.enterprise.active');\n        return activityCounter(contactCenter, enterprise);\n    }),\n\n    totalWebChats: computed('_activityWebChat', function () {\n        const contactCenter = this.get('_activityWebChat.contactCenter.active');\n        const enterprise = this.get('_activityWebChat.enterprise.active');\n        return activityCounter(contactCenter, enterprise);\n    }),\n\n    totalEmails: computed('_activityEmail', function () {\n        const contactCenter = this.get('_activityEmail.contactCenter.active');\n        const enterprise = this.get('_activityEmail.enterprise.active');\n        return activityCounter(contactCenter, enterprise);\n    }),\n\n    activityValues: computed('totalCalls', 'totalCallbacks', 'totalChats', 'totalEmails', function () {\n        return {\n            calls: this.get('totalCalls') + this.get('totalCallbacks'),\n            emails: this.get('totalEmails'),\n            chats: this.get('totalChats') + this.get('totalWebChats')\n        };\n    }),\n\n    title: Ember.computed('general.title.@each.value', function () {\n        var field = this.getFieldValue('general.title');\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    department: Ember.computed('general.department.@each.value', function () {\n        var field = this.getFieldValue('general.department');\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    email: Ember.computed('primaryContactInfo', function () {\n        var field = this.getFieldValue('primaryContactInfo.email');\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    email_main: Ember.computed('contactInfo.email_main', function () {\n        var field = this.getFieldValue('contactInfo.email_main');\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    phone: Ember.computed('primaryContactInfo', function () {\n        var field = this.getFieldValue('primaryContactInfo.voice');\n\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    integrationPhone: Ember.computed('contactInfo.phone_other', function () {\n        let otherPhones = this.get('contactInfo.phone_other');\n        if (otherPhones && otherPhones.length > 0) {\n            return otherPhones.find(phone => phone && phone.value && phone.value.integration);\n        }\n        return null;\n    }),\n\n    agentName: Ember.computed('agent', function () {\n        var field = this.getFieldValue('agent.name');\n\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    uploadedProfilePictures: Ember.computed('uploads.images', function () {\n        var field = this.getFieldValue('uploads.images');\n        if (field && field.length && field[0].value) {\n            return field;\n        }\n\n        return [];\n    }),\n\n    uploadedInformalPhotos: Ember.computed('images.informal', function () {\n        var field = this.getFieldValue('images.informal');\n\n        if (field && field.length && field[0].value) {\n            return field;\n        }\n\n        return [];\n    }),\n\n    socialGroups: Ember.computed('groups.social.[]', function () {\n        return this.getGroupsByType('groups.social');\n    }),\n\n    officialGroups: Ember.computed('groups.official.[]', function () {\n        return this.getGroupsByType('groups.official');\n    }),\n\n    distributionGroups: Ember.computed('purecloud.distributionGroups', function () {\n        return this.getGroupsByType('purecloud.distributionGroups');\n    }),\n\n    ownedGroups: Ember.computed('id', function () {\n        const promise = new Ember.RSVP.Promise((resolve, reject) => {\n            this.get('search')\n                .performSearch(this.get('guid'), 0, 'groups', [], ['owners.owners.guid'], 'EXACT', [], 100)\n                .then(function ({ results }) {\n                    if (results) {\n                        resolve(results);\n                    } else {\n                        resolve([]);\n                    }\n                })\n                .catch(function (err) {\n                    reject(err);\n                });\n        });\n\n        return DS.PromiseArray.create({\n            promise\n        });\n    }),\n\n    manager: Ember.computed('relationships.manager.[]', 'relationships.manager.@each.value', function () {\n        var field = this.getFieldValue('relationships.manager');\n        var managerId = Ember.get(field, 'guid') || Ember.get(field, 'value');\n        var promise;\n\n        if (managerId) {\n            promise = this.get('store').findRecord('person', managerId, BASE_PERSON);\n        } else {\n            promise = Ember.RSVP.resolve({});\n        }\n\n        return DS.PromiseObject.create({\n            promise: promise\n        });\n    }),\n\n    managerSiblings: Ember.computed('manager', 'manager.isFulfilled', function () {\n        var field = this.getFieldValue('relationships.manager');\n        var managerId = Ember.get(field, 'value');\n        var promise;\n\n        if (managerId) {\n            promise = this.get('manager')\n                .then(function (person) {\n                    return person.get('siblings');\n                })\n                .then(function (siblings) {\n                    if (siblings.get('length')) {\n                        return siblings.filterBy('state', 'active');\n                    }\n\n                    return [];\n                });\n        } else {\n            promise = Ember.RSVP.resolve([]);\n        }\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    otherRelationships: Ember.computed('relationships.relationships.[]', function () {\n        let values = this.getFieldValue('relationships.relationships');\n        let ids = values.mapBy('value');\n        let promise = Ember.RSVP.resolve([]);\n        if (ids && !_.isEmpty(ids) && ids[0]) {\n            promise = this.get('store').findByIds('person', ids, BASE_PERSON);\n        }\n\n        return DS.PromiseArray.create({\n            promise\n        });\n    }),\n\n    groupedOtherRelationships: Ember.computed('relationships.relationships', function () {\n        var fieldValue = this.getFieldValue('relationships.relationships');\n\n        if (!fieldValue) {\n            return Ember.RSVP.resolve([]);\n        }\n\n        var ids = fieldValue.mapBy('value');\n        var promise;\n\n        if (ids && !_.isEmpty(ids) && ids[0]) {\n            promise = this.store.findByIds('person', ids).then(function (persons) {\n                // Group relationships by label key.\n                var groupedRelationships = [];\n\n                _.each(fieldValue, function (personEntry) {\n                    var person = persons.findBy('id', personEntry.value);\n                    if (person.get('state') === 'deleted') {\n                        return;\n                    }\n\n                    var relationship = groupedRelationships.findBy('labelKey', personEntry.labelKey);\n                    if (relationship) {\n                        relationship.people.push(person);\n                    } else {\n                        groupedRelationships.push({\n                            labelKey: personEntry.labelKey,\n                            i18nKey:\n                                'person_relationships_relationships_labelKey_' + personEntry.labelKey.replace('.', '_'),\n                            people: [person]\n                        });\n                    }\n                });\n\n                return groupedRelationships;\n            });\n        } else {\n            promise = Ember.RSVP.resolve([]);\n        }\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    adminAssistants: Ember.computed('relationships.administrativeAssistant.[]', function () {\n        if (this.get('_adminAssistantsRequest')) {\n            return this.get('_adminAssistantsRequest');\n        }\n\n        let promise = Ember.RSVP.resolve([]);\n        let field = this.getFieldValue('relationships.administrativeAssistant');\n\n        if (!field) {\n            return DS.PromiseArray.create({ promise });\n        }\n\n        if (typeof field.mapBy !== 'function') {\n            Ember.Logger.warn('adminAssistants had unexpected value', { field });\n            return DS.PromiseArray.create({ promise });\n        }\n\n        let ids = field.mapBy('value');\n        let cachedData = this.get('_adminAssistants');\n\n        // Check cached data and resolve with it if it matches\n        if (!!cachedData && cachedData.length > 0) {\n            let cachedIds = Ember.A(cachedData).mapBy('id');\n            if (cachedIds.length === ids.length) {\n                let sameIds = cachedIds.filter(id => ids.includes(id));\n                if (sameIds.length === cachedIds.length) {\n                    return DS.PromiseArray.create({\n                        promise: Ember.RSVP.resolve(cachedData)\n                    });\n                }\n            }\n        }\n\n        if (ids && !_.isEmpty(ids) && ids[0]) {\n            promise = this.store.findMany('person', ids, BASE_PERSON);\n        }\n\n        let promiseArray = DS.PromiseArray.create({\n            promise\n        });\n\n        this.set('_adminAssistantsRequest', promiseArray);\n\n        promiseArray\n            .then(results => {\n                this.set('_adminAssistants', results);\n            })\n            .finally(() => this.set('_adminAssistantsRequest', null));\n\n        return promiseArray;\n    }),\n\n    superiors: Ember.computed(\n        '_superiors',\n        'path.[]',\n        'relationships.manager.[]',\n        'relationships.manager.@each.value',\n        function () {\n            if (this._loadingSuperiors && this.get('_superiors')) {\n                return this.get('_superiors');\n            }\n\n            const cache = this.get('_superiors');\n            if (cache) {\n                return cache.then(people => {\n                    const manager = this.getFieldValue('relationships.manager');\n                    if (!manager || _.isEmpty(manager)) {\n                        this.set('_superiors', null);\n                        return [];\n                    } else if (people.length === 0 && manager.value) {\n                        this.set('_superiors', null);\n                        return this.store\n                            .findSuperiors('person', this.get('id'), BASE_PERSON)\n                            .finally(() => (this._loadingSuperiors = false));\n                    }\n                    return people;\n                });\n            }\n\n            this._loadingSuperiors = true;\n\n            var superiors = this.store\n                .findSuperiors('person', this.get('id'), BASE_PERSON)\n                .finally(() => (this._loadingSuperiors = false));\n            this.set('_superiors', superiors);\n            return superiors;\n        }\n    ),\n\n    directReports: Ember.computed('children.[]', function () {\n        if (this.get('_currentReportsRequest')) {\n            return DS.PromiseArray.create({\n                promise: this.get('_currentReportsRequest')\n            });\n        }\n\n        const id = this.get('id');\n        this.get('logger').info('Refreshing direct reports:', { id });\n\n        let promise = Ember.RSVP.resolve([]);\n\n        let children = this.get('children');\n        if (!Array.isArray(children)) {\n            children = [];\n        }\n        const directReportCount = this.getFieldValue('relationships.directReportCount');\n        const cachedReports = this.get('_directReports.content') || [];\n        const attemptedToLoad = !!this.get('_directReports');\n\n        // Check for the existence of the children prop\n        const dataDiscrepancy = !_.isEmpty(this.get('children')) && children.length !== directReportCount.value;\n\n        const noDirectReports = directReportCount.value === 0 && cachedReports.length === 0;\n\n        let doNotLoad = dataDiscrepancy ? children.length === 0 : noDirectReports && attemptedToLoad;\n\n        const cachedIsSame = _.isEqual(Ember.A(children).sort(), Ember.A(cachedReports).mapBy('id').sort());\n\n        if (doNotLoad) {\n            this.get('logger').info('No direct reports needed to be loaded:', { id });\n        } else if (cachedIsSame && this.get('_directReports')) {\n            this.get('logger').info('Resolving with cached direct reports:', { id });\n            promise = this.get('_directReports') || Ember.RSVP.resolve([]);\n        } else {\n            this.get('logger').info('Loading fresh direct reports', { id });\n            promise = this.store.findDirectReports('person', this.get('id'), BASE_PERSON);\n            this.set(\n                '_directReports',\n                DS.PromiseArray.create({\n                    promise\n                })\n            );\n\n            // We don't use the promise array because we want to keep cached results\n            // and request tracking separate (don't want to clear results)\n            this.set('_currentReportsRequest', promise);\n            promise.finally(() => {\n                this.set('_currentReportsRequest', null);\n            });\n        }\n\n        return DS.PromiseArray.create({\n            promise\n        });\n    }),\n\n    totalReports: Ember.computed('jid', function () {\n        const jid = this.get('jid');\n        const entityId = getEntityObjectId(jid);\n        const id = entityId || this.get('id');\n        const promise = this.get('search')\n            .performSearch(id, 0, 'users', [], ['path'], 'EXACT')\n            .then(results => {\n                if (results && results.results && results.results._meta) {\n                    return results.results._meta.total;\n                }\n            });\n\n        return DS.PromiseObject.create({\n            promise: promise\n        });\n    }),\n\n    siblings: Ember.computed('manager', 'selfAndSiblings', function () {\n        var promise = this.get('selfAndSiblings')\n            .then(siblings => {\n                return siblings.filter(person => {\n                    return person.get('id') !== this.get('id') && person.get('state') === 'active';\n                });\n            })\n            .catch(function () {\n                return [];\n            });\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    selfAndSiblings: Ember.computed('manager', function () {\n        var promise = this.get('manager')\n            .then(function (person) {\n                if (person && person.get) {\n                    return person.get('directReports');\n                }\n\n                return [];\n            })\n            .catch(function () {\n                return [];\n            });\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    descendants: Ember.computed(function () {\n        return DS.PromiseArray.create({\n            promise: Ember.RSVP.resolve([])\n        });\n    }),\n\n    readWritePermissions: Ember.computed(function () {\n        let promise = new Ember.RSVP.Promise(resolve => {\n            resolve({\n                read: [],\n                write: []\n            });\n        });\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    roles: Ember.computed.reads('application.session.roleNames'),\n\n    /* TODO: Start moving these to permissions service */\n    isAdmin: Ember.computed('application.session.roleNames', 'application.session.user.isSuper', function () {\n        if (this.get('application.session.user.isSuper')) {\n            return true;\n        }\n\n        return _.filter(this.get('application.session.roleNames'), 'isAdmin').length > 0;\n    }),\n\n    /* TODO: Start moving these to permissions service */\n    isContentUser: Ember.computed('application.session.namedPermissions', function () {\n        return _.indexOf(this.get('application.session.namedPermissions'), 'content_management_user') > -1;\n    }),\n\n    /* TODO: Start moving these to permissions service */\n    isContentAdmin: Ember.computed('application.session.namedPermissions', function () {\n        return _.indexOf(this.get('application.session.namedPermissions'), 'content_management_admin') > -1;\n    }),\n\n    isNotBusy: Ember.computed('application.session.person.presence', function () {\n        if (this.get('application.session.person.presence') !== 'busy') {\n            return true;\n        }\n        return false;\n    }),\n\n    /* TODO: Start moving these to permissions service */\n    isCommunicateUser: Ember.computed('application.session.namedPermissions', function () {\n        return _.includes(this.get('application.session.namedPermissions'), 'unified_communications');\n    }),\n\n    updatePermissionsOnRouteChange: Ember.observer('application.currentRouteName', function () {\n        if (this.onProfilePage()) {\n            this.get('readWritePermissions');\n        }\n    }),\n\n    clearDirectReportsCache() {\n        this.set('_directReports', null);\n        this.set('children', []);\n    },\n\n    onProfilePage: function () {\n        var onProfilePage = false;\n        var route = this.get('application.currentRouteName');\n        if (route) {\n            onProfilePage = permissionRoutes.indexOf(this.get('application.currentRouteName')) > -1;\n        }\n\n        var personDetailController = this.get('personDetail');\n        if (onProfilePage && personDetailController) {\n            var personId = personDetailController.get('model.id');\n            return this.get('id') === personId;\n        }\n        return false;\n    },\n\n    setProfilePicture: function (image) {\n        this.setPicture(image, 'images.profile');\n        this.notifyPropertyChange('images.profile');\n        this.notifyPropertyChange('profilePicture');\n    },\n\n    setAgentPicture(image) {\n        this.setPicture(image, 'agent.profileImage');\n        this.notifyPropertyChange('agent.profileImage');\n    },\n\n    setPicture(image, path) {\n        let imageSection = this.get(path);\n        if (imageSection === undefined) {\n            this.set(path, {});\n            imageSection = this.get(path);\n        }\n\n        if (imageSection && imageSection.length) {\n            let profileImage = imageSection[0];\n\n            Ember.set(profileImage, 'ref', image.value);\n            Ember.set(profileImage, 'value.fieldId', image._id);\n            Ember.set(profileImage, 'value.fieldPath', 'uploads.images');\n        }\n    },\n\n    getGroupsByType: function (type) {\n        const field = this.get('fieldConfig').getFieldByKey(type);\n        if (!field) {\n            return DS.PromiseArray.create({\n                promise: Ember.RSVP.resolve([])\n            });\n        }\n\n        var membershipIds;\n        var memberships = this.getFieldValue(type);\n        var promise;\n\n        if (!_.isEmpty(memberships) && memberships[0].value && memberships[0].value.length) {\n            membershipIds = memberships.mapBy('value').filter(id => {\n                if (this.store.hasRecordForId('group', id)) {\n                    return !this.store.recordForId('group', id).get('isDeleted');\n                }\n                return true;\n            });\n\n            promise = this.store.findMany('group', membershipIds, BASE_GROUP).then(groups => {\n                if (!groups) {\n                    return [];\n                }\n\n                return groups.rejectBy('state', 'deleted');\n            });\n        } else {\n            promise = Ember.RSVP.resolve([]);\n        }\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    },\n\n    getFieldPathForFieldValue: function (fieldValue, type) {\n        if (type === 'sms' || type === 'voice') {\n            type = 'phone';\n        }\n\n        var fieldPaths = this.fieldConfig.getFieldListByType(type).mapBy('fieldPath');\n\n        return _.find(fieldPaths, path => {\n            var value = this.getFieldValue(path);\n            if (Array.isArray(value)) {\n                var found = _.find(value, function (actual) {\n                    if (fieldValue.value && fieldValue.value.fieldId) {\n                        return actual._id === fieldValue.value.fieldId;\n                    }\n                    return actual._id === fieldValue._id;\n                });\n\n                return !_.isEmpty(found);\n            } else {\n                if (fieldValue.value && fieldValue.value.fieldId) {\n                    return value._id === fieldValue.value.fieldId;\n                }\n                return value._id === fieldValue._id;\n            }\n        });\n    },\n\n    getContactFieldValuesByType: function (type) {\n        var fieldType = type;\n        var collection = [];\n\n        if (type === 'sms' || type === 'voice') {\n            fieldType = 'phone';\n        }\n\n        var fields = this.fieldConfig.getFieldListByType(fieldType);\n\n        var values = _.map(fields, field => {\n            var path = field.getFieldPath();\n            var value = this.getFieldValue(path);\n\n            if (!Array.isArray(value)) {\n                value = [value];\n            }\n\n            var filteredEntries = _.filter(value, function (value) {\n                if (type === 'email') {\n                    return Ember.get(value, 'value.length') > 0;\n                }\n                return Ember.get(value, 'value.number.length') > 0 || Ember.get(value, 'value.extension.length') > 0;\n            });\n\n            if (type === 'sms') {\n                filteredEntries = filteredEntries.filterBy('value.acceptsSMS');\n            }\n\n            return filteredEntries;\n        });\n\n        _.forEach(values, function (value) {\n            if (Array.isArray(value)) {\n                collection = collection.concat(value);\n            } else if (value && typeof value === 'object') {\n                collection.push(value);\n            }\n        });\n\n        return collection;\n    },\n\n    getPermissableSections: function (permissions) {\n        var sections = _.map(permissions, function (fieldPath) {\n            return fieldPath.split('.')[0];\n        });\n\n        return _.uniq(sections);\n    },\n\n    getReadableSections: function () {\n        var permissions = this.get('_readWritePermissions.read');\n        return this.getPermissableSections(permissions);\n    },\n\n    getWriteableSections: function () {\n        var permissions = this.get('_readWritePermissions.write');\n        return this.getPermissableSections(permissions);\n    },\n\n    getReadableFieldsForSection: function (section) {\n        var permissions = this.get('_readWritePermissions.read');\n        var filteredPaths = _.filter(permissions, function (fieldPath) {\n            return fieldPath.indexOf(section.key) === 0;\n        });\n\n        return _.map(filteredPaths, function (fieldPath) {\n            return fieldPath.split('.')[1];\n        });\n    },\n\n    getWriteableFieldsForSection: function (sectionKey) {\n        var permissions = this.get('_readWritePermissions.write');\n        var filteredPaths = _.filter(permissions, function (fieldPath) {\n            return fieldPath.indexOf(sectionKey) === 0;\n        });\n\n        return _.map(filteredPaths, function (fieldPath) {\n            return fieldPath.split('.')[1];\n        });\n    },\n\n    setPrimaryContact(type, entry, fieldPath = null, fieldData = null) {\n        if (type === 'phone') {\n            type = 'voice';\n        }\n\n        let path = `primaryContactInfo.${type}`;\n        let primary = this.getFieldValue(path, true);\n        if (!fieldPath) {\n            fieldPath = this.getFieldPathForFieldValue(entry, type);\n        }\n\n        if (Array.isArray(primary)) {\n            primary = primary[0];\n        }\n\n        let fieldId = entry._id || entry.tempId;\n        if (fieldData) {\n            fieldId = fieldData.get('value._id') || fieldId;\n        }\n\n        Ember.set(primary, '_id', null);\n        Ember.set(primary, 'ref', entry.value);\n        Ember.set(primary, 'value', {\n            fieldId,\n            fieldPath: fieldPath\n        });\n\n        delete primary._id;\n        delete primary.rel;\n\n        Ember.set(this, path, [primary], { overwrite: true });\n    },\n\n    integrationContactInfo(key) {\n        let phones = this.get('contactInfo.phone_other');\n        if (phones && phones.length > 0) {\n            return phones.find(phone => {\n                return phone && phone.value && phone.value.integration === key;\n            });\n        }\n        return null;\n    }\n});\n\nPersonModel.reopenClass({\n    apiEndpoint: 'v2/people'\n});\n\nexport default PersonModel;\n","define(\"connections-ui/models/presence\", [\"exports\", \"ember-purecloud-components/models/presence\"], function (_exports, _presence) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _presence.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport moment from '../utils/dates';\n\nconst { attr } = DS;\n\nconst { inject, computed } = Ember;\n\nexport default DS.Model.extend({\n    name: attr(),\n    chat: attr(),\n    department: attr(),\n    email: attr(),\n    primaryContactInfo: attr(),\n    addresses: attr(),\n    state: attr(),\n    title: attr(),\n    username: attr(),\n    images: attr(),\n    version: attr(),\n    station: attr(),\n    authorization: attr(),\n    fieldConfigs: attr(),\n    selfUri: attr(),\n    outOfOffice: attr(),\n    presence: attr(),\n    token: attr(),\n    type: 'public-api-user',\n\n    intl: inject.service(),\n    session: inject.service(),\n\n    isSuper: false, // set by session service\n    isTrustee: false, // set by session service\n\n    person: computed.reads('session.person'),\n\n    isCloned: computed.bool('token.clonedUser'),\n\n    profile: DS.belongsTo('person', { async: true }),\n\n    // Legacy properties\n    // Here for computed parity with connect-api user\n    // Deprecated. To be phased out soon.\n    userType: computed('isSuper', 'isTrustee', 'isAdmin', function () {\n        if (this.get('isSuper')) {\n            return 'super';\n        } else if (this.get('isTrustee')) {\n            return 'trustee';\n        } else if (this.get('isAdmin')) {\n            return 'admin';\n        } else {\n            return 'employee';\n        }\n    }),\n\n    isAdmin: computed('authorization.roles.@each.name', 'isSuper', function () {\n        if (this.get('isSuper')) {\n            return true;\n        }\n\n        const roles = this.get('authorization.roles') || [];\n        const names = roles.mapBy('name');\n        return _.includes(names, 'admin');\n    }),\n\n    userState: computed('state', function () {\n        return this.get('intl')\n            .lookup(`item.state.${this.get('state')}`)\n            .toString();\n    }),\n\n    inviteLastSent: computed('welcomeSent', function () {\n        var date = moment(new Date(this.get('welcomeSent') * 1000));\n        return date.format('L');\n    })\n});\n","import DS from 'ember-data';\n\nvar QueueModel = DS.Model.extend({\n    name: DS.attr(),\n    type: DS.attr(),\n    memberCount: DS.attr('number'),\n    outboundMessagingAddresses: DS.attr(),\n    outboundEmailAddress: DS.attr(),\n    directRouting: DS.attr(),\n    cannedResponseLibraries: DS.attr({ defaultValue: { mode: 'All' } })\n});\n\nexport default QueueModel;\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\n\nconst { inject, computed, RSVP, run } = Ember;\n\n// CM-4671 : max retry count and retry timeout values for loading user audio recording in inbox\nconst maxNumFetchAudioRetry = 10,\n    retryAfterMs = 6000;\n\nlet recordingRetryCountMap = new Map(); // CM-4671 : map to store retry count of each user recording api call\n\nexport default DS.Model.extend({\n    ajaxService: inject.service('ajax'),\n\n    callerAddress: DS.attr(),\n    callerName: DS.attr(),\n    name: DS.attr(),\n    dateCreated: DS.attr(),\n    dateModified: DS.attr(),\n    contentUri: DS.attr(),\n    workspace: DS.attr(),\n    createdBy: DS.attr(),\n    conversation: DS.belongsTo('conversation'),\n    contentLength: DS.attr(),\n    durationMilliseconds: DS.attr(),\n    thumbnails: DS.attr(),\n    read: DS.attr(),\n    selfUri: DS.attr(),\n    session: inject.service('session'), // CM-5713: to get the value of userRecordingDownload feature toggle\n\n    date: computed('dateCreated', function () {\n        return this.get('dateCreated');\n    }),\n\n    // CM-5713: to get the FT value for userDownload so that will toggle between new transcoding api and old media api for user recordings download\n    userRecordingDownload: computed.readOnly('session.features.userRecordingDownload'),\n\n    mediaUri: computed.or('media.contentLocationUri', 'media.resultUri'), // CM-5777 : media uri computed from contentLocationUri / resultUri response parameter from API\n\n    otherParty: computed('conversation', function () {\n        const model = this.get('conversation');\n        return model.get('otherPartyModel');\n    }),\n\n    audioSource: computed('id', function () {\n        const formatId = BrowserUtils.getSuggestedAudioTypeFrom(['webm', 'wav']);\n        return this.fetchAudio(formatId).then(function (response) {\n            // CM-5777 : media uri computed from contentLocationUri / resultUri response parameter from API\n            let callRecordingUri = response.contentLocationUri || response.resultUri;\n            return callRecordingUri;\n        });\n    }),\n\n    fetchAudio: function (formatId, reload = false) {\n        let resolver, pollingTimeout;\n        const media = this.get('media');\n        if (media) {\n            resolver = function (resolve) {\n                resolve(media);\n            };\n        } else {\n            const adapter = this.store.adapterFor('recorded-call');\n            const apiName = this.get('userRecordingDownload') ? '/transcoding' : '/media'; // CM-5713: to get the FT value for userDownload so that will toggle between new transcoding api and old media api for user recordings download\n            const endpoint = adapter.buildURL('recordedCall', this.get('id') + apiName);\n            // CM-4671: User Recording Inbox UI: Use async flow to download long-duration user recordings\n            resolver = (resolve, reject) => {\n                this.get('ajaxService')\n                    .raw(endpoint, {\n                        data: { formatId, async: true },\n                        headers: adapter.headers,\n                        contentType: 'application/json; charset=UTF-8',\n                        cache: false\n                    })\n                    .then(\n                        res => {\n                            let status = res.jqXHR.status,\n                                userRecRetryCountKey = 'userrec_' + this.get('id') + '_retrycount', // map variable to check indivitual user recording api retry count\n                                userRecRetryCurrent = recordingRetryCountMap.get(userRecRetryCountKey) || 0,\n                                response = res.response;\n                            if (status === 200) {\n                                let recordingUri = response.resultUri || response.contentLocationUri; // CM-5713: to set the uri location as audio source. ( resultUri - response param from transcoding api , contentLocationUri - response param from deprecated media api)\n                                recordingRetryCountMap.delete(userRecRetryCountKey); // remove the map variable when the api returns 200 status\n                                this.set('media', response);\n                                this.set('audioSource', recordingUri); // to update the source of the audio player\n                                return run(null, resolve, response); // resolving the promise immediately after 200 response\n                            } else if (++userRecRetryCurrent < maxNumFetchAudioRetry && status === 202) {\n                                recordingRetryCountMap.set(userRecRetryCountKey, userRecRetryCurrent);\n                                pollingTimeout = setTimeout(() => {\n                                    return this.fetchAudio(formatId, reload);\n                                }, retryAfterMs); // retry after 6 secs to fetch audio call until the api request returns 200 status\n                            } else if (userRecRetryCurrent >= maxNumFetchAudioRetry && status === 202) {\n                                // stop the retry fetch audio call once it reaches the max retry count of 10\n                                if (pollingTimeout) clearTimeout(pollingTimeout);\n                                if (userRecRetryCountKey) recordingRetryCountMap.delete(userRecRetryCountKey);\n                                this.set('audioSource', ''); // setting the audiosource to empty to show the error in audio player when the maximum retry count is done and still receive the 202 resource\n                                return RSVP.reject(new Error('Failed to load user recording'));\n                            }\n                        },\n                        reason => {\n                            this.set('media', {\n                                failed: 'Failed to load user recording'\n                            });\n                            reject(reason);\n                        }\n                    );\n            };\n        }\n\n        return new RSVP.Promise(resolver);\n    }\n}).reopenClass({\n    apiEndpoint: 'v2/userrecordings'\n});\n","define(\"connections-ui/models/recording\", [\"exports\", \"ember-purecloud-components/models/recording\"], function (_exports, _recording) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _recording.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nfunction singularize(type) {\n    type = type.replace('resource_', '');\n    type = type.replace(/s$/, '');\n    return type;\n}\n\nexport default DS.Model.extend({\n    title: DS.attr(),\n    link: DS.attr(),\n    excerpt: DS.attr(),\n    _type: DS.attr(),\n\n    type: Ember.computed('_type', function () {\n        const type = this.get('_type');\n        return singularize(type);\n    })\n});\n","import DS from 'ember-data';\nimport Ember from 'ember';\n\nvar ResponseModel = DS.Model.extend({\n    name: DS.attr(),\n    texts: DS.attr(),\n    dateCreated: DS.attr(),\n    version: DS.attr(),\n    libraries: DS.attr(),\n    substitutions: DS.attr(),\n    responseType: DS.attr(),\n    messagingTemplate: DS.attr(),\n    isOpen: DS.attr(),\n    libraryName: Ember.computed('libraries', function () {\n        var libraries = this.get('libraries');\n\n        return libraries && libraries.length ? libraries[0].name : '';\n    }),\n    isWhatsAppResponse: Ember.computed('responseType', 'messagingTemplate', function () {\n        return this.get('responseType') === 'MessagingTemplate' && !!this.get('messagingTemplate.whatsApp');\n    }),\n    language: Ember.computed.reads('messagingTemplate.whatsApp.language')\n});\n\nexport default ResponseModel;\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nexport default DS.Model.extend({\n    intl: Ember.inject.service(),\n\n    name: DS.attr('string'),\n    description: DS.attr('string'),\n    permissions: DS.attr(),\n    permissionPolicies: DS.attr(),\n    userCount: DS.attr('number'),\n    default: DS.attr('boolean'),\n    base: DS.attr('boolean'),\n    type: Ember.computed('default', function () {\n        return this.get('default')\n            ? this.get('intl').lookup('groups.roles.default')\n            : this.get('intl').lookup('groups.roles.custom');\n    })\n});\n","define(\"connections-ui/models/screenshare-communication\", [\"exports\", \"ember-purecloud-components/models/screenshare-communication\"], function (_exports, _screenshareCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _screenshareCommunication.default;\n    }\n  });\n});\n","define(\"connections-ui/models/social-communication\", [\"exports\", \"ember-purecloud-components/models/social-communication\"], function (_exports, _socialCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _socialCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport moment from 'moment';\nimport _ from 'lodash';\nimport { markdownToHtml } from '../utils/markdown';\nimport ChatMessageMedia from '../mixins/chat-message-media';\nimport ChatMessageMixin from '../mixins/chat-message-mixin';\n\nexport default Ember.Object.extend(ChatMessageMedia, ChatMessageMixin, {\n    //must support default streaming service attributes, but most of these must be overridden to allow\n    //split message functionality, these will be the static streaming service attributes\n    id: null,\n    oid: null,\n    from: null,\n    to: null,\n    time: null,\n    // End of required chat message attrs\n\n    //beginning of split message attributes\n    messageArray: null,\n    splitMessageId: null,\n    splitMessage: true,\n    totalMessages: null,\n    //end of split message attributes\n\n    // set in services/chat.processNewChatMessage()\n    chatUser: null,\n\n    // set in services/chat.markAsHistory()\n    history: false,\n\n    // set in services/chat.setMessageReadState()\n    unread: false,\n\n    // set in chat-room.processCorrections()\n    startOfBlock: null,\n    endOfBlock: null,\n\n    // set in chat-room.addSelfReference()\n    room: null,\n\n    // set in chat-room.addMessage()/markConversationBlockBoundaries()\n    isYourLastMessage: false,\n    //split messages cannot be edited due to the nature of them, so these are all static\n    isEditable: false,\n    isEditing: false,\n    canEdit: false,\n\n    widgetType: 'default',\n\n    init() {\n        this._super(...arguments);\n        this.set('time', moment(this.get('time')));\n        this.set('messageArray', Ember.A([]));\n    },\n\n    //required streaming service attributes, these are put back together from the individual models.\n    raw: Ember.computed('messageArray.@each.raw', function () {\n        return this.get('messageArray')\n            .map(message => message.get('raw'))\n            .join('');\n    }),\n\n    links: Ember.computed('messageArray.@each.links', function () {\n        return _.chain(this.get('messageArray'))\n            .map(message => message.get('links'))\n            .flatten()\n            .value();\n    }),\n\n    files: Ember.computed('messageArray.@each.files', function () {\n        return _.chain(this.get('messageArray'))\n            .map(message => message.get('files'))\n            .flatten()\n            .filter()\n            .value();\n    }),\n\n    mentions: Ember.computed('raw', function () {\n        let match;\n        let mentions = [];\n        const mentionRegex = /\\[@.*\\]\\(#\\/person\\/(.*)\\)/g;\n        const raw = this.get('raw');\n        while ((match = mentionRegex.exec(raw))) {\n            let mention = match[0];\n            let oid = match[1];\n            mentions.push(\n                Ember.Object.create({\n                    mention: mention,\n                    oid: oid\n                })\n            );\n        }\n        return mentions;\n    }),\n\n    hasMentionLinks: Ember.computed.gt('mentions.length', 0),\n\n    //unfortunately we have to remarkdown the message since these were all individual parts of a message\n    messageBody: Ember.computed('raw', function () {\n        return markdownToHtml(this.get('raw'));\n    }),\n\n    editableEndTime: Ember.computed('time', function () {\n        return moment(this.get('time'));\n    }),\n\n    failedMessages: Ember.computed('messageArray.@each.{sendError}', function () {\n        return _.chain(this.get('messageArray'))\n            .filter(message => message.get('sendError'))\n            .value();\n    }),\n\n    sendError: Ember.computed.gt('failedMessages.length', 0),\n\n    pending: Ember.computed('history', 'messageArray.@each.pending', 'totalMessages', function () {\n        if (this.get('history')) {\n            return false;\n        } else {\n            return this.get('messageArray.length') < this.get('totalMessages');\n        }\n    }),\n\n    addSplitMessage(message) {\n        const messages = this.get('messageArray');\n\n        messages.pushObject(message);\n        messages.sort((a, b) => (a.get('splitMessageIndex') < b.get('splitMessageIndex') ? -1 : 1));\n\n        this.notifyPropertyChange('messageArray');\n    }\n});\n","import DS from 'ember-data';\nimport Ember from 'ember';\n\nconst { computed } = Ember;\n\nconst StationModel = DS.Model.extend({\n    intl: Ember.inject.service(),\n\n    userId: DS.attr(),\n    stationId: DS.attr(),\n    name: DS.attr(),\n    status: DS.attr(),\n    type: DS.attr(),\n    webrtcMediaDscp: DS.attr(),\n    webrtcForceTurn: DS.attr(),\n    persistentConnection: DS.attr(),\n    webRtcUserId: DS.attr(),\n    webRtcCallAppearances: DS.attr(),\n    webRtcRequireMediaHelper: DS.attr(),\n\n    state: computed('status', function () {\n        return this.get('intl').lookup(`purecloud.station.status.${this.get('status').toLowerCase()}`);\n    }),\n\n    available: computed('status', function () {\n        return this.get('status').toLowerCase() === 'available';\n    }),\n\n    isWebrtc: computed('type', 'name', function () {\n        return this.get('type') === 'inin_webrtc_softphone';\n    }),\n\n    isRemoteStation: computed.equal('type', 'inin_remote')\n});\n\nStationModel.reopenClass({\n    apiEndpoint: 'v2/stations'\n});\n\nexport default StationModel;\n","import { hasKey, includes } from 'connections-ui/utils/types';\n\nconst GeneralUnrecoverableAppFailureTypes = [\n    'invalidEnv',\n    'timeMachineFailure',\n    'missingAuthenticator',\n    'generalAuthenticationFailure',\n    'sessionInvalidationFailure',\n    'profileFetchServerFailure'\n] as const;\n\nexport type GeneralUnrecoverableAppFailure = {\n    type: (typeof GeneralUnrecoverableAppFailureTypes)[number];\n};\n\nconst SessionBootstrapSteps = [\n    'getTokenFailure',\n    'loadFeatureToggles',\n    'setupTheme',\n    'setupUserAndTrustee',\n    'establishDirectorySession',\n    'initServerTranslations',\n    'loadPresences',\n    'loadUserDetails',\n    'loadUserFavorites',\n    'setupCarrierPigeon',\n    'initAppSession',\n    'loadOrgPermissions',\n    'loadOrgTranscriptSettings',\n    'loadPerson'\n] as const;\n\nexport type SessionBootstrapFailure = {\n    type: 'sessionBootstrapError';\n    status?: number;\n    failedStep: (typeof SessionBootstrapSteps)[number];\n};\n\nexport function isGeneralUnrecoverableAppFailure(toCheck: unknown): toCheck is GeneralUnrecoverableAppFailure {\n    if (!toCheck || typeof toCheck !== 'object') {\n        return false;\n    }\n\n    if (!hasKey(toCheck, 'type') || typeof toCheck.type !== 'string') {\n        return false;\n    }\n\n    return includes(GeneralUnrecoverableAppFailureTypes, toCheck.type);\n}\n\nexport function isSessionBootstrapFailure(toCheck: unknown): toCheck is SessionBootstrapFailure {\n    if (!toCheck || typeof toCheck !== 'object') {\n        return false;\n    }\n\n    if (!hasKey(toCheck, 'type') || toCheck.type !== 'sessionBootstrapError') {\n        return false;\n    }\n\n    if (hasKey(toCheck, 'status') && !['undefined', 'number'].includes(typeof toCheck.status)) {\n        return false;\n    }\n\n    if (!hasKey(toCheck, 'failedStep') || typeof toCheck.failedStep !== 'string') {\n        return false;\n    }\n\n    return includes(SessionBootstrapSteps, toCheck.failedStep);\n}\n\nexport function isUnrecoverableAppFailure(toCheck: unknown): toCheck is UnrecoverableAppFailure {\n    return isGeneralUnrecoverableAppFailure(toCheck) || isSessionBootstrapFailure(toCheck);\n}\n\ntype UnrecoverableAppFailure = GeneralUnrecoverableAppFailure | SessionBootstrapFailure;\n\nexport default UnrecoverableAppFailure;\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport moment from '../utils/dates';\n\nvar UserModel = DS.Model.extend({\n    _id: DS.attr(),\n    lang: DS.attr(),\n    personId: DS.attr(),\n    personGuid: DS.attr(),\n    state: DS.attr(),\n    version: DS.attr(),\n    mt: DS.attr(),\n    email: DS.attr(),\n    welcomeSent: DS.attr(),\n    lastLogin: DS.attr(),\n    clientVersions: DS.attr(),\n    userType: DS.attr(),\n    passwordSaved: DS.attr(),\n    orgId: DS.attr(),\n\n    intl: Ember.inject.service(),\n\n    person: Ember.computed('personGuid', function () {\n        return this.store.find('person', this.get('personGuid'));\n    }),\n\n    isAdmin: Ember.computed('userType', function () {\n        return this.get('userType') === 'admin';\n    }),\n\n    isSuper: Ember.computed('userType', function () {\n        return this.get('userType') === 'super';\n    }),\n\n    userState: Ember.computed('state', function () {\n        return this.get('intl')\n            .lookup(`item.state.${this.get('state')}`)\n            .toString();\n    }),\n\n    inviteLastSent: Ember.computed('welcomeSent', function () {\n        var date = moment(new Date(this.get('welcomeSent') * 1000));\n        return date.format('L');\n    })\n});\n\nUserModel.reopenClass({\n    apiEndpoint: 'v2/users'\n});\n\nexport default UserModel;\n","define(\"connections-ui/models/video-communication\", [\"exports\", \"ember-purecloud-components/models/video-communication\"], function (_exports, _videoCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _videoCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport moment from '../utils/dates';\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\n\nconst { computed } = Ember;\n\nvar VoicemailMessageModel = DS.Model.extend({\n    conversation: DS.attr(),\n    read: DS.attr(),\n    audioRecordingDurationSeconds: DS.attr(),\n    audioRecordingSizeBytes: DS.attr(),\n    createdDate: DS.attr(),\n    modifiedDate: DS.attr(),\n    callerAddress: DS.attr(),\n    callerName: DS.attr(),\n    callerUser: DS.attr(),\n    name: DS.attr(),\n    selfUri: DS.attr(),\n    parentIds: DS.attr(),\n    group: DS.attr(),\n    note: DS.attr(),\n    copiedTo: DS.attr(),\n    copiedFrom: DS.attr(),\n    otherParties: DS.attr(),\n    displayName: DS.attr(),\n    dnis: DS.attr(),\n\n    ajax: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    useVoicemailApp: true,\n\n    init() {\n        this._super(...arguments);\n        // we will call this method in inbox service when loading voicemails when this feature toggle is enabled.\n        // no need to call here while toggle is enabled.\n        if (!this.get('useVoicemailApp')) {\n            this.loadParticipants();\n        }\n    },\n\n    type: 'voicemail',\n\n    date: computed('createdDate', function () {\n        return this.get('createdDate');\n    }),\n\n    mediaUri: computed('media.mediaFileUri', function () {\n        return this.get('media.mediaFileUri');\n    }),\n\n    caller: computed('callerAddress', 'callerName', function () {\n        return this.get('callerName') || this.get('callerAddress') || 'Not Available';\n    }),\n\n    dateFromNow: computed('createdDate', function () {\n        var createdDate = this.get('createdDate');\n        if (createdDate) {\n            return moment(createdDate).fromNow();\n        }\n    }),\n\n    audioSource: computed('id', function () {\n        const formatId = BrowserUtils.getSuggestedAudioTypeFrom(['webm', 'wav']);\n        return this.fetchAudio(formatId).then(({ mediaFileUri }) => mediaFileUri);\n    }),\n\n    isGroupVoicemail: computed('group.{id,name}', function () {\n        const group = this.get('group');\n        return !_.isEmpty(group) && group.id && group.name;\n    }),\n\n    groupEntity: computed('group.entity', function () {\n        const id = this.get('group.id');\n        return this.get('store').findRecord('group', id, { reload: false, backgroundReload: false });\n    }),\n\n    loadParticipants: function () {\n        if (this.get('callerUser') || this.get('isGroupVoicemail')) {\n            return;\n        }\n        const conversationId = this.get('conversation.id');\n        if (this.get('conversation')) {\n            return this.loadEPCConversation(conversationId);\n        }\n    },\n\n    loadEPCConversation: async function (conversationId) {\n        let conversation;\n        try {\n            conversation = await this.store.findRecord('conversation', conversationId);\n        } catch (err) {\n            Ember.Logger.warn('Failed to load conversation for voicemail', { err });\n            return;\n        }\n\n        const participants = conversation.get('participants');\n        const userId = this.get('session.person.guid');\n        const participant = participants.find(participant => {\n            return participant.get('userId') !== userId;\n        });\n\n        if (participant) {\n            const userId = participant.get('userId');\n            if (userId) {\n                this.set('callerUser', { id: userId });\n            }\n\n            let callerName = participant.get('name');\n            if (!callerName) {\n                callerName = await this.fetchCallerName(userId);\n            }\n\n            this.set('callerName', callerName);\n        }\n\n        this.set('participants', participants);\n    },\n\n    fetchCallerName: function (userId) {\n        return this.store\n            .findRecord('public-api-user', userId)\n            .then(user => user.get('name'))\n            .catch(err => {\n                Ember.Logger.warn('Failed to fetch person name for voicemail', { err });\n                return '';\n            });\n    },\n\n    fetchAudio: function (formatId, forceReload) {\n        forceReload = forceReload || false;\n\n        var resolver;\n        var media = this.get('media');\n        if (media && !forceReload) {\n            resolver = function (resolve) {\n                resolve(media);\n            };\n        } else {\n            var adapter = this.store.adapterFor('voicemail-message');\n            var endpoint = adapter.buildURL('voicemailMessage', this.get('id') + '/media');\n\n            resolver = (resolve, reject) => {\n                this.get('ajax')\n                    .ajaxGet(endpoint, {\n                        data: { formatId },\n                        headers: adapter.headers,\n                        contentType: 'application/json; charset=UTF-8',\n                        cache: false\n                    })\n                    .then(\n                        data => {\n                            this.set('media', data);\n\n                            Ember.run(null, resolve, data);\n                        },\n                        reason => {\n                            // var msg = Ember.get(reason, 'responseJSON.message');\n                            this.set('media', {\n                                failed: 'Failed to load voicemail message'\n                            });\n                            reject(reason);\n                        }\n                    );\n            };\n        }\n\n        return new Ember.RSVP.Promise(resolver);\n    }\n});\n\nVoicemailMessageModel.reopenClass({\n    apiEndpoint: 'v2/voicemail/messages'\n});\n\nexport default VoicemailMessageModel;\n\n/*\nVoicemailMessage {\nconversation (UserCall, optional),\nread (boolean, optional),\naudioRecordingDurationSeconds (integer, optional),\naudioRecordingSizeBytes (integer, optional),\ncreatedDate (string, optional),\nmodifiedDate (string, optional),\ncallerAddress (string, optional),\ncallerName (string, optional),\ncallerUser (User, optional),\nname (string, optional),\nid (string, optional),\nselfUri (URI, optional),\nparentIds (array[Object], optional)\n}\n*/\n\n/*\n    this is separate endpiont from the message list????\n\nVoicemailMediaInfo {\nmediaFileUri (URI, optional),\nmediaImageUri (URI, optional),\nname (string, optional),\nselfUri (URI, optional),\nid (string, optional),\nparentIds (array[Object], optional)\n}\n*/\n","import Ember from 'ember';\n\nexport default Ember.Object.extend({\n    id: null,\n    mutableGroupId: null,\n    timestamp: null,\n    type: null,\n    shiftTrade: null,\n    alternativeShift: null,\n    timeOffRequest: null,\n    markedAsRead: null,\n    agentNotification: null,\n    otherNotificationIdsInGroup: null,\n    adherenceExplanation: null\n});\n","export default Ember.HTMLBars.template({\"id\":\"r9Qzlnt4\",\"block\":\"{\\\"statements\\\":[[1,[26,[\\\"outlet\\\"]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/phone/template.hbs\"}});","import Resolver from 'ember-resolver';\nexport default Resolver;\n","import Ember from 'ember';\nimport config from './config/environment';\n\nexport const NOOP_TRANSITION = 'NOOP_TRANSITION';\n\nconst Router = Ember.Router.extend({\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    location: config.locationType,\n    rootURL: config.rootURL,\n\n    titleDivider: '-',\n\n    transitionTo: function () {\n        const transition = this._super(...arguments);\n        if (transition && transition.then && typeof transition.then === 'function') {\n            transition.then(() => {\n                if (transition.isActive && !transition.isAborted) {\n                    this.trigger(NOOP_TRANSITION);\n                }\n            });\n        }\n        return transition;\n    }\n});\n\nRouter.map(function () {\n    this.route('maintenance');\n    this.route('no-access');\n    this.route('login');\n    this.route('login-oauth');\n\n    this.route('search');\n\n    this.route('person', { resetNamespace: true }, function () {\n        this.route('list');\n\n        this.route('detail', { path: ':person_id' }, function () {\n            this.route('edit');\n        });\n\n        this.route('new-detail', { path: 'new/:person_id' });\n    });\n\n    this.route('card', { resetNamespace: true }, function () {\n        this.route('detail', { path: ':person_id' });\n        this.route('tree', { path: 'tree/:person_id' });\n    });\n\n    // to do, the link-tos to this route need to be replaced and proxied to\n    // a nav event in the parent frame\n    this.route('group', { resetNamespace: true }, function () {\n        this.route('detail', { path: ':group_id' }, function () {\n            this.route('edit');\n        });\n    });\n\n    this.route('time-machine', { path: 'timemachine/*buildTag' });\n\n    this.route('skillgroup', { resetNamespace: true }, function () {\n        this.route('detail', { path: ':skillgroup_id' }, function () {\n            this.route('edit');\n        });\n    });\n\n    this.route('engage.recording-management-redirect', {\n        path: 'admin/quality/recordings/screensessions',\n        resetNamespace: true\n    });\n});\n\nexport default Router;\n","import Ember from 'ember';\n\nexport default Ember.Route.extend({\n    beforeModel(transition) {\n        this._super(...arguments);\n\n        if (transition.isActive === false) {\n            // Route canceled for auth\n            return;\n        }\n\n        const url = transition.intent.url;\n\n        if (url && url.indexOf('/admin/interactions') === 0) {\n            this.replaceWith('/analytics/interactions');\n        }\n    },\n\n    actions: {\n        didTransition() {},\n        gotoRoute(route) {\n            this.transitionTo(route);\n        }\n    }\n});\n","import Ember from 'ember';\n\nimport UnprotectedRouteMixin from '../mixins/unprotected-route-mixin';\nimport ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mixin';\n\n// Use the uprotectedroutemixin to skip the custom, protected, default Ember.Route\nexport default Ember.Route.extend(UnprotectedRouteMixin, ApplicationRouteMixin, {\n    mediaProviders: Ember.inject.service(),\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n    purecloudOauth: Ember.inject.service(),\n    settings: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n\n    init() {\n        this._super(...arguments);\n\n        this.get('session').on('sessionInvalidationFailed', this, this.onSessionInvalidationFailure);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n\n        this.get('session').off('sessionInvalidationFailed', this, this.onSessionInvalidationFailure);\n    },\n\n    actions: {\n        willTransition(transition) {\n            this.applicationService.postMessageRouteChange(transition); // broadcast route change to parent if iframed\n\n            if (this.get('applicationService.errorState')) {\n                this.transitionTo('maintenance');\n                return;\n            }\n        },\n\n        transitionToRoute(route, id) {\n            if (id) {\n                this.transitionTo(route, id);\n            } else {\n                this.transitionTo(route);\n            }\n        },\n\n        transitionToEntityDetail(entity) {\n            var route = entity.get('type') + '.detail';\n            this.transitionTo(route, entity.get('id'));\n        },\n\n        logout() {\n            var session = this.get('session');\n            session.logout();\n        },\n\n        linkTo(route, param) {\n            if (param) {\n                this.transitionTo(route, param);\n            } else {\n                this.transitionTo(route);\n            }\n        },\n\n        error(error, transition) {\n            Ember.Logger.error('Error transitioning route: ', {\n                error,\n                remoteData: { routeName: transition.targetName }\n            });\n            Ember.onerror(error);\n            return true;\n        },\n\n        performRecentSearch(recent, filter) {\n            var search = this.controllerFor('search');\n            var entity = search.get('entity');\n\n            if (!filter) {\n                filter = entity;\n            }\n\n            this.transitionTo('search', {\n                queryParams: {\n                    query: recent.query,\n                    entity: filter,\n                    saveHistory: false\n                }\n            });\n        },\n\n        performSearch(query, filter, queryFacets) {\n            var search = this.controllerFor('search');\n            var entity = search.get('entity');\n\n            if (!filter) {\n                filter = entity;\n            }\n\n            if (!queryFacets) {\n                queryFacets = '';\n            }\n\n            const isToggleEnabled = this.get('session.features')['ATLAS-467_integrate-connections-ui'];\n            if (isToggleEnabled) {\n                this.transitionTo(`/search-v2?entity=person&query=${query}`);\n                return;\n            }\n\n            this.transitionTo('search', {\n                queryParams: {\n                    query: query,\n                    entity: filter,\n                    queryFacets: queryFacets,\n                    saveHistory: true\n                }\n            });\n        },\n\n        togglePanel() {},\n        openPanel() {},\n        closePanel() {},\n        openPreferencesModal() {},\n        toggleCommunicationSidebarExpanded() {},\n        ensureRouteVisibility() {},\n\n        openChatRoom(jid) {\n            this.get('embedded').startChatByJid(jid);\n        },\n\n        async openChatRoomWithVideo(id, useMediaProviders = false) {\n            if (!useMediaProviders) {\n                this.get('embedded').launchVideoWithPersonById(id);\n            }\n        },\n\n        startCallPersonById(id) {\n            this.get('embedded').startCallPersonById(id);\n        },\n\n        startCallByNumber(phoneNumber) {\n            this.get('embedded').startCallByNumber(phoneNumber);\n        },\n\n        loading(transition, originRoute) {\n            if (\n                originRoute.routeName === 'application' &&\n                !this.get('session.isAuthenticated') &&\n                !this.get('purecloudOauth.inLogoutBounce')\n            ) {\n                // Show the application-loading route on session restore; otherwise,\n                // it's not worth the flash before redirecting or showing the login route\n                return true;\n            }\n        }\n    },\n\n    // Ember Simple Auth Impls\n    sessionAuthenticated() {\n        let stateRestore = this.get('purecloudOauth').popRestoreState();\n        if (stateRestore) {\n            window.location = stateRestore.url;\n            return;\n        }\n        this._super();\n    },\n\n    sessionInvalidated() {\n        // Record the logout time to handle the logout bounce\n        this.get('purecloudOauth').recordLogoutTime();\n        this.set('application.errorState', { type: 'missingAuthenticator' });\n        this.transitionTo('maintenance');\n    },\n\n    onSessionInvalidationFailure() {\n        this.set('application.errorState', { type: 'sessionInvalidationFailure' });\n        this.transitionTo('maintenance');\n    },\n\n    beforeModel(transition) {\n        if (this.get('applicationService.errorState')) {\n            this.transitionTo('maintenance');\n            return;\n        }\n\n        if (Ember.get(transition, 'queryParams.mobile')) {\n            this.get('application').set('mobileQueryParameter', true);\n        }\n\n        return this._super(transition);\n    }\n});\n","import Ember from 'ember';\n\nfunction isGuid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nvar CardDetailRoute = Ember.Route.extend({\n    intl: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    routeTitle: '',\n\n    getUserId(transition) {\n        const id = transition.params['card.detail'].person_id;\n        if (isGuid(id)) {\n            return Ember.RSVP.Promise.resolve(id);\n        }\n\n        // We've got a mongoid, so we need to translate that to something useable...\n        const orgName = this.get('session.org.shortName');\n        const jid = `${id}@${orgName}.orgspan.com`;\n\n        return this.get('store')\n            .findMany('person', [jid])\n            .then(res => {\n                if (res && res[0]) {\n                    transition.abort();\n\n                    this.replaceWith('card.tree', res[0].get('id'));\n                }\n            })\n            .catch(() => this.transitionTo('person.detail', this.get('session.person.id')));\n    },\n\n    beforeModel(transition) {\n        this.getUserId(transition).then(id => {\n            const newHash = `#/card-v2/${id}`;\n            if (newHash !== window.top.location.hash) {\n                this.get('embedded').sendNavigationEvent({\n                    hash: newHash\n                });\n            }\n        });\n    },\n\n    model: function (params) {\n        this.set('routeTitle', this.get('intl').lookup('components.navMenu.cardView').toString());\n        return this.store.find('person', params.person_id);\n    },\n\n    afterModel: function (model) {\n        this.get('embedded').sendPageData({\n            helpPath: 'card.detail',\n            title: this.get('routeTitle')\n        });\n\n        var promises = [model.get('directReports'), model.get('manager'), model.get('managerSiblings')];\n        return Ember.RSVP.all(promises);\n    }\n});\n\nexport default CardDetailRoute;\n","import Ember from 'ember';\n\nfunction isGuid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nexport default Ember.Route.extend({\n    intl: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n    store: Ember.inject.service(),\n\n    routeTitle: '',\n\n    getUserId(transition) {\n        const id = transition.params['card.tree'].person_id;\n        if (isGuid(id)) {\n            return Ember.RSVP.Promise.resolve(id);\n        }\n\n        // We've got a mongoid, so we need to translate that to something useable...\n        const orgName = this.get('session.org.shortName');\n        const jid = `${id}@${orgName}.orgspan.com`;\n\n        return this.get('store')\n            .findMany('person', [jid])\n            .then(res => {\n                if (res && res[0]) {\n                    transition.abort();\n\n                    this.replaceWith('card.tree', res[0].get('id'));\n                }\n            })\n            .catch(() => this.transitionTo('person.detail', this.get('session.person.id')));\n    },\n\n    beforeModel(transition) {\n        this.getUserId(transition).then(id => {\n            const newHash = `#/card-v2/tree/${id}`;\n            if (newHash !== window.top.location.hash) {\n                this.get('embedded').sendNavigationEvent({\n                    hash: newHash\n                });\n            }\n        });\n    },\n\n    model(params) {\n        this.set('routeTitle', this.get('intl').lookup('components.navMenu.treeView').toString());\n        return this.store.find('person', params.person_id);\n    },\n\n    afterModel() {\n        this.get('embedded').sendPageData({\n            helpPath: 'card.detail',\n            title: this.get('routeTitle')\n        });\n    }\n});\n","import Ember from 'ember';\nimport { inject as service } from '@ember/service';\n\nexport default Ember.Route.extend({\n    session: service(),\n    beforeModel() {\n        this._super(...arguments);\n        return this.replaceWith('/admin/custom-fields-v2/contacts');\n    }\n});\n","import Ember from 'ember';\nimport { inject as service } from '@ember/service';\n\nexport default Ember.Route.extend({\n    session: service(),\n    beforeModel() {\n        this._super(...arguments);\n        return this.replaceWith('/admin/custom-fields-v2/external-orgs');\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport ModelRouteMixin from '../../mixins/model-route';\n\nfunction isGuid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nvar GroupDetailRoute = Ember.Route.extend(ModelRouteMixin, {\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    notification: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n\n    routeTitle: 'Group Profile',\n\n    canEditRoles: Ember.computed('session.namedPermissions', function () {\n        let namedPermissions = this.get('session.namedPermissions') || [];\n        let hasRolesView = _.includes(namedPermissions, 'authorization:role:view');\n        let hasGrantsEdit = _.includes(namedPermissions, 'authorization:grant:add');\n        return hasRolesView && hasGrantsEdit;\n    }),\n\n    updateParentRoute(groupId) {\n        if (\n            this.get('session.features.AGORA-268_connections-ui-in-admin-ui') &&\n            this.get('application.adminUIContext')\n        ) {\n            return;\n        }\n        const newHash = `#/group-v2/${groupId}`;\n        if (newHash !== window.top.location.hash) {\n            this.get('embedded').sendNavigationEvent({\n                hash: newHash\n            });\n        }\n    },\n\n    actions: {\n        willTransition(transition) {\n            let controller = this.controllerFor('group.detail');\n            if (controller.get('isEditing')) {\n                let msg = this.get('intl').lookup('notification.group.navigate').toString();\n                if (!window.confirm(msg)) {\n                    transition.abort();\n                    return false;\n                }\n            }\n\n            controller.set('isEditing', false);\n\n            return true;\n        }\n    },\n\n    model: function (params, transition) {\n        const id = params.group_id;\n\n        let currentModel = this.store.peekRecord('group', id);\n        if (currentModel && currentModel.get('isDeleted')) {\n            transition.abort();\n            const message = this.get('intl').lookup('notification.group.deletedGroup').toString();\n            this.get('notification').info(null, message, {\n                hideAfter: 8,\n                forceBrowserNotification: true\n            });\n            return;\n        }\n\n        this.updateParentRoute(id);\n\n        return this.store.findRecord('group', id, { include: 'policy' }).then(group => {\n            if (!group.get('guid') || isGuid(group.get('id'))) {\n                return group;\n            }\n            this.transitionTo('group.detail', group.get('guid'));\n        });\n    },\n\n    afterModel(group) {\n        let state = group.get('state');\n        if (state === 'deleted' || group.get('isDeleted')) {\n            const message = this.get('intl').lookup('notification.group.deletedGroup').toString();\n            this.get('notification').info(null, message, {\n                hideAfter: 8,\n                forceBrowserNotification: true\n            });\n\n            this.transitionTo('person.detail', this.get('session.person.id'));\n            return;\n        }\n\n        return group.reload().then(group => {\n            if (this.get('canEditRoles')) {\n                return group.getGrants();\n            } else {\n                return Ember.RSVP.resolve();\n            }\n        });\n    },\n\n    setupController(controller, model) {\n        this._super(controller, model);\n\n        this.set('routeTitle', model.get('name'));\n\n        let sidebar = this.get('sidebarService');\n        if (sidebar) {\n            sidebar.set('routeTitle', model.get('name'));\n        }\n\n        this.get('embedded').sendPageData({\n            helpPath: 'group.detail.index',\n            title: this.get('routeTitle')\n        });\n    }\n});\n\nexport default GroupDetailRoute;\n","import Ember from 'ember';\n\nconst IndexRoute = Ember.Route.extend({\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n\n    beforeModel: function (transition) {\n        var result = this._super(transition);\n\n        /* @see services/Session.authenticateWithSession() as this is the ember-simple-auth\n         * authenicator handler function before this route catch-all (empty) route.\n         */\n\n        if (transition.isActive === false) {\n            // Route canceled for auth\n            return;\n        }\n\n        return Ember.RSVP.resolve(result).then(() => {\n            var personId = this.get('session.person.id') || this.get('session.user.personId');\n\n            if (this.get('session.user.isSuper') || this.get('session.user.isTrustee')) {\n                return this.transitionTo('search');\n            }\n\n            if (!personId) {\n                Ember.Logger.error(\"Index Route: Standard user has no 'personId'.  Transitioning to no-access.\");\n                this.set('session.hasAppAccess', false);\n                return this.transitionTo('no-access');\n            }\n\n            return this.transitionTo('person.detail', personId);\n        });\n    }\n});\n\nexport default IndexRoute;\n","import Ember from 'ember';\nimport UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin';\nimport { SESSION_BOOTSTRAP_ERROR_TYPE } from 'connections-ui/services/session';\n\nconst { Route, inject, RSVP } = Ember;\n\nvar OAuth2LoginRoute = Route.extend(UnauthenticatedRouteMixin, {\n    controllerName: 'login-oauth',\n\n    intl: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n    purecloudOauth: inject.service(),\n    authenticator: null,\n\n    routeTitle: Ember.computed(function () {\n        return this.get('intl').lookup('auth.login');\n    }),\n\n    actions: {\n        mobileOfferDeclined() {\n            this.set('application.offerMobileApp', false);\n            return Ember.RSVP.resolve();\n        },\n        authenticate() {\n            return this._authenticate(this.modelFor(this.routeName));\n        }\n    },\n\n    beforeModel: function (transition) {\n        if (!this.get('authenticator')) {\n            let authenticator = Ember.getOwner(this).lookup('authenticator:directory');\n            if (authenticator) {\n                this.set('authenticator', authenticator);\n            } else {\n                Ember.Logger.error(\"Failed to locate 'authenticator:directory' in Container.\");\n                this.set('application.errorState', { type: 'missingAuthenticator' });\n                return this.transitionTo('maintenance');\n            }\n        }\n\n        this._super(transition);\n\n        return this.get('intl').loadTranslations();\n    },\n\n    model: function () {\n        return Ember.Object.create(this.get('authenticator').extractAuthData());\n    },\n\n    afterModel: function (resolvedModel) {\n        if (resolvedModel.access_token) {\n            // Returning from Successful Login\n\n            /*\n             * Set denied so we don't get reprompted by this route or application\n             * The user is either not mobile or previously denied the app before login\n             */\n            this.set('application.offerMobileApp', false);\n\n            resolvedModel.set('offerMobileApp', this.get('application.offerMobileApp'));\n            // Resolve with the model to show loading screen and init local session\n            return RSVP.resolve(resolvedModel);\n        } else {\n            // Need authentication\n\n            resolvedModel.state = this.get('purecloudOauth').serializeRestoreState();\n\n            let offerMobileApp = this.get('application.offerMobileApp') && !this.get('purecloudOauth.inLogoutBounce');\n\n            if (offerMobileApp) {\n                // Resolve with the model to show mobile offer and then auth\n                resolvedModel.set('offerMobileApp', true);\n                return RSVP.resolve(resolvedModel);\n            } else {\n                // Return a non-resolving promise so the redirect can complete without a flash of the route\n                return new RSVP.Promise(() => {\n                    this.set('holdPromiseRef', this._authenticate(resolvedModel));\n                });\n            }\n        }\n    },\n\n    /**\n     * Invokes the OAuth authenticator.\n     *\n     * @returns An promise which will either:\n     * <ul>\n     * <li>Resolve on authenticator success.  [Note:] ESA will transition on success/failure.</li>\n     * <li>Handle the authenticator failure (auth UI, no-access, failure) and reject for callers.  Callers do not need to take any action.</li>\n     * </ul>\n     */\n    _authenticate: function (authData) {\n        return new RSVP.Promise((resolve, reject) => {\n            this.get('session')\n                .authenticate('authenticator:directory', authData)\n                .then(resolve)\n                .catch(rejectionDetails => {\n                    if (rejectionDetails && rejectionDetails.reason === 'noToken') {\n                        if (window === window.parent) {\n                            // Not in an iframe. For the standalone mode for development.\n                            reject('unauthenticated');\n                            window.location = rejectionDetails.authUrl;\n                        } else {\n                            // In an iframe, in WebDirectory?\n                            reject('failure');\n                            this.set('application.errorState', {\n                                type: SESSION_BOOTSTRAP_ERROR_TYPE,\n                                failedStep: 'getTokenFailure'\n                            });\n                            this.transitionTo('maintenance');\n                        }\n                    } else if (rejectionDetails && rejectionDetails.reason === 'noAccess') {\n                        // Currently don't distinguish between 400s and 500s in local session.  Assuming our services are ok\n                        reject('unauthorized');\n                        this.transitionTo('no-access');\n                    } else if (rejectionDetails && rejectionDetails.reason === SESSION_BOOTSTRAP_ERROR_TYPE) {\n                        // Bootstrap error will already have been logged\n                        reject('failure');\n                        this.set('application.errorState', {\n                            type: SESSION_BOOTSTRAP_ERROR_TYPE,\n                            failedStep: rejectionDetails.failedStep,\n                            status: rejectionDetails.status\n                        });\n                        this.transitionTo('maintenance');\n                    } else {\n                        let authFailureReason =\n                            rejectionDetails && rejectionDetails.reason ? rejectionDetails.reason : 'authFailure';\n                        Ember.Logger.error('Authentication Failed:', {\n                            rejectionDetails,\n                            remoteData: {\n                                sensitive: {\n                                    reason: authFailureReason\n                                }\n                            }\n                        });\n                        reject('failure');\n                        this.set('application.errorState', {\n                            type: 'generalAuthenticationFailure'\n                        });\n                        this.transitionTo('maintenance');\n                    }\n                });\n        });\n    }\n});\n\nexport default OAuth2LoginRoute;\n","import Ember from 'ember';\n\n// This route's sole purpose is to redirect users to the index page. It's for people who have bookmarked the login page\nvar LoginRoute = Ember.Route.extend({\n    beforeModel: function (transition) {\n        var result = this._super(transition);\n\n        if (transition.isActive === false) {\n            // Route canceled for auth\n            return result;\n        } else {\n            return this.transitionTo('index');\n        }\n    }\n});\n\nexport default LoginRoute;\n","import Ember from 'ember';\nimport { Promise, resolve } from 'rsvp';\nimport UnrecoverableAppFailure, { isSessionBootstrapFailure } from 'connections-ui/models/unrecoverable-app-failure';\nimport { buildCommonTelemetryContext } from 'connections-ui/services/analytics';\nimport { hasKey } from 'connections-ui/utils/types';\nimport UnprotectedRouteMixin from '../mixins/unprotected-route-mixin';\nimport { Transition } from '../utils/ember-types';\nimport { addPageAction } from '../utils/newrelic';\n\nconst { inject, Route } = Ember;\n\nconst MaintenanceRoute = Route.extend(UnprotectedRouteMixin, {\n    intl: inject.service(),\n    session: inject.service(),\n    applicationService: inject.service('application'),\n\n    beforeModel: function (transition: Transition): any {\n        return resolve()\n            .then(() => {\n                return this._super(transition);\n            })\n            .then(() => {\n                if (hasKey(transition, 'isActive') && transition.isActive === false) {\n                    // Route canceled for auth\n                    return;\n                }\n\n                const errorState = this.get('applicationService').get('errorState');\n                if (!errorState) {\n                    return this.transitionTo('index');\n                }\n\n                if (!isSessionBootstrapFailure(errorState)) {\n                    addPageAction(\n                        'maintenanceMode',\n                        Object.assign(\n                            {\n                                failedStep: errorState.type\n                            },\n                            buildCommonTelemetryContext({\n                                applicationService: this.get('applicationService'),\n                                sessionService: this.get('session'),\n                                intlService: this.get('intl')\n                            })\n                        )\n                    );\n                }\n\n                return (this.get('intl') as any).loadTranslations();\n            });\n    },\n\n    model: function (): Promise<undefined | UnrecoverableAppFailure> {\n        return resolve()\n            .then(() => {\n                return this._super(...arguments);\n            })\n            .then(() => {\n                // We assert errorState exists in the beforeModel hook.\n                // The controller still needs to account for untyped errorState until we're fully TS\n                return this.get('applicationService').get('errorState')!;\n            });\n    },\n\n    actions: {\n        reloadApp: function () {\n            (this.get('session') as any)._reloadApplication();\n        }\n    }\n});\n\nexport default MaintenanceRoute;\n","import Ember from 'ember';\nimport UnprotectedRouteMixin from '../mixins/unprotected-route-mixin';\n\nexport default Ember.Route.extend(UnprotectedRouteMixin, {\n    beforeModel() {\n        this._super(...arguments);\n        return this.get('intl').loadTranslations();\n    }\n});\n","import EngageSupervisor from 'connections-ui/routes/engage-supervisor';\n\nexport default EngageSupervisor.extend();\n","import Ember from 'ember';\n\nimport ModelRouteMixin from '../../mixins/model-route';\n\nfunction isGuid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nexport default Ember.Route.extend(ModelRouteMixin, {\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n\n    routeTitle: 'Person Profile',\n\n    getUserId(transition) {\n        const id = transition.params['person.detail'].person_id;\n        if (isGuid(id)) {\n            return Ember.RSVP.Promise.resolve(id);\n        }\n\n        // We've got a mongoid, so we need to translate that to something useable...\n        const orgName = this.get('session.org.shortName');\n        const jid = `${id}@${orgName}.orgspan.com`;\n\n        return this.get('store')\n            .findMany('person', [jid])\n            .then(res => {\n                if (res && res[0]) {\n                    transition.abort();\n\n                    this.replaceWith('person.detail', res[0].get('id'));\n                }\n            })\n            .catch(() => this.transitionTo('person.detail', this.get('session.person.id')));\n    },\n\n    updateParentRoute(transition, userId) {\n        if (\n            this.get('session.features.AGORA-268_connections-ui-in-admin-ui') &&\n            this.get('application.adminUIContext')\n        ) {\n            return;\n        }\n        let newHash;\n        if (transition.intent && transition.intent.url) {\n            const initialIntent = `#${transition.intent.url}`;\n            newHash = initialIntent.replace(/person/, 'person-v2');\n        } else {\n            newHash = `#/person-v2/${userId}`;\n        }\n        if (newHash !== window.top.location.hash) {\n            this.get('embedded').sendNavigationEvent({\n                hash: newHash\n            });\n        }\n    },\n\n    actions: {\n        willTransition(transition) {\n            let editing = this.get('controller.editing') && this.get('controller.editingSection');\n            if (editing) {\n                let msg = this.get('intl').lookup('notification.person.navigate').toString();\n                if (!window.confirm(msg)) {\n                    transition.abort();\n                    return false;\n                }\n\n                this.set('controller.editing', false);\n                this.set('controller.editingSection', false);\n            }\n\n            return true;\n        }\n    },\n\n    beforeModel(transition) {\n        var result = this._super(transition);\n        var id = transition.params['person.detail'].person_id;\n\n        if (transition.isActive === false) {\n            // Route canceled for auth\n            return;\n        }\n\n        if (this.get('session.user.isSuper') || this.get('session.user.isTrustee')) {\n            if (id === this.get('session.person.id')) {\n                // if (transition.params['person.detail'].person_id === this.get('session.person.id')) {\n                transition.abort();\n            }\n            return;\n        }\n\n        return Ember.RSVP.resolve(result)\n            .then(() => {\n                var person;\n\n                return this.getUserId(transition)\n                    .then(id => {\n                        this.updateParentRoute(transition, id);\n\n                        if (id === this.get('session.person.id')) {\n                            person = this.get('session.person');\n                        } else {\n                            person = this.store.recordForId('person', id);\n                        }\n\n                        if (\n                            person &&\n                            !person.get('isEmpty') &&\n                            !person.get('isSaving') &&\n                            !person.get('isLoading') &&\n                            !person.get('isReloading')\n                        ) {\n                            return person\n                                .reload()\n                                .then(function (p) {\n                                    p.rollbackAttributes();\n                                })\n                                .catch(() => {\n                                    return Ember.RSVP.reject();\n                                });\n                        } else {\n                            return true;\n                        }\n                    })\n                    .catch(function () {\n                        return Ember.RSVP.reject();\n                    });\n            })\n            .catch(function () {\n                return Ember.RSVP.reject();\n            });\n    },\n\n    model(params) {\n        // We have a guid by this point due to the beforeModel hook performing a transition for us\n        return new Ember.RSVP.Promise((resolve, reject) => {\n            this.store\n                .findRecord('public-api-user', params.person_id, {\n                    adapterOptions: {\n                        expand: 'authorization'\n                    }\n                })\n                .then(user => {\n                    if (params.person_id === this.get('session.person.id')) {\n                        resolve({\n                            user,\n                            person: this.get('session.person')\n                        });\n                        return;\n                    }\n                    user.get('profile')\n                        .then(profile => {\n                            resolve({\n                                user,\n                                person: profile\n                            });\n                        })\n                        .catch(reject);\n                })\n                .catch(reject);\n        });\n    },\n\n    setupController(controller, model) {\n        this._super.apply(this, arguments);\n\n        if (this.get('session.person.id') !== model.person.get('id')) {\n            controller.set('editing', false);\n        } else {\n            controller.set('editing', true);\n        }\n\n        this.set('routeTitle', model.person.get('name'));\n        this.get('embedded').sendPageData({\n            helpPath: 'person.detail.index',\n            title: this.get('routeTitle')\n        });\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Route.extend({\n    intl: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n    routing: Ember.inject.service('-routing'),\n\n    routeTitle: '',\n\n    updateParentRoute(transition) {\n        let routing = this.get('routing');\n        let params = Object.values(transition.params).filter(param => {\n            return Object.values(param).length;\n        });\n        let url = routing.generateURL(transition.targetName, params, transition.queryParams);\n\n        const initialIntent = transition.intent.url ? `#${transition.intent.url}` : url;\n        let newHash;\n        if (initialIntent) {\n            newHash = initialIntent.replace(/search/, 'search-v2');\n        } else {\n            newHash = '#/search-v2';\n        }\n        if (newHash !== window.top.location.hash) {\n            this.get('embedded').sendNavigationEvent({\n                hash: newHash\n            });\n        }\n    },\n\n    model: function (params, transition) {\n        this.updateParentRoute(transition);\n    },\n\n    afterModel() {\n        this.set('routeTitle', this.get('intl').lookup('components.navMenu.search').toString());\n        this.get('embedded').sendPageData({\n            helpPath: 'search',\n            title: this.get('routeTitle')\n        });\n    }\n});\n","import Ember from 'ember';\nimport { POOL_STATES } from '../../models/app-pool';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport appUtils from '../../utils/apps';\n\nconst { Route, inject, get, computed } = Ember;\n\nconst STANDALONE_APP_ROUTE_LOG_NS = 'Route';\n\nexport default Route.extend(LoggerMixin, {\n    apps: inject.service(),\n    intl: inject.service(),\n\n    appsProblem: false,\n    unknownApp: false,\n    currAppName: null,\n\n    routeTitle: computed('appsProblem', 'unknownApp', 'currAppName', function () {\n        let result = null;\n\n        if (this.get('appsProblem')) {\n            result = this.get('intl').lookup('apps.loadFailedTitle').toString();\n        } else if (this.get('unknownApp')) {\n            result = this.get('intl').lookup('apps.notFoundTitle').toString();\n        } else {\n            result = this.get('currAppName') || this.get('intl').lookup('apps.title').toString();\n        }\n\n        return result;\n    }),\n\n    beforeModel(transition) {\n        var result = this._super(transition);\n\n        if (transition.isActive === false) {\n            // Route canceled for auth\n            return;\n        }\n\n        this.set('appsProblem', false);\n        this.set('unknownApp', false);\n        if (this.get('apps.appsSupported')) {\n            /*\n             * Clear currAppName so it will trigger a routeTitle update if the\n             *  user is bouncing between a single app and a non-app route.\n             */\n            this.set('currAppName', null);\n            return result;\n        } else {\n            // Apps are disabled.  go to index\n            return this.transitionTo('index');\n        }\n    },\n\n    model(params) {\n        let appPool = this.get('apps.standaloneAppPool');\n\n        return appPool\n            .showApp(params.app_id)\n            .then(poolState => {\n                let result = null;\n\n                if (poolState && poolState.name === POOL_STATES.SHOWING_APP) {\n                    this.set('currAppName', get(poolState, 'details.instance.app.name'));\n\n                    result = {\n                        instanceId: get(poolState, 'details.instance.instanceId')\n                    };\n                }\n\n                return result;\n            })\n            .catch(poolState => {\n                if (poolState && poolState.name === POOL_STATES.APP_NOT_FOUND) {\n                    this.set('unknownApp', true);\n\n                    // Possible Causes:\n                    // User using old or unauthorized link\n                    // User reloaded PureCloud on this route and the app has been deleted or he/she no longer has permission\n                    // Pool state and menu out of sync (Should not happen)\n                    this.logger.warn(\n                        appUtils.buildStandaloneAppLogMsg(\n                            'Unknown App requested in route param.',\n                            STANDALONE_APP_ROUTE_LOG_NS\n                        ),\n                        {\n                            poolState,\n                            remoteData: {\n                                appId: params.app_id,\n                                poolState: Ember.get(poolState, 'name')\n                            }\n                        }\n                    );\n                } else {\n                    this.set('appsProblem', true);\n\n                    this.logger.error(\n                        appUtils.buildStandaloneAppLogMsg('Failed to show App in route', STANDALONE_APP_ROUTE_LOG_NS),\n                        {\n                            poolState,\n                            remoteData: {\n                                appId: params.app_id,\n                                poolState: Ember.get(poolState, 'name')\n                            }\n                        }\n                    );\n                }\n\n                return null;\n            })\n            .finally(() => {\n                this.set('apps.standaloneAppPoolVisible', true);\n            });\n    },\n\n    actions: {\n        willTransition() {\n            let model = this.modelFor(this.routeName);\n\n            if (model && model.instanceId) {\n                // Determine if the pool is still showing the app for this route.\n                // The app for this route may not be shown if the app has been hidden/stopped/closed for\n                // another reason (e.g. Removed App closed by user) and we are transitioning to another route (e.g. index).\n                let initPoolState = this.get('apps.standaloneAppPool.currState');\n\n                if (\n                    initPoolState &&\n                    initPoolState.name === POOL_STATES.SHOWING_APP &&\n                    get(initPoolState, 'details.instanceId') === model.instanceId\n                ) {\n                    // Pool is showing this route's app, attempt to hide it.\n                    this.get('apps.standaloneAppPool')\n                        .hideApp(model.instanceId)\n                        .catch(rejectionPoolState => {\n                            // Ignore the failure as we still want to proceed and hide the pool\n                            // Log this as it should not happen\n                            this.logger.error(\n                                appUtils.buildStandaloneAppLogMsg(\n                                    'Failed to hide standalone app when trying to transition out of route',\n                                    STANDALONE_APP_ROUTE_LOG_NS\n                                ),\n                                {\n                                    initPoolState,\n                                    rejectionPoolState,\n                                    remoteData: {\n                                        routeAppId: model.instanceId,\n                                        initPoolState: Ember.get(initPoolState, 'name'),\n                                        rejectionPoolState: Ember.get(rejectionPoolState, 'name')\n                                    }\n                                }\n                            );\n                        });\n                }\n            }\n\n            this.set('apps.standaloneAppPoolVisible', false);\n\n            return true;\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst { Route, inject, RSVP, Logger } = Ember;\n\nexport default Route.extend({\n    queryParams: {\n        targetRoute: {\n            refreshModel: true\n        }\n    },\n    application: inject.service(),\n    intl: inject.service(),\n\n    routeTitle() {\n        return this.get('intl').lookup('timemachine.title');\n    },\n\n    model(params, transition) {\n        let redirectUrl = window.location.origin || `${window.location.protocol}//${window.location.host}`;\n\n        redirectUrl += window.location.pathname;\n\n        if (redirectUrl.charAt(redirectUrl.length - 1) !== '/') {\n            redirectUrl += '/';\n        }\n\n        let hashRoute = '';\n        let targetRoute = (params.targetRoute || '').trim();\n        if (targetRoute) {\n            if (targetRoute.charAt(0) !== '/') {\n                targetRoute = '/' + targetRoute;\n            }\n            hashRoute = '#' + targetRoute;\n        }\n\n        redirectUrl += `${params.buildTag}/index.html`;\n        redirectUrl += window.location.search;\n        redirectUrl += hashRoute;\n\n        const runtime = this.get('application.runtime');\n        if (runtime.local) {\n            Logger.error('Timemachine is not available locally.  Use the Git Capacitor.');\n            transition.abort();\n            this.transitionTo('index');\n        } else if (['prod', 'fedramp'].includes(runtime.env)) {\n            return {\n                redirectUrl,\n                buildTag: params.buildTag\n            };\n        } else {\n            // Return a non-resolving promise to let the redirect complete\n            return new RSVP.Promise(() => {\n                window.location = redirectUrl;\n            });\n        }\n    },\n\n    actions: {\n        confirm() {\n            let currModel = this.modelFor(this.routeName);\n\n            if (currModel && currModel.redirectUrl) {\n                window.location = currModel.redirectUrl;\n            } else {\n                this.set('application.errorState', { type: 'timeMachineFailure' });\n                this.transitionTo('maintenance');\n            }\n        },\n\n        cancel() {\n            this.transitionTo('index');\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst { inject, Mixin } = Ember;\n\nconst DEFAULT_PARAMS = {\n    pageNumber: 1,\n    pageSize: 25,\n    types: ['users', 'groups', 'locations'],\n    sortOrder: 'ASC',\n    expand: ['authorization']\n};\n\nexport default Mixin.create({\n    search: inject.service('search'),\n\n    performSimpleKeywordSearch(query, params) {\n        params = Object.assign({}, DEFAULT_PARAMS, params, {\n            query: [\n                {\n                    value: query,\n                    type: 'QUERY_STRING'\n                }\n            ],\n            returnFields: this.get('search.fields')\n        });\n        const url = this.get('search.apiEndpoint');\n        return this.ajax(url, 'POST', { data: params });\n    },\n\n    performSearch(params) {\n        params = Object.assign({}, DEFAULT_PARAMS, { returnFields: this.get('search.fields') }, params);\n        const url = this.get('search.apiEndpoint');\n        return this.ajax(url, 'POST', { data: params });\n    },\n\n    suggest(params) {\n        params = Object.assign({}, DEFAULT_PARAMS, { returnFields: this.get('search.fields') }, params);\n        const url = this.get('search.suggestEndpoint');\n        return this.ajax(url, 'POST', { data: params });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { SEARCH_QUERY_OPERATORS, SEARCH_AGGREGATE_TYPES, SEARCH_QUERY_TYPES } from './service';\n\nimport { BASE_PERSON_FIELDS, BASE_PERSON_EXPANDS } from '../models/person';\n\nconst { computed } = Ember;\n\nexport default Ember.Object.extend({\n    service: null,\n\n    page: null,\n    limit: null,\n\n    types: null,\n    queries: null,\n    aggregations: null,\n    returnFields: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.queries = [];\n        this.aggregations = [];\n        this.types = ['users', 'groups', 'locations'];\n    },\n\n    data: computed('queries.[]', 'aggregations.[]', 'types.[]', function () {\n        const { queries, aggregations, page, limit, types, returnFields } = this.getProperties(\n            'queries',\n            'aggregations',\n            'page',\n            'limit',\n            'types',\n            'returnFields'\n        );\n\n        const data = {\n            types\n        };\n\n        if (queries.length) {\n            data.query = queries;\n        }\n\n        // You can only search on users when you have aggregations\n        if (aggregations.length) {\n            data.aggregations = aggregations;\n            data.types = ['users'];\n        }\n\n        if (typeof page === 'number') {\n            data.pageNumber = page;\n        }\n\n        if (typeof limit === 'number') {\n            data.pageSize = limit;\n        }\n\n        if (returnFields && Array.isArray(returnFields)) {\n            data.returnFields = returnFields;\n        } else {\n            if (data.types.indexOf('users') === -1) {\n                data.returnFields = ['ALL_FIELDS'];\n            } else {\n                data.returnFields = BASE_PERSON_FIELDS;\n            }\n        }\n\n        data.expand = BASE_PERSON_EXPANDS;\n\n        return data;\n    }),\n\n    addQuery(value, operator = 'AND', type = 'QUERY_STRING', fields = []) {\n        Ember.assert(\n            `Operator must be one of: ${SEARCH_QUERY_OPERATORS}`,\n            _.includes(SEARCH_QUERY_OPERATORS, operator)\n        );\n        Ember.assert(`Type must be one of: ${SEARCH_QUERY_TYPES}`, _.includes(SEARCH_QUERY_TYPES, type));\n\n        if (type === 'QUERY_STRING') {\n            Ember.assert('If query type is `QUERY_STRING`, the query value must have a length >= 2', value.length >= 2);\n        }\n\n        const query = {\n            type\n        };\n\n        if (type !== 'MATCH_ALL') {\n            query.operator = operator;\n            query.value = value;\n        }\n\n        if (!_.isEmpty(fields)) {\n            query.fields = fields;\n        }\n\n        this.queries.pushObject(query);\n\n        return this;\n    },\n\n    // Add multiple queries at once. Pass in as arrays:\n    // [value, operator, ...], [value, operator, ...]\n    addQueries() {\n        const queries = [...arguments];\n        queries.forEach(query => {\n            this.addQuery(...query);\n        });\n        return this;\n    },\n\n    addTagQuery() {\n        return this;\n    },\n\n    addAggregation(name, value, field = 'profileSkills', type = 'CONTAINS', size = 15) {\n        Ember.assert(`Type must be one of: ${SEARCH_AGGREGATE_TYPES}`, _.includes(SEARCH_AGGREGATE_TYPES, type));\n        if (type !== 'COUNT') {\n            Ember.assert(\n                'You much include a name and value when type is not `COUNT`',\n                type !== 'COUNT' || (!!name && !!value)\n            );\n        }\n\n        const aggregation = {\n            name,\n            field,\n            type,\n            size\n        };\n\n        if (value) {\n            aggregation.value = value;\n        }\n\n        this.aggregations.pushObject(aggregation);\n\n        return this;\n    },\n\n    addAggregations() {\n        const aggregations = [...arguments];\n        aggregations.forEach(aggregation => {\n            this.addAggregation(...aggregation);\n        });\n        return this;\n    },\n\n    setPaging(page, limit) {\n        this.setProperties({ page, limit });\n        return this;\n    },\n\n    setTypes(types) {\n        types = types.map(type => {\n            if (type === 'people') {\n                return 'users';\n            }\n            return type;\n        });\n        this.set('types', types);\n        return this;\n    },\n\n    setReturnFields(returnFields) {\n        if (returnFields && returnFields.length) {\n            this.set('returnFields', returnFields);\n        } else {\n            this.set('returnFields', undefined);\n        }\n        return this;\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport RequestBuilder from './request-builder';\nimport { singularize } from 'ember-inflector';\n\nconst { computed, inject, RSVP, Service } = Ember;\n\nconst resourceTypes = [\n    'resource_article',\n    'resource_page',\n    'resource_faq',\n    'resource_glossary',\n    'resource_releasenote'\n];\n\nexport const SEARCH_FACET_KEYPATHS = {\n    profileSkills: 'skills.skills',\n    department: 'general.department',\n    title: 'general.title',\n    hobbies: 'bio.hobbies',\n    interests: 'bio.interests',\n    certifications: 'skills.certs',\n    languages: 'languages.name'\n};\n\nexport const SEARCH_QUERY_TYPES = [\n    'EXACT',\n    'CONTAINS',\n    'STARTS_WITH',\n    'REQUIRED_FIELDS',\n    'RANGE',\n    'DATE_RANGE',\n    'LESS_THAN',\n    'LESS_THAN_EQUAL_TO',\n    'GREATER_THAN',\n    'GREATER_THAN_EQUAL_TO',\n    'SIMPLE',\n    'TERM',\n    'TERMS',\n    'QUERY_STRING',\n    'MATCH_ALL'\n];\n\nexport const SEARCH_QUERY_OPERATORS = ['AND', 'OR', 'NOT'];\n\nexport const SEARCH_AGGREGATE_TYPES = ['COUNT', 'SUM', 'AVERAGE', 'CONTAINS', 'STARTS_WITH', 'ENDS_WITH', 'TERM'];\n\nconst ALL_FIELDS = 'ALL_FIELDS';\n\nexport default Service.extend({\n    ajax: inject.service(),\n    store: inject.service(),\n    application: inject.service(),\n\n    apiEndpoint: computed.reads('_searchUrl'),\n    suggestEndpoint: computed.reads('_suggestUrl'),\n\n    _searchUrl: computed(function () {\n        return this.get('application').pcV2Uri('api/v2/search');\n    }),\n\n    _suggestUrl: computed('_searchUrl', function () {\n        return `${this.get('_searchUrl')}/suggest`;\n    }),\n\n    _docUrl: computed('_searchUrl', function () {\n        return this.get('application').pcV2Uri('api/v2/documentation/search');\n    }),\n\n    search(data) {\n        const url = this.get('_searchUrl');\n        return this.get('ajax').post(url, { data });\n    },\n\n    suggest(data) {\n        const url = this.get('_suggestUrl');\n        return this.get('ajax').post(url, { data });\n    },\n\n    searchDocumentation(data) {\n        const url = this.get('_docUrl');\n        return this.get('ajax').post(url, { data });\n    },\n\n    modelResults(results) {\n        // turn search results into DS models\n        const store = this.get('store');\n        const entities = results.map(result => {\n            let type = singularize(result._type);\n            if (type === 'external_contact') {\n                type = 'external-contact';\n            }\n            if (type === 'user') {\n                type = 'person';\n            }\n            if (resourceTypes.includes(type)) {\n                type = 'resource-article';\n                const normObj = store.normalize(type, result).data;\n\n                // id fails to be set on normalized object when\n                // running locally.\n                normObj.id = result.id;\n                return normObj;\n            }\n            result.id = result.id || result.guid || result._id;\n            return store.normalize(type, result).data;\n        });\n        return store.push({ data: entities });\n    },\n\n    performSearch(\n        query,\n        page,\n        entity = 'all',\n        facets = [],\n        fields = [ALL_FIELDS],\n        type = 'QUERY_STRING',\n        returnFields = [],\n        pageSize = 25\n    ) {\n        if (type === 'QUERY_STRING' && (!query || query.length < 2)) {\n            return RSVP.resolve([]);\n        }\n\n        const store = this.get('store');\n\n        const defaultAggregations = [\n            ['department', null, 'department', 'TERM'],\n            ['title', null, 'title', 'TERM'],\n            ['profileSkills', null, 'profileSkills', 'TERM'],\n            ['hobbies', null, 'hobbies', 'TERM'],\n            ['interests', null, 'interests', 'TERM'],\n            ['certifications', null, 'certifications', 'TERM']\n            // ['languages', null, 'languages', 'TERM']\n        ];\n\n        if (entity === null) {\n            entity = 'all';\n        }\n\n        // Two requests while working out issues with Ember Data\n        const entityRequest = this.requestBuilder()\n            .setPaging(page + 1, pageSize)\n            .setReturnFields(returnFields);\n        const facetsRequest = this.requestBuilder()\n            .setPaging(page + 1, 0)\n            .addAggregations(...defaultAggregations);\n\n        if (entity !== 'all') {\n            if (entity === 'people') {\n                entity = 'users';\n            }\n\n            if (!Array.isArray(entity)) {\n                entity = [entity];\n            }\n            entityRequest.setTypes(entity);\n        }\n\n        if (!_.isEmpty(facets)) {\n            const selectedTerms = facets.rejectBy('isKeyword');\n            _.forEach(selectedTerms, term => {\n                const searchField = term.get('searchField');\n                const value = term.get('term.term');\n                entityRequest.addQuery(value, 'AND', 'EXACT', [searchField]);\n            });\n\n            if (!_.isEmpty(selectedTerms)) {\n                entityRequest.setTypes(['users']);\n            }\n        } else if (_.isEmpty(facets) && entity === 'users') {\n            entityRequest.addAggregations(...defaultAggregations);\n        }\n\n        if (_.isEmpty(query)) {\n            entityRequest.addQuery(null, 'OR', 'MATCH_ALL', fields);\n            facetsRequest.addQuery(null, 'OR', 'MATCH_ALL');\n        } else {\n            entityRequest.addQuery(query, 'AND', type, fields);\n            facetsRequest.addQuery(query);\n        }\n\n        const searchResults = store.search(null, entityRequest.get('data'));\n        let aggregateResults = Ember.RSVP.resolve([]);\n\n        if (entity === 'all') {\n            aggregateResults = store.search(null, facetsRequest.get('data'));\n        }\n\n        const data = Ember.RSVP.all([searchResults, aggregateResults]);\n\n        return data.then(([results, facets]) => {\n            if (!facets.get('_aggregations')) {\n                facets = results.get('_aggregations');\n            } else {\n                facets = facets.get('_aggregations');\n            }\n\n            facets = this.processFacets(facets);\n\n            return { results, facets };\n        });\n    },\n\n    performSuggestSearch(query, entity = 'all') {\n        const store = this.get('store');\n        const request = this.requestBuilder().addQuery(query).setPaging(1, 4);\n\n        if (entity === 'people') {\n            entity = 'users';\n        }\n\n        if (entity !== 'all') {\n            request.setTypes([entity]);\n        }\n\n        return store.suggest(request.get('data'));\n    },\n\n    performCustomSearch(requestBuilder) {\n        return this.get('store').search(null, requestBuilder.get('data'));\n    },\n\n    processFacets(facets) {\n        facets = _.chain(facets)\n            .map((terms, key) => {\n                if (!Object.prototype.hasOwnProperty.call(SEARCH_FACET_KEYPATHS, key)) {\n                    return null;\n                }\n\n                return {\n                    key,\n                    facetName: SEARCH_FACET_KEYPATHS[key],\n                    terms: _.map(terms, term => {\n                        return {\n                            term: term.key,\n                            count: term.count\n                        };\n                    })\n                };\n            })\n            .filter()\n            .value();\n\n        const orderKeys = ['department', 'title', 'profileSkills', 'hobbies', 'interests', 'certifications'];\n        return _.sortBy(facets, ({ key }) => orderKeys.indexOf(key));\n    },\n\n    requestBuilder() {\n        return RequestBuilder.create({\n            service: this\n        });\n    }\n});\n","import Ember from 'ember';\n\nconst { inject, Mixin } = Ember;\n\nexport default Mixin.create({\n    searchService: inject.service('search'),\n\n    search(query, params = {}) {\n        const adapter = this.adapterFor('search');\n        let promise;\n\n        if (query && !params.query) {\n            // This is a simple keyword search, no special queries\n            promise = adapter.performSimpleKeywordSearch(query, params);\n        } else {\n            promise = adapter.performSearch(params);\n        }\n\n        promise = Ember.RSVP.resolve(promise, 'Adapter#performSearch');\n\n        return promise\n            .then(\n                payload => {\n                    const { aggregations } = payload;\n                    const data = this._extractData(payload, 'search');\n                    return { aggregations, data, payload };\n                },\n                null,\n                'Store#search'\n            )\n            .then(({ aggregations, data, payload }) => {\n                Ember.set(data, '_aggregations', aggregations);\n                Ember.set(data, '_meta', payload);\n                return data;\n            });\n    },\n\n    suggest(query) {\n        const adapter = this.adapterFor('search');\n        let promise = adapter.suggest(query);\n\n        promise = Ember.RSVP.resolve(promise, 'Adapter#suggest');\n\n        return promise.then(\n            payload => {\n                return this._extractData(payload, 'search');\n            },\n            null,\n            'Store#suggest'\n        );\n    },\n\n    _extractData(payload, type = 'findMany') {\n        const serializer = this.serializerFor('application');\n\n        if (!payload.results && payload.aggregations) {\n            return payload.aggregations;\n        }\n\n        if (!payload.results) {\n            payload.results = [];\n        }\n\n        payload = serializer.normalizeArrayResponse(this, null, payload, null, type);\n\n        if (!payload.data) {\n            payload.data = [];\n        }\n\n        if (payload.included) {\n            payload.data = [].concat(payload.data, payload.included);\n            payload.included = [];\n        }\n\n        return this.push(payload);\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport { singularize } from 'ember-inflector';\n\nimport Validators from '../components/entity-fields/validators';\n\nexport var filterMissingFields = function (record, json) {\n    _.forEach(record.fieldConfig.sections, function (section) {\n        _.forEach(section.fieldList, function (field) {\n            let fieldPath = field.get('fieldPath');\n            let type = field.get('type');\n            let values = record.getFieldValue(fieldPath);\n            let splitField = fieldPath.split('.');\n            let sectionKey = splitField[0],\n                fieldKey = splitField[1];\n\n            let container = json[sectionKey] ? json[sectionKey][fieldKey] : null;\n\n            if (Validators[type] && container) {\n                let validator = Validators[type];\n                if (typeof validator.isEmpty === 'function') {\n                    if (!Array.isArray(values)) {\n                        values = [values];\n                    }\n\n                    let toRemove = _.filter(values, function (value) {\n                        let isEmpty = validator.isEmpty(value, record, field);\n                        if (!value || (value.value !== undefined && isEmpty)) {\n                            if (container) {\n                                Ember.Logger.info('Removing field value:', fieldPath, container);\n                                return true;\n                            }\n                        }\n                    });\n\n                    container.removeObjects(toRemove);\n                }\n            }\n        });\n\n        if (_.isEmpty(json[section.get('key')])) {\n            delete json[section.get('key')];\n        }\n    });\n\n    return json;\n};\n\nlet OUR_COOL_REQUEST_TYPES = ['query', 'findMany', 'findAll', 'search'];\n\nvar ApplicationSerializer = DS.RESTSerializer.extend({\n    isNewSerializerAPI: true,\n\n    primaryKey: 'guid',\n\n    isPrimaryType(store, typeName, primaryTypeClass) {\n        if (!primaryTypeClass) {\n            return false;\n        }\n\n        return this._super(...arguments);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = payload;\n        let groupKey = '_entity';\n\n        if (payload.res) {\n            data = payload.res;\n            delete payload.res;\n        } else if (payload.results) {\n            data = payload.results;\n            delete payload.results;\n        }\n\n        if (requestType === 'search') {\n            groupKey = '_type';\n        }\n\n        if (_.includes(OUR_COOL_REQUEST_TYPES, requestType)) {\n            if (data && typeof data === 'object' && !Array.isArray(data)) {\n                data = _.map(data, value => value);\n            }\n\n            const finalData = {};\n            const groupedData = _.groupBy(data, groupKey);\n\n            _.forOwn(groupedData, (list, key) => {\n                if (key === undefined || key === 'undefined' || key === 'conversations') {\n                    key = primaryModelClass.modelName;\n                }\n\n                let type = singularize(key);\n                if (type === 'user' && requestType === 'search') {\n                    type = 'person';\n                }\n                finalData[type] = list.map(data => {\n                    data.id = data.id || data.guid || data._id;\n                    return data;\n                });\n            });\n\n            if (_.isEmpty(finalData) && primaryModelClass) {\n                finalData[primaryModelClass.modelName] = [];\n            }\n\n            let meta = {};\n            if (typeof payload === 'object' && !Array.isArray(payload)) {\n                meta = payload;\n            }\n\n            payload = _.merge(finalData, {\n                meta\n            });\n        }\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n\n        if (payload.res && !payload._id) {\n            payload = payload.res;\n        }\n\n        if (primaryModelClass.modelName === 'call') {\n            payload.id = payload.conversationId;\n        }\n\n        data[primaryModelClass.modelName] = payload;\n\n        return this._super(store, primaryModelClass, data, id, requestType);\n    },\n\n    serialize(snapshot, options) {\n        var json = this._super(snapshot, options);\n        delete json._entity;\n        return json;\n    }\n});\n\nexport default ApplicationSerializer;\n","define(\"connections-ui/serializers/call-communication\", [\"exports\", \"ember-purecloud-components/serializers/call-communication\"], function (_exports, _callCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _callCommunication.default;\n    }\n  });\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    serializeIntoHash(hash, typeClass, snapshot, options) {\n        const data = this.serialize(snapshot, options);\n        Object.assign(hash, data);\n    },\n\n    serialize(snapshot) {\n        const options = snapshot.adapterOptions;\n        let serialized;\n\n        if (options && options.patch) {\n            const attrsToSerialize = options.attrs;\n            const changed = snapshot.changedAttributes();\n            const attrs = Object.keys(changed);\n            if (!changed || attrs.length === 0) {\n                return this._super(...arguments);\n            }\n            const data = {};\n            attrs.forEach(attr => {\n                if (attrsToSerialize) {\n                    if (attrsToSerialize.indexOf(attr) > -1) {\n                        data[attr] = snapshot.attr(attr);\n                    }\n                } else {\n                    data[attr] = snapshot.attr(attr);\n                }\n            });\n\n            data.enabled = snapshot.attr('enabled');\n            data.voicemail = snapshot.attr('voicemail');\n\n            serialized = data;\n        } else {\n            serialized = this._super(...arguments);\n        }\n\n        delete serialized.phoneNumber;\n\n        return serialized;\n    }\n});\n","define(\"connections-ui/serializers/callback-communication\", [\"exports\", \"ember-purecloud-components/serializers/callback-communication\"], function (_exports, _callbackCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _callbackCommunication.default;\n    }\n  });\n});\n","import DS from 'ember-data';\n\nexport default DS.JSONSerializer.extend({\n    isNewSerializerAPI: true,\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        payload = payload.entities || [];\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","define(\"connections-ui/serializers/chat-communication\", [\"exports\", \"ember-purecloud-components/serializers/chat-communication\"], function (_exports, _chatCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _chatCommunication.default;\n    }\n  });\n});\n","import Geolocation from './geolocation';\n\nexport default Geolocation.extend();\n","import DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default DS.RESTSerializer.extend({\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n\n        payload.links = {\n            recordings: `/api/v2/conversations/${payload.id}/recordings`\n        };\n\n        data[primaryModelClass.modelName] = payload;\n        return this._super(store, primaryModelClass, data, id, requestType);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        let type = primaryModelClass.modelName;\n\n        if (payload.entities) {\n            data[type] = _.map(payload.entities, convo => {\n                convo.links = {\n                    recordings: `/api/v2/conversations/${convo.id}/recordings`\n                };\n\n                return convo;\n            });\n            payload = data;\n        }\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","define(\"connections-ui/serializers/conversation\", [\"exports\", \"ember-purecloud-components/serializers/conversation\"], function (_exports, _conversation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _conversation.default;\n    }\n  });\n});\n","import DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default DS.RESTSerializer.extend({\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        data[primaryModelClass.modelName] = payload;\n        return this._super(store, primaryModelClass, data, id, requestType);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        let type = primaryModelClass.modelName;\n\n        if (payload.entities) {\n            data[type] = payload.entities;\n            delete payload.entities;\n\n            payload = _.merge(data, { meta: payload });\n        }\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","define(\"connections-ui/serializers/email-communication\", [\"exports\", \"ember-purecloud-components/serializers/email-communication\"], function (_exports, _emailCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emailCommunication.default;\n    }\n  });\n});\n","import DS from 'ember-data';\nimport PurecloudSerializer from '../purecloud';\nimport { EMPTY_ORGANIZATION_MODEL } from './external-organization';\n\nconst EMPTY_MODEL_OBJECTS = {\n    workPhone: {\n        display: '',\n        extension: '',\n        acceptsSMS: false\n    },\n    cellPhone: {\n        display: '',\n        extension: '',\n        acceptsSMS: true\n    },\n    homePhone: {\n        display: '',\n        extension: '',\n        acceptsSMS: false\n    },\n    otherPhone: {\n        display: '',\n        extension: '',\n        acceptsSMS: false\n    },\n    address: {\n        address1: '',\n        address2: '',\n        city: '',\n        state: '',\n        postalCode: '',\n        countryCode: ''\n    }\n};\n\nconst EXTERNAL_ORGANIZATION = 'externalOrganization';\n\nexport default PurecloudSerializer.extend(DS.EmbeddedRecordsMixin, {\n    attrs: {\n        address: { embedded: 'always' },\n        workPhone: { embedded: 'always' },\n        cellPhone: { embedded: 'always' },\n        homePhone: { embedded: 'always' },\n        otherPhone: { embedded: 'always' },\n        externalOrganization: { embedded: 'always' }\n    },\n\n    _normalizeContact(contact) {\n        if (contact.type) {\n            contact.contactType = contact.type.toLowerCase();\n            delete contact.type;\n        }\n        if (!contact.canonicalContact) {\n            contact.canonicalContact = { id: contact.id };\n        }\n        if (!contact.mergeSet) {\n            contact.mergeSet = [{ id: contact.id }];\n        }\n        if (!contact.middleName) {\n            contact.middleName = '';\n        }\n        return contact;\n    },\n\n    _getPojo(jsonProfile) {\n        return JSON.parse(JSON.stringify(jsonProfile));\n    },\n\n    normalizeDeleteRecordResponse(store, primaryModelClass, payload, id, requestType) {\n        payload = { id, type: 'externalcontacts/contact' };\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        const normalizedPayload = this._fillEmptyPropertiesWithModelObjects(store)(payload);\n        const response = this._super(store, primaryModelClass, normalizedPayload, id, requestType);\n        if (response.data) {\n            response.data.data = normalizedPayload;\n            response.data.attributes = normalizedPayload;\n        }\n        return response;\n    },\n\n    // move the payload's entities to the root node expected by ember data; prep metadata\n    normalizeQueryResponse(store, primaryModelClass, payload, id, requestType) {\n        const filledEntities = (payload.entities || payload.contacts || []).map(\n            this._fillEmptyPropertiesWithModelObjects(store)\n        );\n        payload = {\n            'externalcontacts/contacts': filledEntities,\n            meta: {\n                total: payload.total || filledEntities.length,\n                pageOffset: payload.pageNumber || 1,\n                pageSize: payload.pageSize,\n                pageCount: payload.pageCount\n            }\n        };\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    serialize() {\n        const jsonProfile = this._super(...arguments);\n        return this._getPojo(jsonProfile);\n    },\n\n    _fillEmptyPropertiesWithModelObjects(store) {\n        return payload => {\n            const emptyModel = EMPTY_MODEL_OBJECTS;\n            const emptyOrgModel = EMPTY_ORGANIZATION_MODEL;\n            for (const property of Object.getOwnPropertyNames(emptyModel)) {\n                this._fillPropertyIfNecessary(property, payload, emptyModel);\n            }\n            if (payload[EXTERNAL_ORGANIZATION]) {\n                const organization = payload[EXTERNAL_ORGANIZATION];\n\n                try {\n                    store.hasRecordForId('externalcontacts/externalOrganization', organization.id);\n                } catch (err) {\n                    for (const property of Object.getOwnPropertyNames(emptyOrgModel)) {\n                        this._fillPropertyIfNecessary(property, organization, emptyOrgModel);\n                    }\n                }\n            }\n            return this._normalizeContact(payload);\n        };\n    },\n\n    /**\n     * Updates the property value with the pre-filled defaultData if the new data\n     * does not contain any values.\n     * @param {*} property the property of the data and defaultData to access\n     * @param {*} data the new data\n     * @param {*} defaultData the original preset data\n     */\n    _fillPropertyIfNecessary(property, data, defaultData) {\n        const payloadValue = data[property];\n\n        // We never want to override a populated array value\n        if (Array.isArray(payloadValue)) {\n            return;\n        }\n\n        if (!payloadValue && Array.isArray(defaultData[property])) {\n            data[property] = [...new Set(defaultData[property])];\n        } else if (payloadValue === undefined || typeof payloadValue === 'object') {\n            data[property] = Object.assign({}, defaultData[property], payloadValue);\n        }\n    }\n});\n","import DS from 'ember-data';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\nimport PurecloudSerializer from '../purecloud';\n\nexport const EMPTY_ORGANIZATION_MODEL = {\n    websites: [],\n    tickers: [],\n    tags: [],\n    phoneNumber: {\n        display: '',\n        extension: '',\n        acceptsSMS: false\n    },\n    faxNumber: {\n        display: '',\n        extension: '',\n        acceptsSMS: false\n    },\n    address: {\n        address1: '',\n        address2: '',\n        city: '',\n        state: '',\n        postalCode: '',\n        countryCode: ''\n    },\n    twitterId: {\n        screenName: ''\n    }\n};\n\nexport default PurecloudSerializer.extend(DS.EmbeddedRecordsMixin, RelateFeaturesMixin, {\n    attrs: {\n        address: { embedded: 'always' },\n        phoneNumber: { embedded: 'always' },\n        faxNumber: { embedded: 'always' },\n        twitterId: { embedded: 'always' }\n    },\n\n    _getPojo(jsonProfile) {\n        if (jsonProfile.twitterId && !jsonProfile.twitterId.screenName) {\n            // If there is no Twitter screen name, don't send the twitterId property to the mid-tier\n            // Ref. https://s3.amazonaws.com/connect-apidocs/contacts-service/basic-objects.html#twitterid-object\n            delete jsonProfile.twitterId;\n        }\n        return JSON.parse(JSON.stringify(jsonProfile));\n    },\n\n    normalizeDeleteRecordResponse(store, primaryModelClass, payload, id, requestType) {\n        payload = { id, type: 'externalcontacts/externalOrganization' };\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        const normalizedPayload = this._fillEmptyPropertiesWithModelObjects(payload);\n        const response = this._super(store, primaryModelClass, normalizedPayload, id, requestType);\n\n        if (response.data) {\n            response.data.data = normalizedPayload;\n            response.data.attributes = normalizedPayload;\n        }\n        return response;\n    },\n\n    // move the payload's entities to the root node expected by ember data; prep metadata\n    normalizeQueryResponse(store, primaryModelClass, payload, id, requestType) {\n        const filledEntities = (payload.entities || []).map(entity =>\n            this._fillEmptyPropertiesWithModelObjects(entity)\n        );\n        payload = {\n            'externalcontacts/external-organizations': filledEntities,\n            meta: {\n                total: payload.total,\n                pageSize: payload.pageSize,\n                pageOffset: payload.pageNumber,\n                pageCount: payload.pageCount\n            }\n        };\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n    serialize() {\n        const jsonProfile = this._super(...arguments);\n        return this._getPojo(jsonProfile);\n    },\n\n    _fillEmptyPropertiesWithModelObjects(payload) {\n        const emptyOrgModel = EMPTY_ORGANIZATION_MODEL;\n        for (const property of Object.getOwnPropertyNames(emptyOrgModel)) {\n            this._fillPropertyIfNecessary(property, payload);\n        }\n        return payload;\n    },\n\n    /**\n     * Updates the property value with the pre-filled model data if the new data\n     * does not contain any values.\n     * @param {*} property the property of the data and model to access\n     * @param {*} data the new data\n     */\n    _fillPropertyIfNecessary(property, data, defaultData = EMPTY_ORGANIZATION_MODEL) {\n        const payloadValue = data[property];\n\n        // We never want to override a populated array value\n        if (Array.isArray(payloadValue)) {\n            return;\n        }\n\n        if (!payloadValue && Array.isArray(defaultData[property])) {\n            data[property] = [...new Set(defaultData[property])];\n        } else if (payloadValue === undefined || typeof payloadValue === 'object') {\n            data[property] = Object.assign({}, defaultData[property], payloadValue);\n        }\n    }\n});\n","import DS from 'ember-data';\nimport { modelKeyFor } from 'connections-ui/utils/message-channels';\n\nexport default DS.RESTSerializer.extend({\n    primaryKey: modelKeyFor('facebook')\n});\n","import DS from 'ember-data';\nimport { modelKeyFor } from 'connections-ui/utils/message-channels';\n\nexport default DS.RESTSerializer.extend({\n    primaryKey: modelKeyFor('line')\n});\n","import DS from 'ember-data';\nimport { modelKeyFor } from 'connections-ui/utils/message-channels';\n\nexport default DS.RESTSerializer.extend({\n    primaryKey: modelKeyFor('twitter')\n});\n","import DS from 'ember-data';\nimport { modelKeyFor } from 'connections-ui/utils/message-channels';\n\nexport default DS.RESTSerializer.extend({\n    primaryKey: modelKeyFor('whatsapp')\n});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend({\n    isNewSerializerAPI: true,\n\n    normalizeFindRecordResponse(store, primaryModelClass, payload) {\n        let jsonapiPayload = {\n            data: {\n                type: 'geolocation-settings',\n                id: '1',\n                attributes: payload\n            }\n        };\n        return jsonapiPayload;\n    }\n});\n","import DS from 'ember-data';\nimport Ember from 'ember';\n\nexport default DS.RESTSerializer.extend({\n    isNewSerializerAPI: true,\n    serializeIntoHash(data, type, record, options) {\n        Ember.merge(data, this.serialize(record, options));\n    },\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        const data = {\n            geolocation: payload\n        };\n\n        return this._super(store, primaryModelClass, data, id, requestType);\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend({\n    extractId(modelClass, resourceHash) {\n        return resourceHash.subjectId + resourceHash.role.id + resourceHash.division.id;\n    }\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        if (!payload.id) {\n            payload.id = id;\n        }\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","import ApplicationSerializer from './application';\nimport Ember from 'ember';\nimport _ from 'lodash';\nimport moment from 'ember-purecloud-components/utils/dates';\nimport uuid from 'connections-ui/utils/uuid';\n\nconst { inject } = Ember;\n\nconst OUR_COOL_REQUEST_TYPES = ['query', 'findMany', 'findAll', 'search'];\n\nexport default ApplicationSerializer.extend({\n    session: inject.service(),\n    serialize(snapshot, options) {\n        const json = this._super(snapshot, options);\n\n        // Never update contactInfo.chat, thats autogenerated\n        if (json && json.contactInfo && json.contactInfo.chat) {\n            delete json.contactInfo.chat;\n        }\n        return json;\n    },\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        const meta = {};\n\n        if (requestType === 'deleteRecord') {\n            payload = payload.entities[0];\n            delete payload.entities;\n            payload.contactInfo = {\n                chat: []\n            };\n            payload.contactInfo.chat.push({\n                value: {\n                    jid: payload.chat.jabberId\n                },\n                labelKey: 'chat'\n            });\n            payload._id = this.getJabberId(payload.chat.jabberId);\n            delete payload.chat;\n        } else {\n            if (payload.general.links && payload.general.links.length > 0) {\n                this.generateGroupLinkIds(payload.general.links);\n            }\n            const jId = payload.contactInfo.chat[0].value.jid;\n            payload._id = this.getJabberId(jId);\n        }\n\n        payload.guid = payload.id || payload.guid;\n\n        if (payload.guid) {\n            payload.policy = {\n                id: payload.guid,\n                type: 'group-policy'\n            };\n        }\n\n        if (requestType === 'deleteRecord' && !payload._id) {\n            payload._id = id;\n        }\n\n        payload.meta = meta;\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        // normalizeArrayResponse was only implmented to handle bevy group results.\n        let data = payload;\n        if (payload.entities) {\n            data = payload.entities;\n            delete payload.entities;\n        }\n\n        const finalData = {};\n        let meta = {};\n        if (typeof payload === 'object' && !Array.isArray(payload)) {\n            meta = payload;\n        }\n\n        const groups = {};\n\n        if (_.includes(OUR_COOL_REQUEST_TYPES, requestType)) {\n            _.forEach(data, g => {\n                if (g.contactInfo.chat && g.contactInfo.chat.length > 0) {\n                    const jId = g.contactInfo.chat[0].value.jid;\n                    g._id = this.getJabberId(jId);\n                }\n\n                if (g.general.links && g.general.links.length > 0) {\n                    this.generateGroupLinkIds(g.general.links);\n                }\n\n                g.guid = g.id;\n                g.orgGuid = g.id;\n\n                g.mt = moment(g.dateModified).unix();\n                g.search_key = g.general.name[0].value.toLowerCase();\n                groups[g._id] = g;\n            });\n        }\n        finalData.res = groups;\n        finalData.meta = meta;\n\n        return this._super(store, primaryModelClass, finalData, id, requestType);\n    },\n\n    getJabberId(id) {\n        const idParts = id.split('@');\n        return idParts.length > 0 ? idParts[0] : '';\n    },\n\n    /*  When using the public-api/bevy group requests\n        the group sub-objects don't contain a _id property.\n        Normally this is not an issue but for the general.links\n        it does.  The UI uses the _id  property on each link.\n        The following methods add/strip unique ids on the links.\n    */\n    generateGroupLinkIds(groupLinks) {\n        _.forEach(groupLinks, link => {\n            if (!link._id) {\n                link._id = uuid.generate();\n            }\n        });\n    },\n\n    cleanGroupLinkIds(groupLinks) {\n        _.forEach(groupLinks, link => {\n            if (link._id) {\n                delete link._id;\n            }\n        });\n    }\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend();\n","import Ember from 'ember';\n\nimport PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    session: Ember.inject.service(),\n\n    normalizeSingleResponse: function (store, model, data, guid) {\n        let location = data.location;\n        location.floors = [];\n        if (data.floors && data.floors.entities) {\n            location.floors = data.floors.entities.map(floor => store.push(store.normalize('location', floor)));\n        }\n        return this._super(store, model, location, guid);\n    }\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    serializeIntoHash(hash, typeClass, snapshot, options) {\n        const data = this.serialize(snapshot, options);\n        Object.assign(hash, data);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        const type = primaryModelClass.modelName;\n        const data = {\n            [type]: payload.entities\n        };\n        return this._super(store, primaryModelClass, data, id, requestType);\n    }\n});\n","define(\"connections-ui/serializers/message-communication\", [\"exports\", \"ember-purecloud-components/serializers/message-communication\"], function (_exports, _messageCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _messageCommunication.default;\n    }\n  });\n});\n","define(\"connections-ui/serializers/participant\", [\"exports\", \"ember-purecloud-components/serializers/participant\"], function (_exports, _participant) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _participant.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport PurecloudSerializer from './purecloud';\nimport { filterMissingFields } from './application';\nimport LoggerMixin from '../mixins/logger';\n\nimport Validators from '../components/entity-fields/validators';\n\nfunction cleanFields(record) {\n    var config = record.fieldConfig;\n    _.forEach(config.sections, function (section) {\n        _.forEach(section.fieldList, function (field) {\n            let type = field.get('type');\n\n            if (Validators[type]) {\n                let validator = Validators[type];\n                let values = record.getFieldValue(field.getFieldPath());\n\n                if (typeof validator.cleanFieldForEntity === 'function') {\n                    if (Array.isArray(values)) {\n                        _.forEach(values, function (value) {\n                            validator.cleanFieldForEntity(record, field, value);\n                        });\n                    } else {\n                        validator.cleanFieldForEntity(record, field, values);\n                    }\n                }\n            }\n        });\n    });\n}\n\nfunction extractSectionData(record, json) {\n    let section = record._currentSection;\n    if (section) {\n        let key = section.get('key');\n        if (Object.prototype.hasOwnProperty.call(json, key)) {\n            let data = {\n                _id: json._id\n            };\n            data[key] = json[key];\n            return data;\n        }\n    }\n    return json;\n}\n\nexport default PurecloudSerializer.extend(LoggerMixin, {\n    session: Ember.inject.service(),\n    phoneIntegrations: Ember.inject.service(),\n\n    serialize: function (snapshot, options) {\n        let record = snapshot.record;\n\n        cleanFields(record);\n\n        let json = this._super(snapshot, options);\n\n        json = extractSectionData(record, json);\n\n        delete json._id;\n\n        return filterMissingFields(record, json);\n    },\n\n    normalizeSingleResponse: function (store, model, data, guid) {\n        if (data) {\n            data.id = guid || data.guid || data.id;\n        }\n        return this._super(...arguments);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        if (!payload || !payload.entities) {\n            return this._super(...arguments);\n        }\n\n        if (payload.meta && payload.meta.usingIntegrationSource && requestType === 'findMany') {\n            if (!payload.meta.integrationSource) {\n                this.logger.warn(\n                    \"We are using an integration source, but I'm not sure which integration source it is:\",\n                    {\n                        meta: payload.meta\n                    }\n                );\n                return this._super(...arguments);\n            }\n            let entities = (payload.entities || []).map(entity => {\n                let data = Object.assign({}, entity);\n                // note: we may not need to do this and instead just return 'data'\n                if (\n                    data.expands &&\n                    (data.expands.integrationPresence === undefined || data.expands.integrationPresence === null)\n                ) {\n                    // Default to empty\n                    data.expands.integrationPresence = {};\n                }\n\n                return data;\n            });\n            let data = Object.assign({}, payload, {\n                entities: entities\n            });\n            return this._super(store, primaryModelClass, data, id, requestType);\n        }\n\n        return this._super(...arguments);\n    }\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    normalizeSingleResponse(store, primaryModelClass, payload, id) {\n        payload.links = {\n            profile: `/api/v2/users/${id}/profile`\n        };\n        const normalized = this._super(...arguments);\n        return normalized;\n    }\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({});\n","import DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default DS.RESTSerializer.extend({\n    isNewSerializerAPI: true,\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        data[primaryModelClass.modelName] = payload;\n        return this._super(store, primaryModelClass, data, id, requestType);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        let type = primaryModelClass.modelName;\n\n        if (payload.entities) {\n            data[type] = payload.entities;\n            delete payload.entities;\n\n            payload = _.merge(data, { meta: payload });\n        }\n\n        // Support for search results\n        if (payload.results) {\n            data[type] = payload.results;\n            delete payload.results;\n            payload = _.merge(data, { meta: payload });\n        }\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","import PurecloudSerializer from './purecloud';\nimport _ from 'lodash';\n\nexport default PurecloudSerializer.extend({\n    normalizeArrayResponse: function (store, primaryModelClass, payload, id, requestType) {\n        _.forEach(payload.entities, function (entity) {\n            entity.type = 'queue';\n            return entity;\n        });\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    normalizeSingleResponse: function (store, primaryModelClass, payload, id, requestType) {\n        payload.type = 'queue';\n        // Queue lookup can either go through the typical detail API or through the divisionviews API\n        // so we can handle situations where you might run into queue lookups from a different division\n        // Handle that response type here\n        // See API docs: https://developer.inindca.com/api/rest/v2/routing/#get-api-v2-routing-queues-divisionviews\n        if (payload.entities && payload.entities.length === 1) {\n            payload = payload.entities[0];\n        }\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","import PurecloudSerializer from './purecloud';\nimport DS from 'ember-data';\n\nexport default PurecloudSerializer.extend(DS.EmbeddedRecordsMixin, {\n    attrs: {\n        conversation: { embedded: 'always' }\n    },\n    normalizeArrayResponse() {\n        const response = this._super(...arguments);\n\n        if (!response || !response.data) {\n            response.data = [];\n        }\n\n        response.data.forEach(entity => {\n            entity.relationships.conversation.data.type = 'conversation';\n        });\n\n        return response;\n    }\n});\n","define(\"connections-ui/serializers/recording\", [\"exports\", \"ember-purecloud-components/serializers/recording\"], function (_exports, _recording) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _recording.default;\n    }\n  });\n});\n","import DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {\n    isNewSerializerAPI: true,\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        data[primaryModelClass.modelName] = payload;\n        return this._super(store, primaryModelClass, data, id, requestType);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        let type = primaryModelClass.modelName;\n\n        if (requestType === 'query' && payload.results && payload.results.entities) {\n            data[type] = payload.results.entities;\n            delete payload.results.entities;\n\n            payload = _.merge(data, { meta: payload.results });\n        } else if (requestType === 'findMany' && payload.entities) {\n            data[type] = payload.entities;\n            delete payload.entities;\n\n            payload = _.merge(data, { meta: payload });\n        }\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","import DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default DS.RESTSerializer.extend({\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        data[primaryModelClass.modelName] = payload;\n        return this._super(store, primaryModelClass, data, id, requestType);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        let type = primaryModelClass.modelName;\n\n        if (payload.entities) {\n            data[type] = payload.entities;\n            delete payload.entities;\n\n            payload = _.merge(data, { meta: payload });\n        }\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","define(\"connections-ui/serializers/screenshare-communication\", [\"exports\", \"ember-purecloud-components/serializers/screenshare-communication\"], function (_exports, _screenshareCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _screenshareCommunication.default;\n    }\n  });\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({});\n","define(\"connections-ui/serializers/social-communication\", [\"exports\", \"ember-purecloud-components/serializers/social-communication\"], function (_exports, _socialCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _socialCommunication.default;\n    }\n  });\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    attrs: {\n        webrtcMediaDscp: 'webRtcMediaDscp',\n        webrtcForceTurn: 'webRtcForceTurn',\n        persistentConnection: 'webRtcPersistentEnabled',\n        requireMediaHelper: 'webRtcRequireMediaHelper'\n    }\n});\n","import ApplicationSerializer from './application';\n\nexport default ApplicationSerializer.extend();\n","define(\"connections-ui/serializers/video-communication\", [\"exports\", \"ember-purecloud-components/serializers/video-communication\"], function (_exports, _videoCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _videoCommunication.default;\n    }\n  });\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    extractMeta(store, typeClass, payload) {\n        const meta = payload.meta;\n        delete payload.meta;\n        return meta;\n    },\n\n    normalizeQueryResponse(store, primaryModelClass, payload, id, requestType) {\n        if (requestType === 'query') {\n            payload.entities = payload.results || [];\n            delete payload.results;\n        }\n\n        return this._super(...arguments);\n    },\n\n    serializeIntoHash(hash, type) {\n        this._super(...arguments);\n\n        const key = this.payloadKeyFromModelName(type.modelName);\n        Object.assign(hash, hash[key]);\n        delete hash[key];\n    },\n\n    serializeAttribute(snapshot, json, key, attributes) {\n        const changed = snapshot.changedAttributes();\n        if (snapshot.record.get('isNew') || changed[key]) {\n            this._super(snapshot, json, key, attributes);\n        }\n    }\n});\n","/* global intlTelInputUtils */\n\nimport Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport QueueModel from '../models/queue';\nimport PersonModel from '../models/person';\nimport ExternalContactModel from '../models/external-contact';\n\nimport { formatAddressForDisplay, formatSipAddressForDisplay } from 'ember-purecloud-components/utils/address-format';\n\nconst wordCharsRegex = /[^\\w]/g; // Matches anything that is a word character (i.e[a-zA-Z0-9_])\nconst nonDigitRegex = /\\D/g; // Matches anything that isn't a digit\nconst removeLeadingPlusRegex = /^[+]+/g; // Used to remove the pluses at the beginning of the number\n\nexport default Ember.Service.extend({\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    store: Ember.inject.service(),\n    countryCode: Ember.computed('intl.isoLocale', function () {\n        if (this.get('intl.isoLocale')) {\n            return this.get('intl.isoLocale').toUpperCase().split('-').pop();\n        } else {\n            return null;\n        }\n    }),\n\n    /**\n     * This method is meant to take in a varying number of types and return the appropriate\n     * string to make a call. It is used primarily for phone:makeCall\n     *\n     * @param  {string|object|model} itemToFormat the item we are trying to format\n     * @return {string}              the formatted version of itemToFormat\n     */\n    format(itemToFormat) {\n        if (itemToFormat instanceof PersonModel) {\n            return itemToFormat.get('guid');\n        }\n        if (itemToFormat instanceof QueueModel) {\n            return itemToFormat.get('id');\n        }\n        if (itemToFormat instanceof ExternalContactModel) {\n            return itemToFormat.get('phone.rel.e164');\n        }\n        if (itemToFormat && typeof itemToFormat === 'object') {\n            return this.formatFieldConfigEntry(itemToFormat);\n        }\n        if (typeof itemToFormat === 'string') {\n            return this.formatAddress(itemToFormat);\n        }\n        return itemToFormat;\n    },\n\n    /**\n     * Format numbers to E164. If number has sip: prefix, format sipAddress\n     * @param  {string} phoneNumber the number to formatAddress\n     * @param  {string} country     the countryCode\n     * @param  {string} subMsgType  the message subtype (SMS, WhatsApp, etc.)\n     * @return {string}             the formatted number\n     */\n    formatAddress(phoneNumber, country, subMsgType) {\n        if (_.startsWith(phoneNumber, 'sip:')) {\n            return this.formatSipAddress(phoneNumber);\n        }\n        if (_.startsWith(phoneNumber, 'tel:')) {\n            phoneNumber = phoneNumber.split(':').pop();\n        }\n\n        if (subMsgType === 'whatsapp') {\n            phoneNumber = phoneNumber.replace(wordCharsRegex, '');\n        } else if (subMsgType === 'open') {\n            return phoneNumber;\n        } else {\n            const defaultCountryCode = this.get('session.org.orgDefaultCountryCode') || null; // Default country setting in admin\n            const countryCode = country || defaultCountryCode || this.get('countryCode'); // make a guess on the country code\n            if (intlTelInputUtils.isValidNumber(phoneNumber, countryCode)) {\n                const extension = intlTelInputUtils.getExtension(phoneNumber, countryCode);\n                const e164 = intlTelInputUtils.formatNumber(\n                    phoneNumber,\n                    countryCode,\n                    intlTelInputUtils.numberFormat.E164\n                );\n                if (intlTelInputUtils.isValidNumber(e164, countryCode)) {\n                    // check again b/c libphonenumber could 'E164' a number into an invalid (e.g., '5555555' => '+15555555')\n                    if (extension) {\n                        // add extension back b/c libphonenumber strips it out after E164ing the number\n                        return `${e164};ext=${extension}`;\n                    }\n                    return e164;\n                }\n            }\n        }\n\n        return phoneNumber;\n    },\n\n    /**\n     * Format sip numbers to remove extraneous parameters\n     * @param  {string} address the number to formatSipAddress\n     * @return {string}             the formatted address\n     */\n    formatSipAddress(address) {\n        const regex = /(sip:)([^;]*)?(?:[^@]*)(@.*)/;\n        const addressParts = address.match(regex);\n        if (!addressParts || addressParts.length < 3) {\n            return address;\n        }\n        if (\n            intlTelInputUtils.isValidNumber(addressParts[2]) ||\n            intlTelInputUtils.isValidNumber(addressParts[2], this.get('countryCode'))\n        ) {\n            return this.formatAddress(addressParts[2]);\n        }\n        return addressParts.slice(1).join('');\n    },\n\n    formatOrLookupAddressForDisplay(address, country) {\n        return Ember.RSVP.resolve(this.formatAddressForDisplay(address, country, undefined, { doLookup: true }));\n    },\n\n    lookupAddressFormatResultId(result = {}) {\n        const fallback = result.displayText || '';\n\n        try {\n            if (result.jid) {\n                const existingRecord = this.get('store').peekAll('person').findBy('jid', result.jid);\n\n                if (existingRecord) {\n                    return new DS.PromiseObject({ promise: Ember.RSVP.resolve(existingRecord.get('name')) });\n                }\n\n                const promise = this.get('store')\n                    .findMany('person', [result.jid])\n                    .then(records => {\n                        if (records && records.length === 1) {\n                            return records[0].get('name');\n                        }\n                        return fallback;\n                    })\n                    .catch(() => fallback); // don't log this, it just means the lookup failed, return fallback\n\n                return new DS.PromiseObject({ promise }); // has to be re-wrapped since we then/catch the original store promise\n            }\n\n            if (result.queueId) {\n                const promise = this.get('store')\n                    .findRecord('queue', result.queueId)\n                    .then(queue => queue.get('name'))\n                    .catch(() => fallback);\n                return new DS.PromiseObject({ promise });\n            }\n        } catch (e) {\n            // no op;\n        }\n\n        return new DS.PromiseObject({ promise: Ember.RSVP.resolve(fallback) });\n    },\n\n    resolveAddressFormatResult(result = {}, opts = {}) {\n        const fallback = result.displayText || '';\n\n        if (opts.doLookup) {\n            if (result.isEntity) {\n                return this.lookupAddressFormatResultId(result);\n            }\n\n            return new DS.PromiseObject({ promise: Ember.RSVP.resolve(fallback) });\n        }\n\n        return fallback;\n    },\n\n    /**\n     * Format International Numbers (e.g., +1 (919) 555-5555)\n     * If phoneNumber has 'sip:' prefix, call formatSipAddressForDisplay\n     * @param  {string} address     the number to formatAddress\n     * @param  {string} country     the countryCode\n     * @param  {string} subMsgType  the message subtype (SMS, WhatsApp, etc.)\n     * @param  {object} opts        options with `doLookup` bool for performing async lookup of username or queue name for sip addresses\n     * @return {string}             the formatted number (always string by default)\n     * @return {Promise}            a Promise which will resolve to the username of the associated sip address, if applicable (will return promise only if { doLookup: true } is provided)\n     */\n    formatAddressForDisplay(address, country, subMsgType, opts = {}) {\n        if (subMsgType === 'whatsapp') {\n            return address.replace(removeLeadingPlusRegex, '');\n        }\n        if (subMsgType === 'open') {\n            return address;\n        }\n        return this.resolveAddressFormatResult(formatAddressForDisplay(address, country), opts);\n    },\n\n    /**\n     * This is a mild improvement over our naiive formatting of just stripping 'sip:'\n     * it does a regex to try to find a jid, in the case that the address might identify a purecloud user\n     * otherwise, otherwise, see if the address part is a phone number, and try to format it as such. Otherwise, fallback\n     * to the original sip address, without the prefix\n     */\n    formatSipAddressForDisplay(address, opts) {\n        return this.resolveAddressFormatResult(formatSipAddressForDisplay(address), opts);\n    },\n\n    /**\n     * Checks to see if a number is valid. Passing in strict will not allow things to pass through.\n     * (strict option may seem weird but the intent is to allow individual authors to make the decision on\n     *  whether this method is blocking or should just pass the number through -- to the api for example)\n     * @param  {string}  phoneNumber the phone number to Checks\n     * @param  {string}  country     the country countryCode\n     * @param  {Boolean} strict      should return false if doesn't pass isValidNumber\n     * @param  {string}  subMsgType  the message subtype (SMS, WhatsApp, etc.)\n     * @return {Boolean}\n     */\n    isValidNumber(phoneNumber, country, strict, subMsgType) {\n        try {\n            if (subMsgType === 'whatsapp') {\n                phoneNumber = phoneNumber.replace(removeLeadingPlusRegex, '');\n                return !phoneNumber.match(nonDigitRegex);\n            }\n            const defaultCountryCode = this.get('session.org.orgDefaultCountryCode') || null; // Default country setting in admin\n            const countryCode = country || defaultCountryCode || this.get('countryCode'); // make a guess on the country code\n            const isValid = intlTelInputUtils.isValidNumber(phoneNumber, countryCode);\n            return strict ? isValid : true;\n        } catch (e) {\n            return !strict;\n        }\n    },\n\n    /**\n     * Remove 'tel:' or 'sip:' from a string\n     * @param  {string} phoneNumber the number to format\n     * @return {string}             the number sans (tel:|sip:)\n     */\n    formatRawNumber(phoneNumber) {\n        if (_.includes(phoneNumber, 'tel')) {\n            return phoneNumber.replace(/tel:/gi, '');\n        } else if (_.includes(phoneNumber, 'sip')) {\n            return phoneNumber.replace(/sip:/gi, '');\n        } else {\n            return phoneNumber;\n        }\n    },\n\n    /**\n     * Format a field config entry value\n     * @param  {object} itemToFormat the thing to format\n     * @return {string}              the formatted string\n     */\n    formatFieldConfigEntry(itemToFormat) {\n        const e164 = Ember.get(itemToFormat, 'rel.e164');\n        if (e164) {\n            return e164;\n        }\n        let number = Ember.get(itemToFormat, 'value.number');\n        number = number != null ? number.replace(/\\D/g, '') : void 0;\n        let extension = Ember.get(itemToFormat, 'value.extension');\n        extension = extension != null ? extension.replace(/\\D/g, '') : void 0;\n        if (number) {\n            // number = this.formatAddress(number);\n            if (extension) {\n                itemToFormat = number + ';ext=' + extension;\n            } else {\n                itemToFormat = '' + number;\n            }\n        } else if (extension) {\n            itemToFormat = extension;\n        }\n        return itemToFormat;\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport AjaxService from 'ember-ajax/services/ajax';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst RateLimitPromise = Ember.ObjectProxy.extend(Ember.PromiseProxyMixin, {\n    isRateLimited: false,\n    rateLimitResetTime: 0\n});\n\n/**\n * A symbol to use as a key in the options hash of requests made through the ajax service to specify\n * subsection(s) of the app from which the request is being made. Provided values can be a string or string[].\n * Strings should not include `/` chars as they are the header primary separator.\n * leading/trailing ws will be dropped and slashes will be replaced.\n *\n * Examples:\n * options[REQUEST_TELEMETRY_APP_SUBSECTIONS] = 'my-cool-web-dir-section';\n * options[REQUEST_TELEMETRY_APP_SUBSECTIONS] = ['my-cool-web-dir-section', '1.0.0']\n */\nexport const REQUEST_TELEMETRY_APP_SUBSECTIONS = Symbol();\n\n// Exported for testing purposes\nexport function shouldRetryRequest(xhr) {\n    if (!xhr || xhr.status !== 429) {\n        return false;\n    }\n    const header = xhr.getResponseHeader('retry-after');\n    return !!header && retryStringToNumber(header) !== null;\n}\n\nfunction retryStringToNumber(value) {\n    const number = parseInt(value, 10);\n    if (isNaN(number) || number < 0) {\n        return null;\n    }\n    return number;\n}\n\nfunction retryResetTime(xhr) {\n    let headerRateLimit = xhr.getResponseHeader('retry-after');\n\n    if (!!headerRateLimit) {\n        return retryStringToNumber(headerRateLimit);\n    }\n    return null;\n}\n\nfunction getHeader(headers, name) {\n    if (!headers || !name) {\n        return;\n    }\n    let foundKey = Ember.A(Object.keys(headers)).find(key => {\n        return key.toLowerCase() === name.toLowerCase();\n    });\n    if (!foundKey) {\n        return;\n    }\n    return headers[foundKey];\n}\n\nfunction isRootAPIRequest(url) {\n    // Is a domain-root request and contains an API version path\n    return url.startsWith('/') && url.includes('/api/v2/');\n}\n\nexport default AjaxService.extend(LoggerMixin, Ember.Evented, {\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    _timers: null,\n\n    authData: null,\n    currentRequest: {}, // { url: ..., options: ... }\n\n    enableRetryHeaderParsing: Ember.computed.reads('session.features.enableUIAjaxRetryHeader'),\n    enableAPIDomainRewrites: Ember.computed.reads('session.rewriteRootAPIRequests'),\n\n    headers: Ember.computed(function () {\n        return {\n            'Content-Type': 'application/json'\n        };\n    }),\n\n    trustedHosts: Ember.computed('application.purecloudV2BaseUri', function () {\n        const purecloudV2BaseUri = this.get('application.purecloudV2BaseUri');\n        const purecloudV2Host = _.startsWith(purecloudV2BaseUri, 'https://')\n            ? purecloudV2BaseUri.substring(8)\n            : purecloudV2BaseUri;\n\n        return [purecloudV2Host];\n    }),\n\n    init() {\n        this._super(...arguments);\n        this._timers = Ember.A([]);\n    },\n\n    willDestroy() {\n        if (this._timers) {\n            this._timers.forEach(timer => Ember.run.cancel(timer));\n        }\n        this._super(...arguments);\n    },\n\n    post(url, options = {}) {\n        if (options.data && typeof options.data !== 'string') {\n            options.data = JSON.stringify(options.data);\n        }\n\n        return this._super(...arguments);\n    },\n\n    put(url, options = {}) {\n        if (options.data && typeof options.data !== 'string') {\n            options.data = JSON.stringify(options.data);\n        }\n\n        return this._super(...arguments);\n    },\n\n    patch(url, options = {}) {\n        if (options.data && typeof options.data !== 'string') {\n            options.data = JSON.stringify(options.data);\n        }\n\n        return this._super(...arguments);\n    },\n\n    ajaxGet(url, options = {}) {\n        if (options.data && typeof options.data !== 'string') {\n            options.data = $.param(options.data);\n        }\n        options.method = 'GET';\n\n        return this.request(url, options);\n    },\n\n    _scheduleRequest(url, options, retryTime, deferred) {\n        const scheduleTime = retryTime * 1000;\n        const timer = Ember.run.later(() => {\n            this._timers.removeObject(timer);\n            this.raw(url, options, deferred);\n        }, scheduleTime);\n        this._timers.pushObject(timer);\n    },\n\n    /**\n     * Overriden to make sure we are rate-limited by using `raw`, but returning the same payload as\n     * inherited `request` function.\n     * Please do not make heavy use of the retry option. It is meant as a last resort.\n     *\n     * @param url {string} request URL\n     * @param options {object}\n     * @param [options.retry=false] {boolean} Honor the retry header. Defaults to false. Pass true to retry the request automatically\n     */\n    request(url, options) {\n        let reqUrl = this.addApiDomainIfMissing(url);\n        return this.raw(reqUrl, options)\n            .then(({ response }) => Ember.RSVP.resolve(response))\n            .catch(({ response }) => Ember.RSVP.reject(response));\n    },\n\n    addApiDomainIfMissing(url) {\n        if (this.get('enableAPIDomainRewrites') && isRootAPIRequest(url)) {\n            let apiDomain = window.location.hostname.replace(/^app\\./, 'api.');\n            return `${window.location.protocol}//${apiDomain}${url}`;\n        } else {\n            return url;\n        }\n    },\n\n    raw(url, options = {}, deferred = null) {\n        const canParseHeaders = this.get('enableRetryHeaderParsing');\n        const retryDisabled = options && !options.retry;\n        if (retryDisabled || !canParseHeaders) {\n            return this._super(...arguments);\n        }\n\n        if (!deferred) {\n            deferred = Ember.RSVP.defer();\n        }\n\n        const promiseProxy = RateLimitPromise.create({\n            promise: deferred.promise\n        });\n\n        this._super(...arguments)\n            .then(data => deferred.resolve(data))\n            .catch(data => {\n                const { jqXHR } = data;\n\n                const shouldRetry = shouldRetryRequest(jqXHR);\n                const retryTime = retryResetTime(jqXHR);\n                this._logPossibleRetryEvent(url, jqXHR, retryTime, shouldRetry);\n\n                if (!shouldRetry) {\n                    deferred.reject(data);\n                    return;\n                }\n\n                this._scheduleRequest(url, options, retryTime, deferred);\n\n                if (promiseProxy) {\n                    Ember.set(promiseProxy, 'isRateLimited', true);\n                    Ember.set(promiseProxy, 'rateLimitResetTime', retryTime);\n                }\n\n                this.trigger('rateLimited', {\n                    url,\n                    options,\n                    jqXHR\n                });\n            });\n\n        return promiseProxy;\n    },\n\n    /**\n     * Overridden here to preserve error data, since the base\n     * ember-ajax class ignored important parts of error responses.\n     */\n    normalizeErrorResponse(status, headers, payload) {\n        let err = this._super(status, headers, payload);\n        if (err && typeof error === 'object') {\n            err.errorResponse = payload;\n        }\n        return err;\n    },\n\n    _logPossibleRetryEvent(url, xhr, retryTime, shouldRetry) {\n        const headers = xhr.getAllResponseHeaders();\n        if (retryTime === null && !!xhr.getResponseHeader('retry-after')) {\n            this.logger.error('Found retry header, but unable to parse time:', {\n                url,\n                headers\n            });\n            return;\n        }\n\n        if (!shouldRetry) {\n            return;\n        }\n\n        this.logger.warn('Request failed, but a retry header was found. Scheduling to run in the future:', {\n            url,\n            headers,\n            seconds: retryTime\n        });\n    },\n\n    generateDetailedMessage(status, headers, payload, requestData) {\n        let url = requestData.url;\n        if (url) {\n            // Try to strip out everything but the host + path\n            try {\n                const urlObject = url.startsWith('/') ? new URL(url, window.location.origin) : new URL(url);\n                url = `${urlObject.origin}${urlObject.pathname}`;\n            } catch (_) {\n                this.logger.info('Redacted possibly sensitive URL:', {\n                    url\n                });\n                url = 'REDACTED';\n            }\n        }\n\n        let correlationId;\n        try {\n            const correlationHeaderKey = 'ININ-Correlation-Id';\n            const headerCorrelationId = getHeader(headers, correlationHeaderKey);\n            const payloadCorrelationId = !!payload && payload.contextId;\n            correlationId = headerCorrelationId || payloadCorrelationId || '(unknown)';\n        } catch (_) {\n            correlationId = '(unknown)';\n        }\n\n        return [\n            'Ember AJAX request',\n            `Method: ${requestData.type}`,\n            `URL: ${url}`,\n            `Status: ${status}`,\n            `Correlation ID: ${correlationId}`\n        ].join('\\n');\n    }\n});\n","import Ember from 'ember';\nimport * as PlatformJS from 'platform';\n\nexport default Ember.Service.extend({});\n\n/**\n * Builds common properties that could be useful in many telemetry and logging situations.\n * The data must ALWAYS be safe for logging.  i.e. no customer or PII data.\n */\nexport function buildCommonTelemetryContext({ applicationService, sessionService, intlService }) {\n    const isHosted = applicationService.get('hostedContext.isHostedProp');\n\n    const commonCtxt = {\n        applicationVersion: applicationService.get('semver'),\n        organizationId: sessionService.get('org.guid'),\n        organization: sessionService.get('org.shortName'),\n        userId: sessionService.get('person.guid'),\n        uiLanguage: intlService.get('isoLocale'),\n        envName: applicationService.get('runtime.name'),\n        isPopout: applicationService.get('isPopout'),\n        webDirAgent: isHosted ? 'desktop' : 'browser',\n        platformJsBrowserName: PlatformJS.name,\n        platformJsBrowserVersion: PlatformJS.version,\n        platformJsProduct: PlatformJS.product,\n        platformJsManufacturer: PlatformJS.manufacturer,\n        platformJsLayout: PlatformJS.layout,\n        platformJsOperatingSystem: PlatformJS.os.toString(),\n        platformJsDescription: PlatformJS.description\n    };\n\n    if (isHosted) {\n        return Object.assign({}, commonCtxt, {\n            desktopOS: applicationService.get('hostedContext._operatingSystem'),\n            desktopVersion: applicationService.get('hostedContext._version')\n        });\n    }\n\n    return commonCtxt;\n}\n","/* global navigator */\nimport Ember from 'ember';\nimport request from 'ember-ajax';\nimport { task, timeout } from 'ember-concurrency';\nimport _ from 'lodash';\nimport adapter from 'npm:webrtc-adapter';\nimport { APP_NAME } from './stash-logger';\nimport { EVENTS } from '../utils/hosted-context';\nimport netUtils from '../utils/net';\n// import { addPageAction } from '../utils/newrelic';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport config from '../config/environment';\n\nconst { computed, inject, observer } = Ember;\n\nconst BRIDGE_CONFIGURATION = {};\nconst deprecation = {\n    id: 'directory-core.deprecate-application-locale',\n    until: '6.0.0',\n    url: 'https://bitbucket.org/inindca/connections-ui/src/develop/DEPRECATIONS.md'\n};\n\nconst COOKIES = {\n    session: 'X-OrgSpan-Auth-Key',\n    proxyPersonId: 'proxy-person-id',\n    locale: 'locale',\n    prevU_id: '_pu_i',\n    activePersonId: '_ap_i',\n    activeGroupId: '_ag_i',\n    lastSearchQuery: '_lsq2',\n    lastProfileQuery: '_lpq2',\n    debug: 'debug',\n    debugOrgName: 'debug-orgName',\n    debugAppModeReadOnly: 'debug-readOnly',\n    debugMasonry: 'debug-masonry'\n};\n\nexport default Ember.Service.extend({\n    ajax: inject.service(),\n    chat: inject.service(),\n    intl: inject.service(),\n    store: inject.service(),\n    cookies: inject.service(),\n    session: inject.service(),\n    streaming: inject.service(),\n    preferences: inject.service(),\n    pigeon: inject.service(),\n    feature: inject.service(),\n    webrtc: inject.service(),\n    mediaProviders: inject.service(),\n    stashLogger: inject.service(),\n\n    envDetails: null,\n    // Runtime is injected via the instance-initializer and is resolved at runtime. It will not resolve in testing mode, so anything that uses it will need to mock it in the tests.\n    runtime: null,\n    dragging: false,\n    browserHidden: false,\n    iframeFocused: false,\n    currentRouteName: null,\n    urlprefix: '',\n    authUri: null,\n    cobrowseUri: null,\n    purecloudAppsUri: null,\n    streamingServiceUri: null,\n    orgspanBaseUri: '/directory',\n    purecloudBaseUri: '/platform',\n    purecloudV2BaseUri: '',\n    realtimeScriptUri: '/static-realtime-js/realtime.js',\n    hostedContext: null,\n\n    isMobile: false,\n    mobileQueryParameter: false,\n    belowMobileThreshold: false,\n\n    showAdminModal: false,\n    showLoader: false,\n\n    trialSupportDisplayed: false,\n\n    debugSettings: {},\n\n    offerMobilePreference: true,\n    offerMobilePreferenceRetreived: false,\n\n    currentYear: new Date().getFullYear(),\n\n    offerMobileApp: computed(\n        'mobileQueryParameter',\n        'isMobile',\n        'offerMobilePreference',\n        'offerMobilePreferenceRetreived',\n        {\n            get() {\n                if (this.get('mobileQueryParameter') || !this.get('offerMobilePreferenceRetreived')) {\n                    return false;\n                }\n\n                return this.get('isMobile') && this.get('offerMobilePreference');\n            },\n            set(key, value) {\n                this.get('preferences').setPreference('offerMobileApp', value);\n                this.set('offerMobilePreference', value);\n            }\n        }\n    ),\n\n    orgName: computed.alias('session.org.name'),\n    orgShortName: computed.alias('session.org.shortName'),\n\n    init() {\n        this._super(...arguments);\n        if (isTesting) {\n            this.set('urlprefix', '/');\n        }\n        this.checkForDebugMode();\n        this.gatherEnvDetails();\n        this.initIframeFocusListener();\n        this.setVisibilityListener();\n\n        const pigeon = this.get('pigeon');\n        pigeon.on('connect', () => {\n            let context = this.get('hostedContext');\n            if (context) {\n                context.sendEventToDesktop(EVENTS.PHONE_CONNECTED, {});\n            }\n        });\n\n        let hasRecentlyLostSubscriptions = false;\n        pigeon.on('no_longer_subscribed', () => {\n            if (!hasRecentlyLostSubscriptions) {\n                Ember.Logger.info('Resubscribing to pigeon after no_longer_subscribed');\n                hasRecentlyLostSubscriptions = true;\n                Ember.run.later(() => (hasRecentlyLostSubscriptions = false), 2000);\n                pigeon._registerTopics(); // trigger immediate resubscribe\n                return;\n            }\n            Ember.Logger.warn(\n                'Multiple no_longer_subscribed events, showing warning to user and stopping resubscribe.'\n            );\n            // ENGAGEUI-1563: Warn users if channel limit\n            // has been hit and current channel will no longer\n            // receive updates.\n            this.set('session.shouldWarnNoLongerSubscribed', true);\n        });\n\n        this.get('preferences')\n            .getPreference('offerMobileApp')\n            .then(value => {\n                // needed for unit tests\n                if (this.isDestroyed || this.isDestroying) {\n                    return;\n                }\n                this.set('offerMobilePreference', value !== false);\n                this.set('offerMobilePreferenceRetreived', true);\n            });\n\n        this.get('pigeon').on('topicsRegistered', () => {\n            let context = this.get('hostedContext');\n            if (context) {\n                context.sendEventToDesktop(EVENTS.PHONE_CONNECTED, {});\n            }\n        });\n        this.get('pigeon').on('hawkSubscriptionError', err => {\n            this.get('stashLogger').error('Hawk Subscription Error', { err });\n        });\n\n        Ember.Logger.log('WebRTC Adapter loaded at application level', { adapter });\n    },\n\n    async openChatRoomWithVideo() {\n        // no op for now\n    },\n\n    destroy() {\n        if (this.get('csRunLater')) {\n            Ember.run.cancel(this.get('csRunLater'));\n        }\n        this._super(...arguments);\n    },\n\n    currentRouteClass: Ember.computed('currentRouteName', function () {\n        var name = this.get('currentRouteName');\n        if (name) {\n            return name.replace(/[./]+/g, '-');\n        }\n\n        return '';\n    }),\n\n    isoLocale: computed.deprecatingAlias('intl.isoLocale', deprecation),\n    systemLocale: computed.deprecatingAlias('intl.systemLocale', deprecation),\n    iso2LocaleCountry: computed.deprecatingAlias('intl.iso2LocaleCountry', deprecation),\n    setLocale(locale) {\n        const message =\n            'The \"setLocale\" method in \"connections-ui/service/application\" has been deprecated. Please use \"service:intl\" for all locale information.';\n        Ember.deprecate(message, false, deprecation);\n        return this.get('intl').setLocale(locale);\n    },\n\n    gatherEnvDetails() {\n        if (isTesting) {\n            return;\n        }\n        try {\n            this.set('envDetails', netUtils.getEnvDetails());\n        } catch (error) {\n            Ember.Logger.error('Failed to parse URL into a known runtime environment. Check URL and utils/net.js', {\n                reason: error.message\n            });\n            this.set('errorState', { type: 'invalidEnv' });\n        }\n    },\n\n    initIframeFocusListener() {\n        const guid = Ember.guidFor(this);\n        Ember.$(window)\n            .on(`focus.${guid}`, () => this.set('iframeFocused', false))\n            .on(`blur.${guid}`, () => {\n                if (!document) {\n                    return;\n                }\n                const nodeName = Ember.get(document, 'activeElement.nodeName');\n                if (nodeName && nodeName.toLowerCase() === 'iframe') {\n                    this.set('iframeFocused', true);\n                }\n            });\n    },\n\n    setVisibilityListener() {\n        let hidden;\n        let visibilityChange;\n        if (typeof document.hidden !== 'undefined') {\n            hidden = 'hidden';\n            visibilityChange = 'visibilitychange';\n        } else if (typeof document.mozHidden !== 'undefined') {\n            hidden = 'mozHidden';\n            visibilityChange = 'mozvisibilitychange';\n        } else if (typeof document.msHidden !== 'undefined') {\n            hidden = 'msHidden';\n            visibilityChange = 'msvisibilitychange';\n        } else if (typeof document.webkitHidden !== 'undefined') {\n            hidden = 'webkitHidden';\n            visibilityChange = 'webkitvisibilitychange';\n        }\n        const guid = Ember.guidFor(this);\n        Ember.$(document).on(`${visibilityChange}.${guid}`, () => {\n            this.set('browserHidden', document[hidden]);\n        });\n        Ember.$(window)\n            .on(`blur.${guid}`, () => {\n                if (this.get('browserHidden') !== undefined) {\n                    this.set('browserHidden', true);\n                }\n            })\n            .on(`focus.${guid}`, () => {\n                if (this.get('browserHidden') !== undefined) {\n                    this.set('browserHidden', false);\n                }\n            });\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this.get('pigeon').off('connect');\n        this.get('pigeon').off('topicsRegistered');\n        const pigeonUserSubscribed = this.get('pigeonUserSubcribed');\n        if (pigeonUserSubscribed) {\n            this.get('pigeon').off(pigeonUserSubscribed);\n        }\n        const guid = Ember.guidFor(this);\n        Ember.$(window).off(`.${guid}`);\n        Ember.$(document).off(`.${guid}`);\n    },\n\n    loadStreamingService() {\n        const authenticated = this.get('session.isAuthenticated');\n        if (isTesting || !authenticated) {\n            return Ember.RSVP.reject();\n        }\n        const scriptUri = this.realtimeScriptUri;\n        const streamingService = this.get('streaming');\n        streamingService.set('scriptUrl', scriptUri);\n        let features;\n        if (this.get('session.features')) {\n            features = Ember.RSVP.resolve(this.get('session.features'));\n        } else {\n            features = this.get('feature')\n                .getFeatureToggles('webrtcRelayOnly')\n                .catch(err => {\n                    Ember.Logger.warn('Failed to fetch toggles for realtime connection', { err });\n                    // do not rethrow, don't want this to prevent realtime connection\n                    return {};\n                });\n        }\n        return features.then(res => {\n            const runAsMediaHelper =\n                (this.get('hostedContext.isHostedProp') || window.testMediaHelperMode) &&\n                this.get('hostedContext.runAsMediaHelper');\n\n            if (runAsMediaHelper) {\n                Ember.Logger.info('Running in media helper mode');\n                this.set('mediaHelperMode', true);\n                Ember.Logger.info('Letting webrtcSdk set up media helper jid');\n            }\n\n            return streamingService.setupConnection({\n                jid: this.get('session.person.jid'),\n                accessToken: this.get('session.accessToken'),\n                iceTransportPolicy: res.webrtcRelayOnly ? 'relay' : 'all',\n                signalIceConnected: true,\n                disableEOCShortCircuit: true,\n                referenceStanza: true,\n                streamingServiceUri: this.get('streamingServiceUri'),\n                envDetails: this.get('envDetails'),\n                originAppName: APP_NAME,\n                originAppVersion: config.APP.semver,\n                originAppId: this.get('stashLogger.clientSessionId'),\n                splitHawkAndRealtime: true,\n                useServerSidePings: true,\n                customHeaders: {\n                    'Genesys-App': 'connections-ui-webui'\n                }\n            });\n        });\n    },\n\n    streamingServiceConnect: task(function* (debounce = 1000) {\n        yield timeout(debounce);\n        const authenticated = this.get('session.isAuthenticated');\n        const jid = this.get('session.person.jid');\n        const accessToken = this.get('session.accessToken');\n        const chatEnabled = this.get('session.org.hasChatEnabled');\n        const adminUIContext = this.get('adminUIContext');\n        const streamingService = this.get('streaming');\n        return this.loadStreamingService().then(() => {\n            if (authenticated && accessToken && chatEnabled && !adminUIContext) {\n                this.get('chat').set('enabled', true);\n\n                if (!this.get('pigeonUserSubscribed')) {\n                    const myGuid = this.get('session.person.guid');\n                    Ember.Logger.debug('Subscribing to user guid for system topic', { myGuid });\n                    this.set('pigeonUserSubscribed', myGuid);\n                    this.get('pigeon').on(myGuid, data => {\n                        if (this.isDestroyed || this.isDestroying) {\n                            return;\n                        }\n                        Ember.Logger.debug('System topic', { data });\n                        if (data.systemTopicType === 'token_revoked') {\n                            this.get('session').invalidate({ notified: true });\n                        }\n                    });\n                }\n\n                return streamingService.connect(accessToken, jid).then(() => {\n                    this.get('pigeon')._registerTopics();\n                });\n            }\n        });\n    }).drop(),\n\n    /**\n     * This logic will ultimately be replaced by the pipeline\n     * script insertion logic, but we wanted to enabled with a\n     * feature toggle before migrating.\n     */\n    csEnabled: false,\n    csRunLater: null,\n    checkContentSquare: observer(\n        'session.features.ATLAS-536_EnableContentSquare',\n        'session.features.AGORA-137_connections-ui-contentsquare',\n        function () {\n            this.set(\n                'csRunLater',\n                Ember.run.later(() => {\n                    if (\n                        !this.get('csEnabled') &&\n                        this.get('session.features.ATLAS-536_EnableContentSquare') &&\n                        this.get('session.features.AGORA-137_connections-ui-contentsquare') &&\n                        !this.isDestroyed &&\n                        !this.isDestroying\n                    ) {\n                        const csLoaderScript = document.createElement('script');\n                        csLoaderScript.type = 'text/javascript';\n                        csLoaderScript.src = '/contentsquare/1632/loader.js';\n                        csLoaderScript.crossOrigin = 'anonymous';\n                        csLoaderScript.async = true;\n                        document.body.appendChild(csLoaderScript);\n                        this.set('csEnabled', true);\n                    }\n                }, 500)\n            );\n        }\n    ).on('init'),\n\n    syncStreamingConnectionToAuthState: observer(\n        'session.{isAuthenticated,accessToken}',\n        'session.org.hasChatEnabled',\n        'preferences.chat.disableStreaming',\n        function () {\n            this.get('streamingServiceConnect').perform();\n        }\n    ).on('init'),\n\n    syncVideoChatStateToAdminContext: observer(\n        'session.isAuthenticated',\n        _.debounce(function () {\n            if (this.get('adminUIContext')) {\n                this.set('session.features.videoChat', false);\n            }\n        }, 20)\n    ),\n\n    clearActiveRoomMessagesOnAppFocus: observer('browserHidden', function () {\n        if (this.get('browserHidden')) {\n            return;\n        }\n        this.get('_delayedRefocusChatRoom').perform();\n    }),\n\n    _delayedRefocusChatRoom: task(function* (delay = 500) {\n        yield timeout(delay);\n        this.get('chat').refocusActiveRoom();\n    }),\n\n    displayTrialSupport() {\n        this.set('trialSupportDisplayed', true);\n    },\n\n    dismissTrialSupport() {\n        this.set('trialSupportDisplayed', false);\n    },\n\n    adminUIContext: false,\n\n    uvOptions: {\n        mode: 'feedback',\n        feedback_tab_name: 'Your Feedback or Idea',\n        primary_color: '#4498b4',\n        link_color: '#007dbf',\n        default_mode: 'feedback',\n        forum_id: 294075\n    },\n\n    postMessageRouteChange(transition) {\n        if (!this.get('adminUIContext')) {\n            return;\n        }\n        const { targetName, params } = transition;\n        const routeType = _.head(targetName.split('.detail.index')) || false;\n        const route = params[`${routeType}.detail`];\n        const routeId = route && route[`${routeType}_id`];\n        const data = {\n            type: 'directory:route:changed',\n            data: { routeType, routeId }\n        };\n        Ember.Logger.debug('postMessage -> window.parent', { data });\n        window.parent.postMessage(JSON.stringify(data), '*');\n    },\n\n    uri(path) {\n        if (this.get('session.rewriteRootAPIRequests')) {\n            // If we're on the new hosting infrastructure, force API calls to use the api. subdomain\n            return [].concat(this.purecloudV2BaseUri, path).join('/');\n        } else {\n            return [].concat(this.orgspanBaseUri, path).join('/');\n        }\n    },\n\n    pcUri(path) {\n        if (this.get('session.rewriteRootAPIRequests')) {\n            // If we're on the new hosting infrastructure, force API calls to use the api. subdomain\n            return [].concat(this.purecloudV2BaseUri, path).join('/');\n        } else {\n            return [].concat(this.purecloudBaseUri, path).join('/');\n        }\n    },\n\n    pcV2Uri(path) {\n        return [].concat(this.purecloudV2BaseUri, path).join('/');\n    },\n\n    localGCBAUri(path, port) {\n        return `https://127.0.0.1:${port}/${path}`;\n    },\n\n    changePreferredLanguage(lang) {\n        const path = this.uri(['api/v2/preferredLanguage']);\n        return request(path, {\n            type: 'post',\n            data: JSON.stringify({ lang })\n        }).then(() => {\n            window.location.reload(true);\n        });\n    },\n\n    iframed() {\n        try {\n            return window.self !== window.top;\n        } catch (error) {\n            return true;\n        }\n    },\n\n    sendDiagnostics(data) {\n        return this._sendDiagnostics(data, 'diagnostics');\n    },\n\n    sendFeedback(data) {\n        return this._sendDiagnostics(data, 'diagnostics/support');\n    },\n\n    checkForMobile: Ember.on('init', function () {\n        if (\n            /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|Tablet|Silk/i.test(\n                navigator.userAgent\n            )\n        ) {\n            return this.set('isMobile', true);\n        } else {\n            return this.set('isMobile', false);\n        }\n    }),\n\n    isMobilePhone: computed('isMobile', function () {\n        if (/Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini|Silk/i.test(navigator.userAgent)) {\n            return true;\n        } else {\n            return false;\n        }\n    }),\n\n    showTinyNavMenu: computed.or('belowMobileThreshold', 'isMobilePhone'),\n\n    showContextualHelp: computed('showTinyNavMenu', function () {\n        const person = this.get('session.person');\n        return this.get('showTinyNavMenu') && (person.get('isEngageAgent') || person.get('isAdmin'));\n    }),\n\n    isPopout: computed('isPef', 'currentRouteName', function () {\n        if (this.get('isPef')) {\n            return true;\n        }\n\n        const route = this.get('currentRouteName');\n        const popoutRoutes = [\n            'chat-room',\n            'screen-share',\n            // TODO: Remove interactions route from popout\n            // The interactions route has historically been considered a popout\n            // route; however, I don't believe it's used in any production\n            // capacity which is reinforced by the currently broken styles.\n            // I suspect the interactions route will be repurposed for the AgentUI\n            // decomp and/or IA.  When that happens, we should remove this from the\n            // popout computed.  Ultimately, the popout concept needs to be reworked\n            // as well.\n            'interactions',\n            'phone',\n            'engage.quality.quality.interactions.screen-recordings'\n        ];\n        return popoutRoutes.includes(route);\n    }),\n\n    isScreenRecordingPopout: computed('currentRouteName', function () {\n        const route = this.get('currentRouteName');\n        const popoutRoutes = ['engage.quality.quality.interactions.screen-recordings'];\n        return popoutRoutes.includes(route);\n    }),\n\n    /**\n     * Indicates if we're in the legacy, PEF-specific route used for embedding inside\n     * of other CRMs (aka the embedded framework).\n     *\n     * PEF embed support will be removed with MP and replaced by direct usage of the\n     * appsv2 apps externally.  Uses of this computed should be strictly limited to\n     * cases where behavior must diverge between standard CX and PEF mode.\n     * Furthermore, this computed should not be used within the MP/v2 fork of\n     * interactions as it's inherently checked.  If an interaction sub-view is\n     * shared between v1 and v2, then this computed can be used.\n     */\n    isPef: computed('currentRouteName', function () {\n        return this.get('currentRouteName') === 'interaction';\n    }),\n\n    /**\n     * PEF embed support will be removed with MP and replaced by direct usage of the\n     * appsv2 apps.  This computed can be used, however, it should not be used within\n     * the MP/v2 fork of interactions as it's inherently checked.  If an interaction\n     * sub-view is shared between v1 and v2, then this computed can be used.\n     *\n     * @deprecated Use isPef for PEF detection (note that embedded PEF is also\n     * soon to be removed).  A separate `isInteractionsPopout` utility shouldn't be needed,\n     * but a separate computed can be added if deemed necessary in the future.\n     */\n    isInteractionPopout: computed('currentRouteName', function () {\n        const route = this.get('currentRouteName');\n        const popoutRoutes = ['interaction', 'interactions'];\n        return popoutRoutes.includes(route);\n    }),\n\n    isAdminRoute: computed('currentRouteName', function () {\n        const route = this.get('currentRouteName');\n\n        if (route === 'engage.embedded') {\n            return window.location.hash.toLowerCase().includes('admin');\n        }\n\n        const adminRoutes = [\n            'admin',\n            'billing.upgrades',\n            'people-permissions.people-permissions.auth-orgs.access-to-my-org'\n        ];\n        return adminRoutes.some(r => route.search(r) === 0);\n    }),\n\n    _sendDiagnostics(data, uri) {\n        const request = {\n            url: this.pcUri(`api/v2/${uri}`),\n            type: 'post',\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'json',\n            data: JSON.stringify(data),\n            cache: false,\n            context: this\n        };\n        function successHandler(data) {\n            Ember.Logger.debug('applicationService: sendFeedback', { id: data.id });\n            return data;\n        }\n        function errorHandler(jqXHR) {\n            Ember.onerror(jqXHR);\n            return jqXHR;\n        }\n        return Ember.RSVP.cast($.ajax(request), 'applicationService#sendFeedback')\n            .then(successHandler)\n            .catch(errorHandler);\n    },\n\n    setBridgeConfiguration(type, data) {\n        return (BRIDGE_CONFIGURATION[type] = data);\n    },\n\n    checkForDebugMode() {\n        const cookies = this.get('cookies');\n        var params = this.getQueryParams();\n        var debugCookie = cookies.read(COOKIES.debug);\n\n        if (params[COOKIES.debug] !== undefined) {\n            this.set('debug', true);\n            cookies.write(COOKIES.debug, true);\n        } else if (debugCookie) {\n            this.set('debug', true);\n        }\n\n        if (this.get('debug')) {\n            this.buildDebugSettings();\n        }\n    },\n\n    buildDebugSettings() {\n        const cookies = this.get('cookies');\n        const params = this.getQueryParams();\n\n        var orgName = params[COOKIES.debugOrgName],\n            orgNameCookie = cookies.read(COOKIES.debugOrgName);\n\n        var readOnly = params[COOKIES.debugAppModeReadOnly],\n            readOnlyCookie = cookies.read(COOKIES.debugAppModeReadOnly);\n\n        var masonry = params[COOKIES.debugMasonry],\n            masonryCookie = cookies.read(COOKIES.debugMasonry);\n\n        if (orgName !== undefined && orgName.length > 0) {\n            this.set('debugSettings.orgName', orgName);\n            cookies.write(COOKIES.debugOrgName, orgName);\n        } else if (orgNameCookie) {\n            this.set('debugSettings.orgName', orgNameCookie);\n        }\n\n        if (readOnly !== undefined) {\n            this.set('debugSettings.readOnly', true);\n            cookies.write(COOKIES.debugAppModeReadOnly, true);\n        } else if (readOnlyCookie) {\n            this.set('debugSettings.readOnly', true);\n        }\n\n        if (masonry !== undefined) {\n            masonry = masonry !== 'false';\n\n            this.set('debugSettings.masonry', masonry);\n            cookies.write(COOKIES.debugMasonry, masonry);\n        } else if (masonryCookie) {\n            masonryCookie = masonryCookie !== 'false';\n\n            this.set('debugSettings.masonry', masonryCookie);\n        }\n    },\n\n    getQueryParams() {\n        const obj = {};\n        const params = window.location.search.slice(1).split('&');\n\n        _.each(params, function (param) {\n            const split = param.split('=');\n            obj[split[0]] = split.length > 1 ? split[1] : '';\n        });\n\n        return obj;\n    }\n});\n","import Ember from 'ember';\nconst { RSVP, getOwner, typeOf, inject } = Ember;\n\nexport const SHOW_PROFILE_APP_API_ACTION_NAME = 'showProfile';\nexport const SHOW_GROUP_APP_API_ACTION_NAME = 'showGroup';\n\nconst DirectoryNavHandler = Ember.Object.extend({\n    session: inject.service(),\n    routerService: null,\n\n    init() {\n        this._super(...arguments);\n        this.set('routerService', getOwner(this).lookup('router:main'));\n    },\n\n    /**\n     * Synchronous check to see if this handler is applicable for the specified AppApiCall instance\n     *\n     * @param {Object} the AppApiCall instance to check if this handler can handle\n     *\n     * @returns true if the provided AppApiCall instance could be handled by this handler. This check should\n     *  be limited to checking if the handler is responsible for this type of AppApiCall rather than if the\n     *  payload itself is valid.  If no handler returns true, the error will be that no handler exists which is\n     *  a different case than the AppApiCall is invalid. Practically, this means that validation of the payload\n     *  should be done in the handle method\n     */\n    canHandle(appApiCall) {\n        return (\n            appApiCall.get('action') === SHOW_PROFILE_APP_API_ACTION_NAME ||\n            appApiCall.get('action') === SHOW_GROUP_APP_API_ACTION_NAME\n        );\n    },\n\n    handle(appApiCall) {\n        if (appApiCall.get('action') === SHOW_PROFILE_APP_API_ACTION_NAME) {\n            return this._handleShowProfile(appApiCall);\n        } else if (appApiCall.get('action') === SHOW_GROUP_APP_API_ACTION_NAME) {\n            return this._handleShowGroup(appApiCall);\n        }\n    },\n\n    _handleShowProfile(appApiCall) {\n        return new RSVP.Promise((resolve, reject) => {\n            const { profileId } = appApiCall.get('actionDetails');\n            if (!profileId) {\n                reject('profileId not found');\n                return;\n            }\n            if (typeOf(profileId) !== 'string') {\n                reject('profileId is not a string');\n                return;\n            }\n\n            const routerService = this.get('routerService');\n            if (!routerService) {\n                reject('Handler Error: router not found');\n                return;\n            }\n\n            routerService.transitionTo('person.detail', profileId);\n            return resolve();\n        });\n    },\n\n    _handleShowGroup(appApiCall) {\n        return new RSVP.Promise((resolve, reject) => {\n            const { groupId } = appApiCall.get('actionDetails');\n            if (!groupId) {\n                reject('groupId not found');\n                return;\n            }\n            if (typeOf(groupId) !== 'string') {\n                reject('groupId is not a string');\n                return;\n            }\n\n            const routerService = this.get('routerService');\n            if (!routerService) {\n                reject('Handler Error: router not found');\n                return;\n            }\n\n            routerService.transitionTo('group.detail', groupId);\n            return resolve();\n        });\n    }\n});\n\nexport default DirectoryNavHandler;\n","import Ember from 'ember';\nconst { inject } = Ember;\n\nexport const SHOW_HELP_APP_API_ACTION_NAME = 'showHelp';\nexport const HIDE_HELP_APP_API_ACTION_NAME = 'hideHelp';\nexport const SHOW_RC_ARTIFACT_APP_API_ACTION_NAME = 'showResourceCenterArtifact';\n\nexport default Ember.Object.extend({\n    help: inject.service(),\n\n    /**\n     * Synchronous check to see if this handler is applicable for the specified AppApiCall instance\n     *\n     * @param {Object} the AppApiCall instance to check if this handler can handle\n     *\n     * @returns true if the provided AppApiCall instance could be handled by this handler. This check should\n     *  be limited to checking if the handler is responsible for this type of AppApiCall rather than if the\n     *  payload itself is valid.  If no handler returns true, the error will be that no handler exists which is\n     *  a different case than the AppApiCall is invalie. Practically, this means that validation of the payload\n     *  should be done in the handle method\n     */\n    canHandle(appApiCall) {\n        const apiAction = appApiCall.get('action');\n\n        return (\n            apiAction === SHOW_HELP_APP_API_ACTION_NAME ||\n            apiAction === HIDE_HELP_APP_API_ACTION_NAME ||\n            apiAction === SHOW_RC_ARTIFACT_APP_API_ACTION_NAME\n        );\n    },\n\n    /**\n     * Handle the AppApiCall instance pre-filtered by canHandle\n     *\n     * @param {Object} An AppApiCall instance\n     *\n     * @returns A Promise resolving if the api action was successfully handled or rejecting with\n     *  optional details as to why the event could not be handled.\n     */\n    handle() {\n        // noop\n    }\n});\n","import Ember from 'ember';\nimport pick from 'lodash/pick';\nimport pickBy from 'lodash/pickBy';\nimport mapKeys from 'lodash/mapKeys';\nimport omit from 'lodash/omit';\nconst { RSVP, inject } = Ember;\n\nexport const SHOW_TOAST_APP_API_ACTION_NAME = 'showToast';\n\nconst TOAST_MSG_PROPS = {\n    id: {\n        type: 'string',\n        internalPropName: 'tag'\n    },\n    type: {\n        type: 'enum',\n        values: ['info', 'success', 'error'],\n        required: true\n    },\n    title: {\n        type: 'string',\n        required: true\n    },\n    message: {\n        type: 'string',\n        required: true\n    },\n    markdownMessage: {\n        type: 'boolean',\n        internalPropName: 'markdownToHtml'\n    },\n    timeout: {\n        type: 'int',\n        internalPropName: 'hideAfter'\n    },\n    showCloseButton: {\n        type: 'boolean'\n    },\n    fallbackToInBrowser: {\n        type: 'boolean'\n    },\n    forceBrowserNotification: {\n        type: 'boolean'\n    },\n    showNotificationEverywhere: {\n        type: 'boolean'\n    }\n};\nconst TOAST_MSG_PROP_NAMES = Object.keys(TOAST_MSG_PROPS);\nconst REQUIRED_TOAST_MSG_PROP_NAMES = TOAST_MSG_PROP_NAMES.filter(prop => TOAST_MSG_PROPS[prop].required);\n\nexport default Ember.Object.extend({\n    notification: inject.service('notification-proxy'),\n    stashLogger: Ember.inject.service(),\n\n    /**\n     * Synchronous check to see if this handler is applicable for the specified AppApiCall instance\n     *\n     * @param {Object} the AppApiCall instance to check if this handler can handle\n     *\n     * @returns true if the provided AppApiCall instance could be handled by this handler. This check should\n     *  be limited to checking if the handler is responsible for this type of AppApiCall rather than if the\n     *  payload itself is valid.  If no handler returns true, the error will be that no handler exists which is\n     *  a different case than the AppApiCall is invalie. Practically, this means that validation of the payload\n     *  should be done in the handle method\n     */\n    canHandle(appApiCall) {\n        return appApiCall.get('action') === SHOW_TOAST_APP_API_ACTION_NAME;\n    },\n\n    /**\n     * Handle the AppApiCall instance pre-filtered by canHandle\n     *\n     * @param {Object} An AppApiCall instance\n     *\n     * @returns A Promise resolving if the api action was successfully handled or rejecting with\n     *  optional details as to why the event could not be handled.\n     */\n    handle(appApiCall) {\n        return new RSVP.Promise((resolve, reject) => {\n            const notification = this.get('notification');\n            const stashLogger = this.get('stashLogger');\n\n            let appId = appApiCall.get('appId') || 'localApp';\n            let apiActionDetails = appApiCall.get('actionDetails');\n\n            let {\n                errors,\n                invalidProps,\n                ignoredProps,\n                validatedToastData: data\n            } = this._processToastPayload(apiActionDetails);\n\n            if (errors.length > 0) {\n                return reject(errors);\n            }\n\n            if (ignoredProps.length > 0) {\n                let ignored = ignoredProps.join(', ');\n                stashLogger.warn('The following props were ignored from your toast request:', {\n                    props: ignored\n                });\n            }\n\n            if (invalidProps.length > 0) {\n                let ignored = invalidProps.join(', ');\n                stashLogger.warn('The following props were invalid and ignored from your toast request:', {\n                    props: ignored\n                });\n            }\n\n            let fullTag = data.tag ? `${appId}_${data.tag}` : appId;\n            data.tag = fullTag;\n\n            if (!['info', 'error', 'success'].includes(data.type)) {\n                return reject(`Unsupported notification type: ${data.type}`);\n            }\n\n            notification[data.type](data.title, data.message, data);\n            return resolve();\n        });\n    },\n\n    /**\n     * Filters, renames, and validates the toast message payload\n     *\n     * @returns the filtered, validated, renamed payload (if successful) and:\n     *  errors - unrecoverable errors\n     *  ignoredProps - props not applicable for toast messages\n     *  invalidProps - known props which were not provided in the correct format, etc.\n     */\n    _processToastPayload(apiActionDetails) {\n        let requiredCount = 0;\n        const invalidProps = [];\n        const errors = [];\n\n        const filteredPickData = pick(apiActionDetails, TOAST_MSG_PROP_NAMES);\n        const filteredData = pickBy(filteredPickData, (value, prop) => {\n            const config = TOAST_MSG_PROPS[prop];\n            const result = this._checkPropValid(config, value);\n\n            if (!result) {\n                invalidProps.push(prop);\n            }\n            if (config.required && result) {\n                requiredCount++;\n            }\n\n            return result;\n        });\n\n        if (requiredCount !== REQUIRED_TOAST_MSG_PROP_NAMES.length) {\n            errors.push(\n                'One or more of the following required toast message properties were missing or invalid' +\n                    REQUIRED_TOAST_MSG_PROP_NAMES.join(', ')\n            );\n        }\n\n        if (!filteredData.showCloseButton) {\n            if (filteredData.type === 'error') {\n                errors.push('Toasts with type error must have a close button');\n            } else if (filteredData.timeout === 0) {\n                errors.push('Toast must have either a nonzero timeout or a close button');\n            }\n        }\n\n        const ignoredProps = Object.keys(omit(apiActionDetails, TOAST_MSG_PROP_NAMES));\n        const validatedToastData = errors.length > 0 ? null : this._mapDataToInternalProperties(filteredData);\n\n        return {\n            errors,\n            invalidProps,\n            ignoredProps,\n            validatedToastData\n        };\n    },\n\n    _mapDataToInternalProperties(data) {\n        return mapKeys(data, (value, prop) => TOAST_MSG_PROPS[prop].internalPropName || prop);\n    },\n\n    _checkPropValid(config, value) {\n        if (!config) {\n            return false;\n        }\n\n        switch (config.type) {\n            case 'string':\n                return typeof value === 'string';\n            case 'int':\n                return Number.isFinite(value) && parseInt(value, 10) === value;\n            case 'boolean':\n                return typeof value === 'boolean';\n            case 'enum':\n                return typeof value === 'string' && config.values.includes(value);\n            default:\n                return false;\n        }\n    }\n});\n","/* eslint no-console: \"off\" */\n\nimport Ember from 'ember';\nimport _ from 'lodash';\nimport ENV from '../config/environment';\nimport appUtils from '../utils/apps';\nimport netUtils from '../utils/net';\nimport { addPageAction } from '../utils/newrelic';\nimport App, {\n    DISPLAY_TYPES as APP_DISPLAY_TYPES,\n    FEATURE_CATEGORIES as APP_FEATURE_CATEGORIES,\n    ASSET_CATEGORIES as APP_ASSET_CATEGORIES,\n    INTERAPPTION_COMMUNICATION_TYPE_FILTERS,\n    NO_SUPPORTED_COMMUNICATION_TYPE_FILTER\n} from '../models/app';\nimport InternallyHostedApp from '../models/internally-hosted-app';\nimport ApiCall from '../models/app-api-call';\nimport AppPool from '../models/app-pool';\nimport { APPS_API_PROTOCOL, parseMessage } from '../models/app-api-call';\nimport { SHOW_TOAST_APP_API_ACTION_NAME } from './apps-api-handlers/toast-handler';\nimport { SHOW_PROFILE_APP_API_ACTION_NAME } from './apps-api-handlers/directory-nav-handler';\n\nimport {\n    SHOW_HELP_APP_API_ACTION_NAME,\n    HIDE_HELP_APP_API_ACTION_NAME,\n    SHOW_RC_ARTIFACT_APP_API_ACTION_NAME\n} from './apps-api-handlers/resource-center-handler';\n\nexport const APP_SIDEBAR_PANEL_NAME_PREFIX = 'apps-';\n\nconst APPS_BASE_URL = 'api/v2/integrations/clientapps';\n\nconst REMOTE_APPS_CACHE_TTL_MILLIS = 5 * 60 * 1000;\nconst STANDALONE_LOAD_RETRY_BASE_MILLIS = 1000;\nconst STANDALONE_LOAD_RETRY_MAX_BACKOFF_MILLIS = 60 * 1000;\nconst STANDALONE_RELOAD_INTERVAL_MILLIS = REMOTE_APPS_CACHE_TTL_MILLIS + 10;\nconst STANDALONE_RELOAD_RETRY_BASE_MILLIS = 1000;\nconst WIDGET_LOAD_RETRY_BASE_MILLIS = 1000;\nconst WIDGET_LOAD_RETRY_MAX_BACKOFF_MILLIS = 60 * 1000;\nconst WIDGET_RELOAD_INTERVAL_MILLIS = REMOTE_APPS_CACHE_TTL_MILLIS + 10;\nconst WIDGET_RELOAD_RETRY_BASE_MILLIS = 1000;\n\n/**\n * List of SDK calls pre-dating the protocol field on the SDK payload.\n *\n * This list allows us to log internal usages of the SDK without the protocol field\n * as deprecations to ensure we're ready to remove the lenient parse of the sdk message.\n *\n * [IMPORTANT:] New SDK methods should not be added to this list.\n */\nconst PROTOCOL_LENIENT_INTERNAL_ACTION_NAMES = [\n    SHOW_PROFILE_APP_API_ACTION_NAME,\n    SHOW_TOAST_APP_API_ACTION_NAME,\n    SHOW_HELP_APP_API_ACTION_NAME,\n    HIDE_HELP_APP_API_ACTION_NAME,\n    SHOW_RC_ARTIFACT_APP_API_ACTION_NAME\n];\n\n/* App Parsing Props */\n\nconst APP_PROTOCOL_CHECK_REG_EXG = new RegExp(/^\\s*https?:\\/\\/.+$/);\nconst ALLOWED_SANDBOX_VALUES = [\n    'allow-forms',\n    'allow-modals',\n    'allow-popups',\n    'allow-presentation',\n    'allow-same-origin',\n    'allow-scripts',\n    'allow-downloads'\n];\nconst ALLOWED_PERMISSION_VALUES = [\n    'camera',\n    'clipboard-write',\n    'display-capture',\n    'fullscreen',\n    //\"fullscreen 'none'\" is explicitly required to disable fullscreen for nested iframes\n    \"fullscreen 'none'\",\n    'geolocation',\n    'microphone'\n];\nconst VECTOR_IMG_KEY = 'vector';\nconst RASTER_IMG_KEY_REG_EXP = /^(\\d+)x(\\d+)$/i;\n\nconst LIFECYCLE_HOOK_KEYS = ['blur', 'stop', 'focus', 'bootstrap'].map(hook => `hooks.${hook}`);\nconst LIFECYCLE_KEYS = ['ephemeral', ...LIFECYCLE_HOOK_KEYS];\nconst INTERAPPTION_PROP_MAPPING_CONFIG = {\n    name: {\n        type: 'string',\n        destPath: 'name'\n    },\n    sandbox: {\n        destPath: 'properties.sandbox',\n        convert(valueIn) {\n            let typeIn = Ember.typeOf(valueIn);\n            if (typeIn === 'array') {\n                return valueIn.join(',');\n            } else if (typeIn === 'string') {\n                return valueIn;\n            } else {\n                throw new Error('invalidValue');\n            }\n        }\n    },\n    permissions: {\n        destPath: 'properties.permissions',\n        convert(valueIn) {\n            let typeIn = Ember.typeOf(valueIn);\n            if (typeIn === 'array') {\n                return valueIn.join(',');\n            } else if (typeIn === 'string') {\n                return valueIn;\n            } else {\n                throw new Error('invalidValue');\n            }\n        }\n    },\n    url: {\n        type: 'string',\n        destPath: 'properties.url'\n    },\n    lifecycle: {\n        destPath: 'advanced.lifecycle',\n        convert(lifecycleObj) {\n            if (Ember.typeOf(lifecycleObj) !== 'object') {\n                throw new Error('lifecycle must be an object if specified');\n            }\n\n            const result = {};\n            for (let key of LIFECYCLE_KEYS) {\n                const value = _.get(lifecycleObj, key);\n                const valueType = Ember.typeOf(value);\n\n                // Set boolean/Boolean values and ignore undefined (use default)\n                if (valueType === 'boolean') {\n                    _.set(result, key, value.valueOf());\n                } else if (valueType !== 'undefined') {\n                    throw new Error(`Expected ${key} to be boolean or undefined`);\n                }\n            }\n            return result;\n        }\n    },\n    subdomain: {\n        type: 'string',\n        destPath: 'properties.subdomain',\n        trustedOnly: true\n    },\n    path: {\n        type: 'string',\n        destPath: 'properties.path',\n        trustedOnly: true\n    },\n    query: {\n        type: 'string',\n        destPath: 'properties.query',\n        trustedOnly: true\n    }\n};\n\nAPP_ASSET_CATEGORIES.forEach(currCategory => {\n    INTERAPPTION_PROP_MAPPING_CONFIG[currCategory] = {\n        type: 'object',\n        destPath: `advanced.${currCategory}`\n    };\n});\n\nexport default Ember.Service.extend({\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n    stashLogger: Ember.inject.service('stash-logger'),\n    intl: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    ajax: Ember.inject.service(),\n    help: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    standaloneAppPool: null,\n    standaloneAppPoolVisible: false, // true when an app route is active\n    widgetAppPool: null,\n    externalUrlExemptIntegrationTypeIds: Ember.get(ENV, 'purecloud-apps.externalUrlExemptIntegrationTypeIds'),\n\n    // Exposed only for automation to test with smaller pool sizes.\n    // These can only be changed prior to loading any apps.\n    standaloneMaxActivePoolSize: Ember.get(ENV, 'purecloud-apps.maxActivePoolSize.standalone'),\n    widgetMaxActivePoolSize: Ember.get(ENV, 'purecloud-apps.maxActivePoolSize.widget'),\n\n    // Bypass all (client/server) app caching.  Should only be used internally (Testing/Automation)\n    _bypassAppCache: false,\n\n    // All globally available handlers (not pool or instance specific) will be injected by the instance initializer\n    globalApiHandlers: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set(\n            'standaloneAppPool',\n            AppPool.create(\n                {\n                    poolName: 'standaloneAppPool',\n                    getMaxActive: () => this.get('standaloneMaxActivePoolSize'),\n                    fetchAppsFn: this.get('_findAllStandaloneApps').bind(this),\n                    loadRetryBaseMillis: STANDALONE_LOAD_RETRY_BASE_MILLIS,\n                    loadRetryMaxBackoffMillis: STANDALONE_LOAD_RETRY_MAX_BACKOFF_MILLIS,\n                    reloadAppsIntervalMillis: STANDALONE_RELOAD_INTERVAL_MILLIS,\n                    reloadAppsRetryBaseMillis: STANDALONE_RELOAD_RETRY_BASE_MILLIS\n                },\n                Ember.getOwner(this).ownerInjection()\n            )\n        );\n        this.set(\n            'widgetAppPool',\n            AppPool.create(\n                {\n                    poolName: 'widgetAppPool',\n                    getMaxActive: () => this.get('widgetMaxActivePoolSize'),\n                    fetchAppsFn: this.get('_findAllWidgetApps').bind(this),\n                    loadRetryBaseMillis: WIDGET_LOAD_RETRY_BASE_MILLIS,\n                    loadRetryMaxBackoffMillis: WIDGET_LOAD_RETRY_MAX_BACKOFF_MILLIS,\n                    reloadAppsIntervalMillis: WIDGET_RELOAD_INTERVAL_MILLIS,\n                    reloadAppsRetryBaseMillis: WIDGET_RELOAD_RETRY_BASE_MILLIS\n                },\n                Ember.getOwner(this).ownerInjection()\n            )\n        );\n\n        // Listen to local PC-sourced app messages\n        let localMsgListener = Ember.run.bind(this, '_handleLocalMsg');\n        this.set('_localMsgListener', localMsgListener);\n        Ember.$(window).on('message onmessage', localMsgListener);\n    },\n\n    appsSupported: Ember.computed(function () {\n        /* globals Modernizr */\n        return !!(Modernizr && Modernizr.sandbox);\n    }),\n\n    /**\n     * Process the app api call from the app specified in app or appInstance\n     */\n    handleAppApiCall(apiCall, contextualApiHandlers) {\n        this._handleApiCall(apiCall, contextualApiHandlers);\n    },\n\n    /**\n     * Checks if an app instance (App) is trusted or not\n     * It's considered trusted if the App is an internal app (InternallyHostedApp)\n     * or if the app type is part of exempted external URLs.\n     *\n     * This should be used to check if an app can receive internal data or not.\n     *\n     * @param {App} appInstance The app instance\n     * @returns whether the app instance is considered trusted or not\n     */\n    isTrustedApp(appInstance) {\n        return (\n            appInstance instanceof InternallyHostedApp ||\n            this.get('externalUrlExemptIntegrationTypeIds').includes(appInstance.typeId)\n        );\n    },\n\n    /**\n     * Builds and validates Interapptions from the provided config.\n     *\n     * Config must conform to supported properties and the resulting app instance must be valid.\n     * Invalid config or the built app will log in addition to returning null.\n     *\n     * @param {string} typeId - The typeId of the interapption\n     * @param {string} id - The id of the interapption\n     * @param {Object} config - Interapption config\n     * @param {string} config.name - Interapption name\n     * @param {string|string[]} config.sandbox - Interapption sandbox (comma-separated string or array)\n     * @param {string|string[]} config.permissions - Interapption permissions (comma-separated string or array)\n     * @param {string} config.url - Interapption url. Only URL or path can be specified\n     * @param {Object} config.icon - URLs of assets for the icon class of images for this Interapption\n     * @param {Object} config.icon.vector - A URL to a vector icon asset\n     * @param {Object} config.icon.{width}x{height} - A URL to a raster icon asset of the size class indicated by the property\n     * @param {Object} config.monochromicIcon - URLs of assets for the monochrome icon class of images for this Interapption\n     * @param {Object} config.monochromicIcon.vector - A URL to a vector monochrome icon asset\n     * @param {Object} config.monochromicIcon.{width}x{height} - A URL to a raster monochrome icon asset of the size class indicated by the property\n     * @param {Object} config.lifecycle - Lifecycle config\n     * @param {boolean} config.lifecycle.ephemeral - Is app ephemeral\n     * @param {Object} config.lifecycle.hooks - Opt-in lifecycle hooks config\n     * @param {boolean} config.lifecycle.hooks.bootstrap - Should app receive bootstrap event\n     * @param {boolean} config.lifecycle.hooks.focus - Should app receive focus event\n     * @param {boolean} config.lifecycle.hooks.blur - Should app receive blur event\n     * @param {boolean} config.lifecycle.hooks.stop - Should app receive stop event\n     * @param {string} config.subdomain - A subdomain for an InternallyHostedApp (Trusted Only)\n     * @param {string} config.path - A Path for an InternallyHostedApp (Trusted Only)\n     * @param {string} config.query - A querystring for an InternallyHostedApp (Trusted Only)\n     * @param {boolean} trustedProvider - Indicates if this provider can generate trusted apps.\n     *  This should only be used for internal app providers that wish to register internal apps.\n     *  e.g. Altocloud, Relate, Scripter, etc.\n     *\n     * @returns an App or InternallyHostedApp instance if valid; null otherwise\n     */\n    buildValidInterapption(typeId, id, config, trustedProvider = false) {\n        // FUTURE: Support for i10n, full validation, etc. (See: ATEAM-152)\n        if (Ember.typeOf(typeId) !== 'string' || typeId.trim().length === 0) {\n            this.get('stashLogger').debug(\n                appUtils.buildInterapptionsLogMsg('Interapption is being ignored due to a missing/empty typeId.'),\n                {\n                    config,\n                    remoteData: {\n                        typeId,\n                        id,\n                        trustedProvider\n                    }\n                }\n            );\n\n            return null;\n        }\n\n        if (Ember.typeOf(id) !== 'string' || id.trim().length === 0) {\n            this.get('stashLogger').debug(\n                appUtils.buildInterapptionsLogMsg('Interapption is being ignored due to a missing/empty id.'),\n                {\n                    config,\n                    remoteData: {\n                        typeId,\n                        id,\n                        trustedProvider\n                    }\n                }\n            );\n\n            return null;\n        }\n\n        if (Ember.typeOf(config) !== 'object') {\n            this.get('stashLogger').debug(\n                appUtils.buildInterapptionsLogMsg(\n                    'Interapption is being ignored due to an invalid config object type.'\n                ),\n                {\n                    config,\n                    remoteData: {\n                        type: Ember.typeOf(config),\n                        typeId,\n                        id,\n                        trustedProvider\n                    }\n                }\n            );\n\n            return null;\n        }\n\n        let normalizedConfig = {\n            properties: {\n                displayType: APP_DISPLAY_TYPES.INTERAPPTION\n            },\n            advanced: {}\n        };\n\n        // Validate and map config properties to normalized config\n        let propError = null;\n\n        let configKeys = Object.keys(config);\n        for (let index = 0; index < configKeys.length; index++) {\n            let currKey = configKeys[index];\n            let currValue = config[currKey];\n            let currPropConfig = INTERAPPTION_PROP_MAPPING_CONFIG[currKey];\n\n            if (!currPropConfig) {\n                propError = `${currKey} is not a supported interapption property`;\n                break;\n            }\n\n            if (currPropConfig.convert) {\n                try {\n                    currValue = currPropConfig.convert(currValue);\n                } catch (e) {\n                    propError = `Failed to convert ${currKey} to a valid input`;\n                    break;\n                }\n            } else if (Ember.typeOf(currValue) !== currPropConfig.type) {\n                propError = `${currKey} should be of type ${currPropConfig.type}`;\n                break;\n            }\n\n            if (currPropConfig.trustedOnly && !trustedProvider) {\n                propError = `${currKey} is only allowed to be configured for trustedProviders`;\n                break;\n            }\n\n            Ember.set(normalizedConfig, currPropConfig.destPath, currValue);\n        }\n\n        if (\n            !propError &&\n            Object.prototype.hasOwnProperty.call(config, 'url') &&\n            (Object.prototype.hasOwnProperty.call(config, 'subdomain') ||\n                Object.prototype.hasOwnProperty.call(config, 'path') ||\n                Object.prototype.hasOwnProperty.call(config, 'query'))\n        ) {\n            propError = 'Cannot specify both a URL and any of subdomain, path, or query';\n        }\n\n        if (propError) {\n            this.get('stashLogger').error(\n                appUtils.buildInterapptionsLogMsg('Interapption is being ignored due to invalid config.'),\n                {\n                    config,\n                    details: propError,\n                    remoteData: {\n                        typeId,\n                        id,\n                        trustedProvider\n                    }\n                }\n            );\n\n            return null;\n        }\n\n        let result = this._buildApp(\n            typeId,\n            id,\n            normalizedConfig,\n            trustedProvider && Object.prototype.hasOwnProperty.call(config, 'path')\n        );\n\n        if (!this._isValidApp(result, 'Interapption')) {\n            return null;\n        }\n\n        return result;\n    },\n\n    /**\n     * Handles app postMessage events from the local frame to support app-like\n     * integrations.\n     */\n    _handleLocalMsg(evt) {\n        if (!evt.originalEvent.source || !this._isLocalMsg(evt.originalEvent.source)) {\n            // Not a valid internal app event\n            return;\n        }\n\n        let apiCall = null;\n\n        try {\n            // Strict parse\n            apiCall = parseMessage(evt.originalEvent.data, true);\n        } catch (parseError) {\n            // TECHDEBT: Remove lenient retry after deprecation period; will have to change logic to ensure only error cases are logged\n            if (parseError.message === 'missingProtocol') {\n                try {\n                    // Re-parse leniently to allow for short deprecation period and logging\n                    apiCall = parseMessage(evt.originalEvent.data, false);\n\n                    // Check the action to reduce deprecation log false positives further\n                    if (PROTOCOL_LENIENT_INTERNAL_ACTION_NAMES.indexOf(apiCall.action) >= 0) {\n                        this.get('stashLogger').info(\n                            appUtils.buildApiLogMsg(\n                                'Potential internal apps message posted message without protocol information.  This will be deprecated soon.'\n                            ),\n                            {\n                                apiCall,\n                                remoteData: {\n                                    internalPcCall: apiCall.get('internalPcCall'),\n                                    appId: apiCall.get('appId')\n                                }\n                            }\n                        );\n                    } else {\n                        // No protocol and either an unknown or not a legacy action.\n                        // Safe to assume this is not an apps message or is a new action type which should require the protocol\n                        apiCall = null;\n                    }\n                } catch (ignored) {\n                    // Not a client-apps message (e.g. no action field)\n                }\n            } else if (\n                parseError.message === 'missingAction' &&\n                typeof evt.originalEvent.data === 'object' &&\n                evt.originalEvent.data.protocol\n            ) {\n                // Apps Protocol and no action\n                this.get('stashLogger').error(\n                    appUtils.buildApiLogMsg('(Local) sent an apps message with no action.'),\n                    evt.originalEvent.data\n                );\n            } else {\n                // Not a client-apps message (e.g. invalid payload, unknown protocol, no action)\n            }\n        }\n\n        if (apiCall) {\n            apiCall.set('internalPcCall', true);\n            this._handleApiCall(apiCall);\n        }\n    },\n\n    _isLocalMsg(msgSource) {\n        return msgSource === window;\n    },\n\n    _handleApiCall(apiCall, contextualApiHandlers = []) {\n        if (!apiCall || (!apiCall.get('internalPcCall') && !apiCall.get('appId'))) {\n            // Not a valid app call\n            return;\n        }\n\n        let apiHandlers = contextualApiHandlers.concat(this.get('globalApiHandlers'));\n\n        let appId = apiCall.get('appId');\n        let apiActionDetails = apiCall.get('actionDetails');\n        let asyncHandlerPromise;\n\n        if (apiHandlers.length > 0) {\n            let availHandler = apiHandlers.find(currHandler => {\n                try {\n                    let result = currHandler.canHandle(apiCall);\n\n                    if (Ember.typeOf(result) === 'boolean') {\n                        return result;\n                    } else {\n                        this.get('stashLogger').error(\n                            appUtils.buildApiLogMsg('Handler returned a non-boolean result from canHandle')\n                        );\n                    }\n                } catch (e) {\n                    this.get('stashLogger').error(\n                        appUtils.buildApiLogMsg('Handler threw an Error when running canHandle'),\n                        e\n                    );\n                }\n\n                return false;\n            });\n            if (availHandler) {\n                try {\n                    asyncHandlerPromise = availHandler.handle(apiCall);\n                } catch (error) {\n                    asyncHandlerPromise = Ember.RSVP.reject(error);\n                }\n            } else {\n                asyncHandlerPromise = Ember.RSVP.reject('No handler exists for the specified call');\n            }\n        } else {\n            asyncHandlerPromise = Ember.RSVP.reject('No handler exists for the specified call');\n        }\n        asyncHandlerPromise\n            .then(() => {\n                this._instrumentApiCall(apiCall);\n            })\n            .catch(reason => {\n                this.get('stashLogger').error(\n                    appUtils.buildApiLogMsg(\n                        `${apiCall.get('internalPcCall') ? '(Local)' : 'App'} sent a message that could not be handled.`\n                    ),\n                    {\n                        apiActionDetails,\n                        msgFailureDetails: reason,\n                        remoteData: {\n                            appId,\n                            internalPcCall: apiCall.get('internalPcCall')\n                        }\n                    }\n                );\n            });\n    },\n\n    _instrumentApiCall(apiCall) {\n        if (!(apiCall instanceof ApiCall)) {\n            throw new Error('ApiCall instance must be provided');\n        }\n\n        // Redact any non-standard protocols/agents ... just in case\n        let pcAppProtocol = apiCall.get('protocol');\n        if (pcAppProtocol && pcAppProtocol !== APPS_API_PROTOCOL) {\n            pcAppProtocol = 'redactedProtocol';\n        }\n        let pcAppProtocolAgentName = apiCall.get('protocolAgentName');\n        let pcAppProtocolAgentVersion = apiCall.get('protocolAgentVersion');\n        if (pcAppProtocolAgentName && pcAppProtocolAgentName !== 'purecloud-client-app-sdk') {\n            pcAppProtocolAgentName = 'redactedProtocolAgentName';\n            pcAppProtocolAgentVersion = 'redactedProtocolAgentVersion';\n        }\n\n        // Note: Some details are not applicable in all cases.\n        // Providing the entire payload allows for easy filtering on the PageAction\n        this._addPageAction('clientAppApiCall', {\n            apiAction: apiCall.get('action'),\n            pcAppProtocol,\n            pcAppProtocolAgentName,\n            pcAppProtocolAgentVersion,\n\n            // App Details\n            internalPcCall: apiCall.get('internalPcCall'),\n            pcAppTypeId: apiCall.get('srcApp.typeId'),\n            pcAppId: apiCall.get('srcApp.id'),\n            pcAppDisplayType: apiCall.get('srcApp.displayType'),\n            pcAppInternallyHosted: apiCall.get('srcApp') instanceof InternallyHostedApp,\n            pcAppFeatureCategory: apiCall.get('srcApp.featureCategory'),\n\n            // AppInstance Details\n            pcAppInstanceId: apiCall.get('srcAppInstance.instanceId'),\n            pcAppProblemName: apiCall.get('srcAppInstance.problem.name'),\n\n            // Interapption Details\n            interactionId: apiCall.get('srcApp.interactionId')\n        });\n    },\n\n    _addPageAction() {\n        addPageAction(...arguments);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n\n        let localMsgListener = this.get('_localMsgListener');\n        if (localMsgListener) {\n            Ember.$(window).off('message onmessage', localMsgListener);\n            this.set('_localMsgListener', null);\n        }\n\n        // Clean up pools\n        [this.get('standaloneAppPool'), this.get('widgetAppPool')].forEach(currPool => {\n            if (currPool && !currPool.isDestroying && !currPool.isDestroyed) {\n                currPool.destroy();\n            }\n        });\n    },\n\n    _findAllStandaloneApps() {\n        return this._fetchAppsByType(APP_DISPLAY_TYPES.STANDALONE);\n    },\n\n    _findAllWidgetApps() {\n        return this._fetchAppsByType(APP_DISPLAY_TYPES.WIDGET);\n    },\n\n    findAllInterapptions() {\n        return this._fetchAppsByType(APP_DISPLAY_TYPES.INTERAPPTION);\n    },\n\n    _fetchAppsByType(type) {\n        return this._fetchAppsByTypeRemote(type);\n    },\n\n    /*\n     * Cache the list of apps for awhile reduce network traffic\n     * due to fetching multiple app types at boot and reload\n     */\n    _remoteAppPromise: null,\n    _remoteAppRequestTimestamp: null,\n    _fetchAppsByTypeRemote(type) {\n        let now = Date.now();\n        let allAppsPromise = this.get('_remoteAppPromise');\n        let lastRequestTs = this.get('_remoteAppRequestTimestamp');\n\n        if (\n            !allAppsPromise ||\n            this.get('_bypassAppCache') ||\n            (lastRequestTs && now - lastRequestTs > REMOTE_APPS_CACHE_TTL_MILLIS)\n        ) {\n            allAppsPromise = new Ember.RSVP.Promise((resolve, reject) => {\n                this._accumulateApps(\n                    apps => {\n                        if (apps && apps.length > 1) {\n                            apps.sort((app1, app2) => {\n                                return app1.get('name').localeCompare(app2.get('name'));\n                            });\n                        }\n\n                        resolve(apps);\n                    },\n                    reason => {\n                        // clear the instance's promise on falures so we dont cache failed requests\n                        this.set('_remoteAppPromise', null);\n                        reject(reason);\n                    },\n                    1,\n                    50,\n                    null\n                );\n            });\n            this.set('_remoteAppPromise', allAppsPromise);\n            this.set('_remoteAppRequestTimestamp', now);\n        }\n\n        return allAppsPromise.then(apps => {\n            return apps.filter(currApp => currApp.get('displayType') === type);\n        });\n    },\n\n    _accumulateApps(resolve, reject, pageNumber, pageSize, type, apps) {\n        if (typeof apps === 'undefined' || apps === null) {\n            apps = [];\n        }\n\n        let appsUrl = this.get('application').pcV2Uri(`${APPS_BASE_URL}`);\n        let queryParams = {\n            pageNumber,\n            pageSize\n        };\n        appsUrl += `?${Ember.$.param(queryParams, true)}`;\n\n        let headers = {};\n\n        const primaryLocale = this._getPrimaryLocale();\n        if (primaryLocale) {\n            headers['Accept-Language'] = primaryLocale;\n        }\n        if (this.get('_bypassAppCache')) {\n            headers['Cache-Control'] = 'no-cache';\n        }\n\n        this.get('ajax')\n            .request(appsUrl, {\n                headers\n            })\n            .then(result => {\n                if (!result) {\n                    reject('Invalid clientapps return value');\n                    return;\n                }\n\n                if (Array.isArray(result.entities)) {\n                    let validAppObjs = _.chain(result.entities)\n                        .filter(currIntegration => {\n                            return (\n                                currIntegration &&\n                                typeof currIntegration === 'object' &&\n                                Ember.typeOf(Ember.get(currIntegration, 'integrationType.id')) === 'string' &&\n                                !_.isEmpty(Ember.get(currIntegration, 'config.effective.properties'))\n                            );\n                        })\n                        .map(currIntegration => {\n                            let internallyHosted = this._isInternallyHostedApp(currIntegration.integrationType.id);\n                            return this._buildApp(\n                                currIntegration.integrationType.id,\n                                currIntegration.id,\n                                currIntegration.config.effective,\n                                internallyHosted\n                            );\n                        })\n                        .filter(currApp => {\n                            return (\n                                !!currApp &&\n                                this._isValidApp(\n                                    currApp,\n                                    currApp.get('displayType') === APP_DISPLAY_TYPES.INTERAPPTION\n                                        ? 'Interapption'\n                                        : undefined\n                                ) &&\n                                (!type || currApp.get('displayType') === type)\n                            );\n                        })\n                        .value();\n\n                    apps.push(...validAppObjs);\n                }\n\n                if (result.pageNumber < result.pageCount) {\n                    this._accumulateApps(resolve, reject, result.pageNumber + 1, pageSize, type, apps);\n                } else {\n                    resolve(apps);\n                }\n            })\n            .catch(reject);\n    },\n\n    _getPrimaryLocale() {\n        let isoLocale = this.get('intl.isoLocale');\n\n        if (Ember.typeOf(isoLocale) === 'string' && Ember.isPresent(isoLocale)) {\n            return isoLocale;\n        } else {\n            this.get('stashLogger').warn(appUtils.buildLogMsg('Unable to find current locale'), {\n                remoteData: {\n                    intlLocale: this.get('intl.locale'),\n                    intlIsoLocale: this.get('intl.isoLocale')\n                }\n            });\n            return null;\n        }\n    },\n\n    _buildApp(typeId, id, config, internallyHosted = false) {\n        let result = null;\n        let langTag = this._getPrimaryLocale();\n\n        // Common app props\n        let appProps = {\n            typeId,\n            id,\n            name: this._parseLangTagProp(config, 'advanced.i10n', langTag, 'name') || Ember.get(config, 'name'),\n            sandbox: this._parseMultiValueProp(config, 'properties.sandbox', ALLOWED_SANDBOX_VALUES),\n            displayType: this._parseProp(config, 'properties.displayType', _.values(APP_DISPLAY_TYPES)),\n            featureCategory: this._parseProp(config, 'properties.featureCategory', _.values(APP_FEATURE_CATEGORIES)),\n            permissionsPolicy: this._parseMultiValueProp(config, 'properties.permissions', ALLOWED_PERMISSION_VALUES),\n            enabledQueueIds: this._parseProp(config, 'properties.queueIdFilterList'),\n            lifecycle: Ember.get(config, 'advanced.lifecycle'),\n            assets: {},\n            // Set runtime state for internal model use\n            langTag: langTag || '',\n            envTld: this.get('application.envDetails.envTld') || '',\n            usePopupAuth: !!this.get('session').get('popoutAuthForIframes'),\n            ucIntegrationKey: this._parseProp(config, 'properties.ucIntegrationKey'), // UC Integration use\n            integrationPresenceSource: this._parseProp(config, 'properties.integrationPresenceSource'), // UC Integration use\n            pbxPermission: this._parseProp(config, 'properties.pbxPermission'), // UC Integration use\n            gcHostOrigin: netUtils.getCurrentWindowOrigin(),\n            gcTargetEnv: this.get('application.runtime.name')\n        };\n\n        // Only attempt to parse communicationTypeFilter when specifed to differentiate undefined/null from []\n        if (!Ember.isNone(Ember.get(config, 'properties.communicationTypeFilter'))) {\n            appProps.enabledCommunicationTypes = this._parseMultiValueProp(\n                config,\n                'properties.communicationTypeFilter',\n                [...INTERAPPTION_COMMUNICATION_TYPE_FILTERS, NO_SUPPORTED_COMMUNICATION_TYPE_FILTER]\n            );\n        }\n\n        if (!internallyHosted) {\n            appProps.urlTemplate = Ember.get(config, 'properties.url');\n            result = App.create(Ember.getOwner(this).ownerInjection(), appProps);\n        } else {\n            appProps.subdomain = Ember.get(config, 'properties.subdomain');\n            appProps.envDetails = this.get('application.envDetails');\n            appProps.path = Ember.get(config, 'properties.path');\n            appProps.query = Ember.get(config, 'properties.query');\n\n            result = InternallyHostedApp.create(Ember.getOwner(this).ownerInjection(), appProps);\n        }\n\n        // Extract assets for each supported asset category\n        APP_ASSET_CATEGORIES.forEach(currAssetCategory => {\n            let currAssetCategoryCfg = {};\n\n            const currVector = Ember.get(config, `advanced.${currAssetCategory}.${VECTOR_IMG_KEY}`);\n            if (currVector) {\n                currAssetCategoryCfg.vector = currVector;\n            }\n            const currRasters = this._extractRasterImgs(config, `advanced.${currAssetCategory}`);\n            if (Object.keys(currRasters).length > 0) {\n                currAssetCategoryCfg.raster = currRasters;\n            }\n\n            const icon = Ember.get(config, `advanced.${currAssetCategory}`);\n            if (icon && icon.guxIcon) {\n                currAssetCategoryCfg.guxIcon = icon.guxIcon;\n            }\n\n            if (Object.keys(currAssetCategoryCfg).length > 0) {\n                result.set(`assets.${currAssetCategory}`, currAssetCategoryCfg);\n            } else if (config) {\n                const advanced = Ember.get(config, `advanced`);\n                if (advanced) {\n                    const assetCategory = Ember.get(advanced, currAssetCategory);\n                    if (assetCategory) {\n                        const classNames = Ember.get(assetCategory, 'classNames');\n                        if (classNames) {\n                            const assets = Ember.get(result, 'assets');\n                            if (!Ember.get(assets, currAssetCategory)) {\n                                Ember.set(assets, currAssetCategory, { classNames });\n                            } else {\n                                Ember.set(assets, `${currAssetCategory}.classNames`, classNames);\n                            }\n                        }\n                    }\n                }\n            }\n        });\n\n        return result;\n    },\n\n    /**\n     * Extract all images of pattern digit(s)xdigit(s) from the basePath\n     */\n    _extractRasterImgs(config, basePath) {\n        let result = {};\n\n        let imgs = Ember.get(config, basePath);\n\n        if (imgs && typeof imgs === 'object') {\n            for (let currImgKey in imgs) {\n                if (currImgKey !== VECTOR_IMG_KEY) {\n                    let parseResult = RASTER_IMG_KEY_REG_EXP.exec(currImgKey);\n                    if (parseResult && parseResult[1] === parseResult[2]) {\n                        result[`x${parseResult[1]}`] = imgs[currImgKey];\n                    }\n                }\n            }\n        }\n\n        return result;\n    },\n\n    _isValidApp(app, appType = 'App') {\n        try {\n            this._validateApp(app);\n\n            return true;\n        } catch (e) {\n            let logMessageAppType = appType === 'App' ? 'App' : 'Interapption';\n            let logLevel;\n            let logMessage;\n\n            switch (e.message) {\n                case 'invalidTypeId':\n                case 'invalidId':\n                case 'invalidName':\n                case 'invalidDisplayType':\n                    logLevel = 'debug';\n                    logMessage = `${logMessageAppType} is being ignored due to a missing typeId, id, name, or displayType.`;\n                    break;\n                case 'invalidPath':\n                    logLevel = 'info';\n                    logMessage = `Internally Hosted ${logMessageAppType} is being ignored due to a missing/invalid path.`;\n                    break;\n                case 'invalidSubdomain':\n                    logLevel = 'info';\n                    logMessage = `Internally Hosted ${logMessageAppType} is being ignored due to an emptystring/invalid subdomain.`;\n                    break;\n                case 'invalidQuery':\n                    logLevel = 'info';\n                    logMessage = `Internally Hosted ${logMessageAppType} is being ignored due to an invalid query type.`;\n                    break;\n                case 'missingUrl':\n                    logLevel = 'debug';\n                    logMessage = `${logMessageAppType} is being ignored due to a missing url.`;\n                    break;\n                case 'invalidUrlProtocol':\n                    logLevel = 'error';\n                    logMessage = `${logMessageAppType} is being ignored due to an invalid protocol.`;\n                    break;\n                case 'reservedPureCloudDomain':\n                    logLevel = 'error';\n                    logMessage = `${logMessageAppType} is being ignored due to use of a PC reserved domain.`;\n                    break;\n                case 'malformedUrl':\n                    logLevel = 'error';\n                    logMessage = `${logMessageAppType} is being ignored due to an unparsable URL.`;\n                    break;\n                case 'unexpectedInterapptionProperty':\n                    logLevel = 'error';\n                    logMessage = `${logMessageAppType} is being ignored due to an unexpected Interaction Widget property.`;\n                    break;\n                default:\n                    logLevel = 'error';\n                    logMessage = `${logMessageAppType} is being ignored`;\n                    break;\n            }\n\n            let fullLogMsg = null;\n            if (appType === 'Interapption') {\n                fullLogMsg = appUtils.buildInterapptionsLogMsg(logMessage);\n            } else {\n                fullLogMsg = appUtils.buildLogMsg(logMessage);\n            }\n\n            this.get(`stashLogger.${logLevel}`)(fullLogMsg, {\n                appUrl: app.get('url'),\n                remoteData: { appId: app.get('id') }\n            });\n\n            return false;\n        }\n    },\n\n    _validateApp(app) {\n        if (Ember.typeOf(app.typeId) !== 'string' || app.typeId.trim().length === 0) {\n            throw new Error('invalidTypeId');\n        }\n\n        if (Ember.typeOf(app.id) !== 'string' || app.id.trim().length === 0) {\n            throw new Error('invalidId');\n        }\n\n        if (Ember.typeOf(app.name) !== 'string' || app.name.trim().length === 0) {\n            throw new Error('invalidName');\n        }\n\n        if (Ember.typeOf(app.displayType) !== 'string' || app.displayType.trim().length === 0) {\n            throw new Error('invalidDisplayType');\n        }\n\n        if (app instanceof InternallyHostedApp) {\n            let internalAppPath = app.get('path');\n            if (Ember.typeOf(internalAppPath) !== 'string' || Ember.isBlank(internalAppPath)) {\n                throw new Error('invalidPath');\n            }\n\n            // subdomain can be null, undefined, or non-empty String\n            let internalAppSubdomain = app.get('subdomain');\n            let subdomainType = Ember.typeOf(internalAppSubdomain);\n            if (\n                !(\n                    subdomainType === 'null' ||\n                    subdomainType === 'undefined' ||\n                    (subdomainType === 'string' && internalAppSubdomain.trim().length > 0)\n                )\n            ) {\n                throw new Error('invalidSubdomain');\n            }\n\n            // query can be null, undefined, or a string (blank allowed)\n            let internalAppQuery = app.get('query');\n            if (['null', 'undefined', 'string'].indexOf(Ember.typeOf(internalAppQuery)) < 0) {\n                throw new Error('invalidQuery');\n            }\n        }\n\n        if (Ember.isBlank(app.get('url'))) {\n            throw new Error('missingUrl');\n        }\n\n        // Enforce app URL protocol of http/https (http should primarily be used for development)\n        if (APP_PROTOCOL_CHECK_REG_EXG.exec(app.get('url')) === null) {\n            throw new Error('invalidUrlProtocol');\n        }\n\n        let externalUrl = null;\n        try {\n            // IMPORTANT: In addition to checking internal/external, this checks the validity of the url.  It must be run regardless of app type\n            externalUrl = netUtils.isExternalDomain(app.get('url'));\n        } catch (invalidUrl) {\n            throw new Error('malformedUrl');\n        }\n\n        if (\n            !externalUrl &&\n            !(app instanceof InternallyHostedApp) &&\n            this.get('externalUrlExemptIntegrationTypeIds').indexOf(app.get('typeId')) < 0\n        ) {\n            // Disallow internal URLs on external apps due to sandbox concerns\n            throw new Error('reservedPureCloudDomain');\n        }\n\n        // Interapptions validation\n        if (app.displayType !== APP_DISPLAY_TYPES.INTERAPPTION) {\n            ['interactionId', 'interactionType', 'enabledQueueIds', 'enabledCommunicationTypes'].forEach(currKey => {\n                if (app.get(currKey) !== undefined && app.get(currKey) !== null) {\n                    throw new Error('unexpectedInterapptionProperty');\n                }\n            });\n        }\n\n        return true;\n    },\n\n    _isInternallyHostedApp(integrationTypeId) {\n        return Ember.get(ENV, 'purecloud-apps.internallyHostedIntegrationTypeIds').indexOf(integrationTypeId) >= 0;\n    },\n\n    _parseProp(obj, prop, validItems = null) {\n        let propVal = Ember.get(obj, prop);\n        if (propVal && (validItems === null || validItems.indexOf(propVal) >= 0)) {\n            return propVal;\n        }\n    },\n\n    _parseBooleanProp(obj, prop) {\n        let propVal = Ember.get(obj, prop);\n        if (typeof propVal === 'boolean') {\n            return propVal;\n        }\n        return undefined;\n    },\n\n    _parseMultiValueProp(obj, prop, validItems = null, separator = ',') {\n        let result = [];\n\n        let propVal = Ember.get(obj, prop);\n        if (propVal) {\n            result = propVal.split(separator).reduce((validatedItems, curr) => {\n                if (curr) {\n                    let toCheck = curr.trim();\n\n                    if (toCheck.length > 0 && (validItems === null || validItems.indexOf(toCheck) >= 0)) {\n                        validatedItems.push(toCheck);\n                    }\n                }\n\n                return validatedItems;\n            }, []);\n        }\n\n        return result;\n    },\n\n    // Storage for previous langTag regexp instances\n    _langTagRegExps: {},\n\n    /**\n     * Leniently locate a langTag-specific property within the specified object and baseProp. The\n     * provided langTag will searched in a padding space and case insensitive manor.\n     *\n     * @param {Object} obj - The base object to search\n     * @param {String} baseProp - single or dot-separated list of hierarchical props identifying the base object to search\n     * @param {String} langTag - the bcp47 langTag to search for within obj[baseProp]\n     * @param {String} langTagRelProp - single or dot-separated list of hierarchical props identifying the langTag-relative property to return\n     *\n     * @returns the value of the prop if it is found for the current locale; undefined otherwise.\n     */\n    _parseLangTagProp(obj, baseProp, langTag, langTagRelProp) {\n        if (Ember.typeOf(langTag) !== 'string' || !langTag.trim()) {\n            // Log and return undefined as this is an internal method. No need to throw and handle outside\n            this.get('stashLogger').warn(\n                appUtils.buildLogMsg('Missing/Invalid langTag provided to parse langTag specific prop', {\n                    remoteData: {\n                        langTag\n                    }\n                })\n            );\n\n            return undefined;\n        }\n\n        let result = Ember.get(obj, `${baseProp}.${langTag}.${langTagRelProp}`);\n\n        if (typeof result === 'undefined') {\n            // Check for lenient langTags\n            let baseObj = Ember.get(obj, baseProp);\n            if (baseObj) {\n                let lenientLangTag = langTag.trim().toLowerCase();\n                let langTagRegExp = this._langTagRegExps[lenientLangTag];\n                if (!langTagRegExp) {\n                    langTagRegExp = new RegExp(`^\\\\s*${lenientLangTag}\\\\s*$`, 'i');\n                    this._langTagRegExps[lenientLangTag] = langTagRegExp;\n                }\n\n                let langKey = Object.keys(baseObj).find(key => {\n                    return langTagRegExp.test(key);\n                });\n\n                if (Ember.typeOf(langKey) === 'string') {\n                    result = Ember.get(baseObj, `${langKey}.${langTagRelProp}`);\n                }\n            }\n        }\n\n        return result;\n    }\n});\n","define(\"connections-ui/services/asset-loader\", [\"exports\", \"ember-asset-loader/services/asset-loader\"], function (_exports, _assetLoader) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _assetLoader.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { FL } from '../utils/entity-fields';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport { getEntityObjectId, isDirectoryId } from 'ember-purecloud-components/utils/jid-helpers';\n\nconst { RSVP } = Ember;\n\nfunction isGuid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nexport function isJid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/(?!.*\\/).*@.*$/i);\n}\n\nexport default Ember.Service.extend(LoggerMixin, {\n    store: Ember.inject.service(),\n    peopleQueue: {},\n    groupQueue: {},\n\n    getUser(id) {\n        return new RSVP.Promise(resolve => {\n            this.checkCacheForEntity(id, 'person', resolve);\n        });\n    },\n\n    refreshUser(id) {\n        return new RSVP.Promise(resolve => {\n            this.queueEntity('person', id, resolve);\n        });\n    },\n\n    getChatUser(jid) {\n        return new RSVP.Promise(resolve => {\n            this.checkCacheForEntity(jid, 'person', resolve);\n        });\n    },\n\n    getGroup(jid) {\n        return new RSVP.Promise(resolve => {\n            this.checkCacheForEntity(jid, 'group', resolve);\n        });\n    },\n\n    checkCacheForEntity(objectId, entityType, resolve) {\n        let cachedModel = this.get('store').peekRecord(entityType, objectId);\n        if (cachedModel) {\n            return resolve(cachedModel);\n        }\n        if (objectId.indexOf('@') > -1) {\n            const possibleCache = this.get('store').peekAll(entityType);\n            if (possibleCache) {\n                cachedModel = possibleCache.findBy('jid', objectId);\n            }\n        }\n        if (cachedModel) {\n            return resolve(cachedModel);\n        }\n        this.queueEntity(entityType, objectId, resolve);\n    },\n\n    queueEntity(entityType, entityId, resolve) {\n        let possibleJid = entityId;\n        if (isJid(entityId)) {\n            entityId = getEntityObjectId(entityId);\n        }\n\n        if (!isGuid(entityId) && !isDirectoryId(entityId) && !isDirectoryId(getEntityObjectId(entityId))) {\n            const placeholder = this.get('store').push({\n                data: {\n                    type: entityType,\n                    id: entityId,\n                    _id: entityId,\n                    general: {\n                        name: [\n                            {\n                                labelKey: 'name',\n                                value: entityId\n                            }\n                        ]\n                    }\n                }\n            });\n            return resolve(placeholder);\n        }\n\n        let queue = {};\n        switch (entityType) {\n            case 'person':\n                queue = this.get('peopleQueue');\n                break;\n            case 'group':\n                queue = this.get('groupQueue');\n                break;\n        }\n        if (queue[possibleJid] == null) {\n            queue[possibleJid] = [];\n        }\n        queue[possibleJid].push(resolve);\n        this.scheduleQueues();\n    },\n\n    scheduleQueues() {\n        Ember.run.debounce(this, this._scheduleQueues, 500);\n    },\n\n    _scheduleQueues() {\n        Ember.run.once(this, this._handleQueues);\n    },\n\n    _handleQueues() {\n        if (!(this.isDestroyed || this.isDestroying)) {\n            const people = this.clearQueue('peopleQueue');\n            const groups = this.clearQueue('groupQueue');\n\n            if (!_.isEmpty(people)) {\n                this.processQueue('person', people);\n            }\n            if (!_.isEmpty(groups)) {\n                this.processQueue('group', groups);\n            }\n        }\n    },\n\n    clearQueue(queue) {\n        const value = this.get(queue);\n        this.set(queue, {});\n        return value;\n    },\n\n    processQueue(entityType, queue) {\n        const ids = _.keys(queue);\n        this.logger.debug('BATCH: Processing queue', entityType, ids.length);\n\n        return this.get('store')\n            .findMany(entityType, ids, FL[entityType])\n            .then(results => {\n                return this.resolveResults(entityType, queue, results);\n            })\n            .catch(err => {\n                this.logger.error('BATCH: Failed to fetch entities in bulk:', {\n                    entityType,\n                    ids: ids.length < 25 ? ids.join(',') : ids.length,\n                    err\n                });\n                return this.resolveResults(entityType, queue, []);\n            });\n    },\n\n    resolveResults(entityType, queue, results) {\n        const ids = Object.keys(queue);\n\n        _.forEach(results, entity => {\n            // entities are requested/queued by jid, id (guid) or id (_id, mongoid)\n            ['id', 'jid', '_id'].forEach(id => {\n                const entityId = entity.get(id);\n                const promises = queue[entityId];\n                if (promises) {\n                    promises.forEach(resolve => resolve(entity));\n                }\n                _.remove(ids, id => id === entityId);\n            });\n        });\n\n        if (ids.length > 0) {\n            const missingIds = ids.length < 100 ? ids.join(',') : ids.length;\n            this.logger.info(\n                'BATCH: Queue had remaining items not resolved, resolving with placeholder for single request:',\n                {\n                    entityType,\n                    missingIds\n                }\n            );\n            _.forEach(ids, id => {\n                const keyId = id;\n                if (isJid(id)) {\n                    id = getEntityObjectId(id);\n                }\n                const placeholder = this.get('store').push({\n                    data: {\n                        type: entityType,\n                        id: id,\n                        _id: id,\n                        general: {\n                            name: [\n                                {\n                                    labelKey: 'name',\n                                    value: id\n                                }\n                            ]\n                        }\n                    }\n                });\n\n                _.forEach(queue[keyId], resolve => resolve(placeholder));\n            });\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport CacheChatRoomsMixin from '../mixins/cache-chat-rooms';\nimport ChatMessage from '../models/chat-message';\nimport ChatRoom from '../models/chat-room';\nimport ChatEvents from '../mixins/chat-service/chat-events';\nimport BatchDataRequests from '../mixins/batch-data-requests';\nimport MessageNotificationsMixin from '../mixins/chat-service/message-notifications';\nimport moment from '../utils/dates';\nimport timeoutPromise from '../utils/timeout-promise';\nimport { markdownToHtml } from '../utils/markdown';\nimport MessageSplitting from '../mixins/chat-service/message-splitting';\nimport {\n    compareJids,\n    getEntityObjectId,\n    isRoomJid,\n    isSupervisorJid,\n    isAcdJid\n} from 'ember-purecloud-components/utils/jid-helpers';\nimport { task, timeout } from 'ember-concurrency';\nimport uuid from 'uuid';\n\nconst Promise = Ember.RSVP.Promise;\nconst respondingTimeout = {};\nconst preferencePaths = {\n    interactionNotificationVolume: 'chat.interactionNotificationVolume',\n    chatNotificationVolume: 'chat.chatNotificationVolume'\n};\n\nconst mixins = [\n    Ember.Evented,\n    ChatEvents,\n    BatchDataRequests,\n    CacheChatRoomsMixin,\n    MessageNotificationsMixin,\n    MessageSplitting\n];\n\nexport const supportedChatWidgets = [\n    'jira',\n    'salesforce',\n    'pagerduty',\n    'videoNotification' // New stanza returned when using useVoltVideoMessages\n];\n\nexport default Ember.Service.extend(...mixins, {\n    batchDataRequests: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    // timeline: Ember.inject.service(),\n    preferences: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    application: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    store: Ember.inject.service(),\n    settings: Ember.inject.service(),\n    favorites: Ember.inject.service(),\n\n    applicationController: null,\n\n    widgets: supportedChatWidgets,\n    firstRoomChosen: false,\n    responding: {},\n    popoutRoom: null,\n    activeRoom: null,\n    activeEmpty: null,\n    messagesPerHistoryRequest: 25,\n    maxHistoryRequestSize: 100,\n\n    dashboardRooms: [],\n    mutedRooms: [],\n    roomHistoryStack: [],\n    replyMessage: null,\n\n    collabChatShowChatSplat: false,\n\n    // clean up after chat decomp goes GA\n    useChatBetaCleanUp: true,\n\n    canCorrectMessages: Ember.computed.reads('connected'),\n\n    initializePreferences: Ember.on('init', function () {\n        let preferences = this.get('preferences');\n\n        preferences\n            .getPreference('chat.mutedRooms')\n            .then((mutedRoomsValue = '[]') => {\n                if (this.isDestroyed) {\n                    return;\n                }\n                const mutedRooms = JSON.parse(mutedRoomsValue);\n                if (mutedRooms && !this.isDestroyed) {\n                    this.set('mutedRooms', mutedRooms);\n                }\n            })\n            .catch(e =>\n                Ember.Logger.error('Error getting preference (mutedRooms):', {\n                    error: e,\n                    remoteData: {\n                        preference: 'mutedRooms'\n                    }\n                })\n            );\n\n        preferences\n            .getPreference('chat.roomHistoryStack')\n            .then((roomHistoryStackValue = '[]') => {\n                if (this.isDestroyed) {\n                    return;\n                }\n                const roomHistoryStack = JSON.parse(roomHistoryStackValue);\n                if (roomHistoryStack && !this.isDestroyed) {\n                    this.set('roomHistoryStack', roomHistoryStack);\n                }\n            })\n            .catch(e =>\n                Ember.Logger.error('Error getting preference:', {\n                    error: e,\n                    remoteData: {\n                        preference: 'roomHistoryStack'\n                    }\n                })\n            );\n    }),\n\n    isEditing: Ember.computed('activeRoom.messages.@each.isEditing', function () {\n        if (!this.get('activeRoom')) {\n            return false;\n        }\n\n        let messages = this.get('activeRoom.messages');\n        if (!messages) {\n            return false;\n        }\n\n        return !_.isEmpty(messages.filterBy('isEditing'));\n    }),\n\n    _chatNotificationVolume: 50,\n    chatNotificationVolume: Ember.computed('_chatNotificationVolume', {\n        get: function () {\n            return this.get('_chatNotificationVolume');\n        },\n        set: function (key, val) {\n            this.get('preferences').setPreference(preferencePaths.chatNotificationVolume, val);\n            this.set('_chatNotificationVolume', val);\n            return val;\n        }\n    }),\n\n    _interactionNotificationVolume: 50,\n    interactionNotificationVolume: Ember.computed('_interactionNotificationVolume', {\n        get: function () {\n            return this.get('_interactionNotificationVolume');\n        },\n        set: function (key, val) {\n            this.get('preferences').setPreference(preferencePaths.interactionNotificationVolume, val);\n            this.set('_interactionNotificationVolume', val);\n            return val;\n        }\n    }),\n\n    allowUserRemoval: false,\n\n    init() {\n        this._super(...arguments);\n        this._initNotificationVolumes();\n        this._setupRateLimitListener();\n        this._startWatchVideoParticipantCount();\n    },\n\n    _startWatchVideoParticipantCount() {},\n\n    _initNotificationVolumes: function () {\n        Ember.run.next(() => {\n            const preferences = this.get('preferences');\n            if (!preferences) {\n                return;\n            }\n\n            preferences.getPreference(preferencePaths.chatNotificationVolume).then(val => {\n                if (val) {\n                    this.set('_chatNotificationVolume', val);\n                }\n            });\n\n            preferences.getPreference(preferencePaths.interactionNotificationVolume).then(val => {\n                if (val) {\n                    this.set('_interactionNotificationVolume', val);\n                }\n            });\n        });\n    },\n\n    setMessageReply(message) {\n        this.set('replyMessage', message);\n    },\n\n    _setupRateLimitListener() {\n        this.get('ajax').on('rateLimited', this, this._handleRateLimit);\n    },\n\n    _handleRateLimit(data) {\n        if (data && data.url && data.options) {\n            try {\n                let url = new URL(data.url);\n                let options = data.options;\n                let requestingJids = options.data && options.data.jid && options.data.jid.length > 0;\n                if (url.pathname.indexOf('users') > -1 && requestingJids) {\n                    // We are loading up jids for chat and got rate limited. Let's notify the user.\n                    Ember.run.debounce(this, this._notifyRosterRateLimit, 500);\n                }\n            } catch (error) {\n                // Ignore error\n            }\n        }\n    },\n\n    _notifyRosterRateLimit() {\n        let title = this.get('intl').t('chat.roster.errors.rateLimit.title').toString();\n        let message = this.get('intl').t('chat.roster.errors.rateLimit.message').toString();\n        this.get('notification').info(title, message, {\n            tag: 'chat-rate-limit',\n            hideAfter: 20\n        });\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        _.forEach(respondingTimeout, value => {\n            Ember.run.cancel(value);\n        });\n\n        this.get('ajax').off('rateLimited', this, this._handleRateLimit);\n    },\n\n    saveMutedRooms: Ember.observer('mutedRooms.[]', function () {\n        this.get('preferences').setPreference('chat.mutedRooms', JSON.stringify(this.get('mutedRooms')));\n    }),\n\n    saveRoomHistoryStack: Ember.observer('roomHistoryStack.[]', function () {\n        this.get('preferences').setPreference('chat.roomHistoryStack', JSON.stringify(this.get('roomHistoryStack')));\n    }),\n\n    addResponder(room, person) {\n        var responding, respondingTimeoutId;\n        if (!person.get('name') && isAcdJid(room)) {\n            person.set('name', this.get('intl').t('purecloud.acdInteraction.chats.customerName'));\n        }\n        if (person.get('id') !== this.get('session.person.id')) {\n            responding = this.get('responding');\n            if (!Object.prototype.hasOwnProperty.call(responding, room)) {\n                responding[room] = Ember.A();\n            }\n            responding[room].addObject(person.get('name'));\n            respondingTimeoutId = room + '-' + person.get('id');\n            Ember.run.cancel(respondingTimeout[respondingTimeoutId]);\n            respondingTimeout[respondingTimeoutId] = Ember.run.later(\n                this,\n                function () {\n                    return this.removeResponder(room, person.get('name'), person.get('jid'));\n                },\n                20000\n            );\n            return this.notifyPropertyChange('responding');\n        }\n    },\n\n    removeResponder(room, person, from) {\n        if (!_.isEmpty(this.get('responding')[room])) {\n            this.get('responding')[room].removeObject(person);\n            this.notifyPropertyChange('responding');\n        }\n        if (!_.isEmpty(this.get('responding')[from])) {\n            this.get('responding')[from].removeObject(person);\n            this.notifyPropertyChange('responding');\n        }\n    },\n\n    sendChatState(jid, state) {\n        return this.getChatRoom(jid).then(room => {\n            if (room.get('participants.length') < 2) {\n                return false;\n            }\n            return this.get('streaming.connection') && this.get('streaming.connection').sendChatState(jid, state);\n        });\n    },\n\n    toggleRoomMuted(roomJid) {\n        return this.getChatRoom(roomJid).then(room => {\n            let mutedRooms = this.get('mutedRooms');\n            if (this.roomMuted(roomJid)) {\n                mutedRooms.removeObject(roomJid);\n                return room.set('muted', false);\n            } else {\n                mutedRooms.pushObject(roomJid);\n                return room.set('muted', true);\n            }\n        });\n    },\n\n    setRoomMuted(roomJid, muted) {\n        return this.getChatRoom(roomJid).then(room => {\n            let mutedRooms = this.get('mutedRooms');\n            if (!muted) {\n                mutedRooms.removeObject(roomJid);\n                return room.set('muted', false);\n            } else {\n                mutedRooms.pushObject(roomJid);\n                return room.set('muted', true);\n            }\n        });\n    },\n\n    roomMuted(roomJid) {\n        var mutedRooms;\n        mutedRooms = this.get('mutedRooms');\n        return roomJid && mutedRooms && mutedRooms.any(jid => jid === roomJid);\n    },\n\n    getRecents() {\n        return new Promise(function (resolve, reject) {\n            this.get('streaming.connection').getRecents(function (error, recents) {\n                if (error) {\n                    reject(error);\n                } else {\n                    resolve(recents);\n                }\n            });\n        });\n    },\n\n    clearRoomUnreadMessages(room) {\n        return room.clearUnreadMessages();\n    },\n\n    addRoomToDashboard(room) {\n        return this.get('dashboardRooms').addObject(room);\n    },\n\n    messageFailedToSend(room, time) {\n        room.get('messages').forEach(function (message) {\n            if (message.id === null && message.time._d.toString() === time._d.toString()) {\n                message.setProperties({\n                    sendError: true,\n                    pending: false\n                });\n            }\n        });\n    },\n\n    sendMessageProxy(jid, room, message, options) {\n        if (message.length > 4000) {\n            let messageQueue = this._splitOverSizedMessage(message);\n            messageQueue = this._convertSplitMessagesToWidgets(room, messageQueue);\n            return this.sendSplitMessageQueue(room, messageQueue);\n        } else {\n            return this.sendMessageToRoom(jid, message, options);\n        }\n    },\n\n    sendMessageToRoom(jid, text, options) {\n        return new Promise((resolve, reject) => {\n            if (!jid || (text && text.length <= 0 && !options)) {\n                Ember.Logger.error(`JID and not-empty message required to send message ${jid}, ${text}`);\n                reject('send failure');\n            }\n\n            this.get('streaming.connection').setActive(jid);\n\n            this.getChatRoom(jid).then(room => {\n                let id, timeoutIdentifier;\n                this.clearRoomUnreadMessages(room);\n\n                const sendCallback = (error, message) => {\n                    Ember.run.cancel(timeoutIdentifier);\n                    if (error) {\n                        Ember.Logger.error('Error in message send', {\n                            jid,\n                            error\n                        });\n                        reject(id);\n                    } else {\n                        if (message.oid) {\n                            room.clearPending(message);\n                        }\n                        resolve(null);\n                    }\n                };\n\n                timeoutIdentifier = Ember.run.later(this, sendCallback, 'timeout-error', null, 25000);\n\n                if (options) {\n                    id = this.get('streaming.connection').sendMessage(options, sendCallback);\n                } else {\n                    id = this.get('streaming.connection').sendMessage(jid, text, sendCallback);\n                }\n            });\n        });\n    },\n\n    sendVideoProviderNotification(room, provider) {\n        if (room && !room.get('isAcdRoom')) {\n            let to = room.get('jid');\n            let body = provider.get('notification');\n            let data = provider.get('data') || {};\n\n            if (!body) {\n                return;\n            }\n\n            let stanza = {\n                name: `${provider.get('id')}-notification`,\n                contents: JSON.stringify(data)\n            };\n            let children = [stanza];\n            let options = { to, body, children };\n            this.get('streaming.connection').sendMessage(options, (error, message) => {\n                room.clearPending(message);\n            });\n        }\n    },\n\n    removeAttachment(fileDescriptor) {\n        let keys = Object.keys(fileDescriptor);\n        if (!keys.length) {\n            return Promise.resolve();\n        } else {\n            let url = fileDescriptor[keys[0]];\n            let request = this.get('ajax').del(url, { dataType: '' });\n            return Promise.cast(request);\n        }\n    },\n\n    joinScreenShareRoomViaHawk(roomJid, rejoiningRoom = false) {\n        if (!isRoomJid(roomJid)) {\n            roomJid = `${roomJid}@conference.${this.get('session.org.shortName')}.orgspan.com`;\n        }\n        return timeoutPromise(\n            new Promise(resolve => {\n                this.getChatRoom(roomJid).then(room => {\n                    room.set('joinError', null);\n                    room.set('activated', true);\n                    if (!rejoiningRoom) {\n                        room.set('lastMessageTime', moment());\n                    }\n                    resolve(room);\n                });\n            }),\n            8000,\n            `chat#joinRoomViaHawk: ${roomJid}`\n        );\n    },\n\n    checkJid(roomJid) {\n        if (!roomJid) {\n            return `adhoc-${uuid.v4()}`;\n        }\n        if (!isRoomJid(roomJid)) {\n            return `${roomJid}@conference.${this.get('session.org.shortName')}.orgspan.com`;\n        }\n        return roomJid;\n    },\n\n    joinRoom(roomJid, rejoiningRoom = false) {\n        if (!roomJid) {\n            roomJid = `adhoc-${uuid.v4()}`;\n        }\n        if (!isRoomJid(roomJid)) {\n            roomJid = `${roomJid}@conference.${this.get('session.org.shortName')}.orgspan.com`;\n        }\n        return timeoutPromise(\n            new Promise(resolve => {\n                this.getChatRoom(roomJid).then(room => {\n                    this.get('streaming.connection').joinRoom(roomJid, err => {\n                        if (err) {\n                            room.set('joinError', err);\n                        } else {\n                            room.set('joinError', null);\n                            room.set('activated', true);\n                            room.loadDeferredParticipants();\n                        }\n\n                        this.get('streaming.connection').setActive(roomJid);\n                        if (!rejoiningRoom) {\n                            room.set('lastMessageTime', moment());\n                        }\n                        resolve(room);\n                    });\n                });\n            }),\n            8000,\n            `chat#joinRoom: ${roomJid}`\n        );\n    },\n\n    /**\n     * Used to do local updates when a room is joined. The actual work to join a room via\n     * realtime has been moved to collaborate-chat.\n     */\n    joinRoomEvent(room, err, rejoiningRoom = false) {\n        if (err) {\n            room.set('joinError', err);\n        } else {\n            room.set('joinError', null);\n            room.set('activated', true);\n            room.loadDeferredParticipants();\n        }\n        if (!rejoiningRoom) {\n            room.set('lastMessageTime', moment());\n        }\n        return room;\n    },\n\n    syncPendingRoomWithStreamingService(room) {\n        return new Promise(resolve => {\n            this.addRoomToCache(room);\n            const participants = room.get('participants');\n            //room.set('participants', []);\n            this.joinRoom(room.jid).then(room => {\n                this.changeActiveRoom(room);\n                room.set('pendingRoom', false);\n                room.set('showingVideo', true);\n                participants.forEach(person => {\n                    this.inviteToRoom(room, person);\n                });\n                resolve(room);\n            });\n        });\n    },\n\n    joinAcdRoom(roomJid) {\n        // ACD room jids from conversation service are in the form\n        // `{id}@conference.{orgId}.orgspan.com`\n        // but we should use the form\n        // `{id}@conference.{orgShortName}.orgspan.com`\n        const roomId = roomJid.split('@')[0];\n        roomJid = `${roomId}@conference.${this.get('session.org.shortName')}.orgspan.com`;\n\n        return timeoutPromise(\n            new Promise((resolve, reject) => {\n                return this.get('streaming.connection').joinRoom(roomJid, () => {\n                    Ember.run(() => {\n                        Ember.run.schedule('actions', err => {\n                            if (err) {\n                                return reject(err);\n                            }\n                            this.get('streaming.connection').setActive(roomJid);\n                            return this.getChatRoom(roomJid).then(function (room) {\n                                room.set('lastMessageTime', moment());\n                                return resolve(room);\n                            });\n                        });\n                    });\n                });\n            }),\n            4000,\n            'chat#joinAcdRoom'\n        );\n    },\n\n    leaveAcdRoom(roomJid) {\n        let request = new Promise((resolve, reject) =>\n            this.get('streaming.connection').leaveRoom(roomJid, err => (err ? reject(err) : resolve()))\n        );\n        request = timeoutPromise(request, 4000, 'chat#leaveAcdRoom');\n\n        request.catch(err => {\n            Ember.Logger.error(`chat#leaveAcdRoom error for jid '${roomJid}'`, err);\n\n            return Ember.RSVP.reject(err);\n        });\n\n        return request;\n    },\n\n    newRoom(jid) {\n        return ChatRoom.create(\n            {\n                jid: jid,\n                objectId: getEntityObjectId(jid)\n            },\n            Ember.getOwner(this).ownerInjection()\n        );\n    },\n\n    makeNewEmptyRoom() {\n        return new Promise(resolve => {\n            this.joinRoom()\n                .then(room => {\n                    return this.changeActiveRoom(room);\n                })\n                .then(room => {\n                    this.addEmptyRoomObserver(room);\n                    resolve(room);\n                });\n        });\n    },\n\n    addEmptyRoomObserver(room) {\n        var handler, i, key, keys, len;\n        this.set('activeEmpty', room);\n        keys = ['messages.length', 'participants.length', 'activated', 'subject'];\n        handler = () => {\n            var i, key, len, roomIsDirty;\n            if (!room.get('initialSubject')) {\n                room.set('initialSubject', room.get('subject'));\n            }\n            roomIsDirty =\n                room.get('messages.length') > 0 ||\n                room.get('participants.length') > 1 ||\n                room.get('subject') !== room.get('initialSubject') ||\n                !room.get('activated');\n            if (roomIsDirty) {\n                this.set('activeEmpty', null);\n                for (i = 0, len = keys.length; i < len; i++) {\n                    key = keys[i];\n                    room.removeObserver(key, handler);\n                }\n            }\n            return null;\n        };\n        for (i = 0, len = keys.length; i < len; i++) {\n            key = keys[i];\n            room.addObserver(key, handler);\n        }\n    },\n\n    addPersonToRoom(room, person) {\n        if (room.get('pendingRoom')) {\n            room.addParticipant(person);\n        } else {\n            if (room.isOneToOneRoom()) {\n                const oneToOneTarget = room.get('oneToOneTarget');\n                return this.makeNewEmptyRoom().then(newRoom => {\n                    this.trigger('oneToOneChangeToGroup', room, newRoom);\n                    this.inviteToRoom(newRoom, oneToOneTarget);\n                    this.inviteToRoom(newRoom, person);\n                });\n            } else {\n                this.inviteToRoom(room, person);\n                return Ember.RSVP.resolve();\n            }\n        }\n    },\n\n    inviteToRoom(room, user) {\n        this.get('streaming').inviteToRoom(room, user);\n    },\n\n    requestHistory(room, options) {\n        return new Promise((resolve, reject) => {\n            if (!room.get('activated') && !room.get('oneToOneTarget')) {\n                return reject(new Error('room must be activated before you can request history'));\n            }\n\n            const historyOptions = {\n                jid: options.jid,\n                before: options.before,\n                after: options.after,\n                limit: options.limit || this.get('messagesPerHistoryRequest')\n            };\n            this.get('streaming.connection').getMessages(historyOptions, (err, messages) => {\n                if (err) {\n                    return reject(err);\n                }\n                if (options.history) {\n                    messages = this.markAsHistory(messages);\n                }\n                return resolve(this.loadUsersForHistory(messages));\n            });\n        });\n    },\n\n    markAsHistory(messages) {\n        var i, len, message;\n        for (i = 0, len = messages.length; i < len; i++) {\n            message = messages[i];\n            message.history = true;\n        }\n        return messages;\n    },\n\n    setRoomSubject(room, subject, callback) {\n        if ((subject != null ? subject.length : void 0) > 0) {\n            return this.get('streaming.connection').setRoomSubject(room.get('jid'), subject, callback);\n        }\n    },\n\n    setPresence(presence) {\n        return this.get('streaming.connection').setPresence(presence);\n    },\n\n    setOrganizationPresenceId(presenceId) {\n        return this.get('streaming.connection').setOrganizationPresenceId(presenceId);\n    },\n\n    setStatus(status) {\n        return this.get('streaming').setStatus(status, this.get('session.person'));\n    },\n\n    openRoom(jid) {\n        return this.oldOpenRoom(jid);\n    },\n\n    oldOpenRoom(jid) {\n        return this.getChatRoom(jid).then(room => {\n            return this.changeActiveRoom(room);\n        });\n    },\n\n    /**\n       @desc Opens the video panel in the chat room with the given JID.\n       @param {string} jid\n       @returns {Promise}\n    */\n    async openChatRoomWithVideo(jid) {\n        this.get('application').openChatRoomWithVideo(jid);\n    },\n\n    /**\n       @desc Opens the video panel in the chat room for the user with the given ID.\n       @param {string} id\n       @returns {Promise}\n    */\n    async openChatRoomWithVideoForPersonById(id) {\n        const person = await this.get('store').findRecord('person', id);\n        this.logger.info('opening chat room with video for', person);\n        return this.openChatRoomWithVideo(person.get('jid'));\n    },\n\n    async openChatRoomForPersonById() {},\n\n    loadChatRoom(jid) {\n        return this.getChatRoom(jid).then(room => this.changeActiveRoom(room));\n    },\n\n    /**\n     * Syncs the authenticated user's chat data.\n     * Goal is to sync roster sort order, fetch badges, and fetch recent messages.\n     */\n    async syncUserChatData() {\n        try {\n            // sync the roster order\n            await this.syncAllRoomsLastMessageTime();\n            // fetch all badges\n            const roster = this.get('roster');\n            await roster.getAllBadgeCounts();\n\n            // fetch recent messages\n            const activeRoom = this.get('activeRoom');\n\n            this.logger.debug('<services/chat> syncUserChatData loading room history for room: ', activeRoom);\n            await this.loadRoomHistory(activeRoom);\n        } catch (err) {\n            this.logger.error('<services/chat> syncUserChatData failed: ', err);\n        }\n    },\n\n    /**\n     * Fetch the active chats from Realtime\n     */\n    getActiveChatsFromRealtime() {\n        return new Promise((resolve, reject) => {\n            this.get('streaming.connection').getActiveChats((err, activeRooms) => {\n                if (err) {\n                    return reject(err);\n                }\n                resolve(activeRooms);\n            });\n        });\n    },\n\n    /**\n     * Use the active chats and sync the last message radix. If the user has their roster\n     * sort order as 'Most Recent', then this will sync their roster.\n     */\n\n    async syncAllRoomsLastMessageTime() {\n        const activeChatsFromRealtime = await this.getActiveChatsFromRealtime();\n        const jids = Object.keys(activeChatsFromRealtime);\n        for (let i = 0; i < jids.length; i++) {\n            const room = await this.getChatRoom(jids[i]);\n            const { last } = activeChatsFromRealtime[jids[i]];\n            if (last) {\n                const time = moment(last);\n                room.set('lastMessageTime', time);\n                room.set('lastMessageTimeRadix', time.valueOf());\n            }\n        }\n    },\n\n    checkActiveRoomAgainstHistory(room) {\n        var historyStack, jid, lastActiveRoom, mostRecent;\n        if (this.get('firstRoomChosen')) {\n            return;\n        }\n        jid = room.get('jid');\n        historyStack = this.get('roomHistoryStack');\n        lastActiveRoom = this.get('roomHistoryStack.lastObject');\n        mostRecent = this.get('mostRecentActiveRoom');\n        if (!isSupervisorJid(jid)) {\n            if (!!this.get('popoutRoom')) {\n                this.set('firstRoomChosen', true);\n                return this.changeActiveRoom(this.get('popoutRoom'));\n            } else if (jid === lastActiveRoom) {\n                this.set('firstRoomChosen', true);\n                return this.changeActiveRoom(room);\n            } else if (!mostRecent || (historyStack && historyStack.indexOf(jid) > historyStack.indexOf(mostRecent))) {\n                this.set('mostRecentActiveRoom', jid);\n                this.get('selectHighestAppearingActiveRoom').perform();\n            }\n        }\n    },\n\n    selectHighestAppearingActiveRoom: task(function* (delay = 500) {\n        yield timeout(delay);\n\n        if (this.get('firstRoomChosen')) {\n            return;\n        }\n        this.set('firstRoomChosen', true);\n        return this.getChatRoom(this.get('mostRecentActiveRoom')).then(room => this.changeActiveRoom(room));\n    }).drop(),\n\n    clearRoomNotificationCounts(room) {\n        return this.get('roster').clearRoomNotificationCounts(room);\n    },\n\n    changeActiveRoom(newActive) {\n        var previousActiveRoom;\n        previousActiveRoom = this.get('activeRoom');\n        return this.attemptRoomChange(newActive).then(() => {\n            this.removeRoomFromHistoryStack(newActive);\n            this.addRoomToHistoryStack(newActive);\n            if (previousActiveRoom) {\n                this.clearRoomNotificationCounts(newActive);\n                this.clearRoomUnreadMessages(previousActiveRoom);\n                previousActiveRoom.pruneMessages();\n            }\n\n            if (this.get('allowUserRemoval') && !newActive.isOneToOneRoom() && !newActive.get('isAcdRoom')) {\n                return this.setRoomDetails(newActive.get('jid'));\n            }\n            return newActive;\n        });\n    },\n\n    closeRoomAndClearCounts(room) {\n        return this.clearRoomNotificationCounts(room)\n            .catch(err => {\n                this.logger.error('Failed to clear counts, closing room anyway', { err, jid: this.room.get('jid') });\n            })\n            .finally(() => this.closeActiveRoom(room));\n    },\n\n    closeActiveRoom(room) {\n        room.set('showingVideo', false);\n        room.updateClosedTimeRadix();\n\n        return this.deactivateRoom(room).then(() => this.get('streaming').setRoomInactive(room));\n    },\n\n    deactivateRoom(room) {\n        var replacementRoomJid, selectRoomPromise;\n        this.removeRoomFromHistoryStack(room);\n        if (room.get('jid') === this.get('activeRoom.jid')) {\n            replacementRoomJid = this.get('roomHistoryStack.lastObject');\n            selectRoomPromise = replacementRoomJid\n                ? this.getChatRoom(replacementRoomJid)\n                : this.get('roster').getNextRoomFromActiveSection();\n            return selectRoomPromise.then(selectedRoom => this.attemptRoomChange(selectedRoom));\n        } else {\n            return Promise.resolve();\n        }\n    },\n\n    updateVolumes(deviceVolumes) {\n        this.set('chatNotificationVolume', deviceVolumes.chatNotificationVolume);\n        this.set('interactionNotificationVolume', deviceVolumes.interactionNotificationVolume);\n        // depending on who calls updateVolumes, skip server could be undefined\n        // in those moments, we shouldn't need to 'save' the preference\n    },\n\n    removeRoomFromHistoryStack(room) {\n        if (room) {\n            return this.get('roomHistoryStack').removeObject(room.get('jid'));\n        }\n    },\n\n    addRoomToHistoryStack(room) {\n        var jid, historyStack;\n        if (room) {\n            jid = room.get('jid');\n            historyStack = this.get('roomHistoryStack');\n            historyStack.removeObject(jid).pushObject(jid);\n            if (historyStack.length > 10) {\n                historyStack = historyStack.slice(historyStack.length - 10);\n            }\n            this.set('roomHistoryStack', historyStack);\n        }\n    },\n\n    attemptRoomChange(room) {\n        return new Promise(resolve => {\n            var activeRoom, activeRoomJid, newRoomJid, ref;\n            activeRoom = this.get('activeRoom');\n            activeRoomJid = this.get('activeRoom.jid');\n            newRoomJid = room != null ? room.get('jid') : void 0;\n            if (activeRoomJid && activeRoomJid !== newRoomJid) {\n                activeRoom.set('active', false);\n            }\n            this.set('activeRoom', room);\n            if (room) {\n                room.set('jid', (ref = room.get('jid')) != null ? ref.split('/')[0] : void 0);\n                room.set('active', true);\n                this.activateRoom(room).then(function () {\n                    resolve(room);\n                });\n            } else {\n                resolve(room);\n            }\n        });\n    },\n\n    trackRoomChange(room) {\n        var activeRoom, activeRoomJid, newRoomJid, ref;\n        activeRoom = this.get('activeRoom');\n        activeRoomJid = this.get('activeRoom.jid');\n        newRoomJid = room != null ? room.get('jid') : void 0;\n        if (activeRoomJid && activeRoomJid !== newRoomJid) {\n            activeRoom.set('active', false);\n        }\n        this.set('activeRoom', room);\n        if (room) {\n            room.set('jid', (ref = room.get('jid')) != null ? ref.split('/')[0] : void 0);\n            room.set('active', true);\n        }\n        return room;\n    },\n\n    refocusActiveRoom() {},\n\n    activateRoom() {},\n\n    focusRoom(room) {\n        return this.get('streaming.connection').setFocused(room.get('jid'));\n    },\n\n    loadRecentHistoryForAllActiveRooms() {\n        let rooms = this.get('rooms');\n        for (let id in rooms) {\n            if (Object.prototype.hasOwnProperty.call(rooms, id)) {\n                let room = rooms[id];\n                if (\n                    room &&\n                    typeof room.get === 'function' &&\n                    room.get('activated') &&\n                    room.get('lastMessageTimeRadix') > 0\n                ) {\n                    this.loadRecentRoomHistory(room);\n                }\n            }\n        }\n    },\n\n    loadRoomHistory(room) {\n        var options;\n        options = {\n            jid: room.get('jid'),\n            history: true\n        };\n        return this.loadRoomHistoryWithOptions(room, options);\n    },\n\n    loadMoreRoomHistory(room) {\n        var options;\n        options = {\n            jid: room.get('jid'),\n            before: room.get('firstMessageTime').toDate(),\n            history: true\n        };\n        return this.loadRoomHistoryWithOptions(room, options);\n    },\n\n    loadMoreRoomHistoryAfter(room) {\n        var options;\n        options = {\n            jid: room.get('jid'),\n            after: room.get('lastMessageTime').toDate(),\n            history: true\n        };\n        return this.loadRoomHistoryWithOptions(room, options);\n    },\n\n    loadContextualRoomHistory(room, date) {\n        var afterDate, hash;\n        room.set('loadingHistory', true);\n        afterDate = moment(date).subtract(1, 'ms').toDate();\n        hash = Ember.RSVP.hash({\n            beforePromise: this.requestRoomHistory(room, {\n                jid: room.get('jid'),\n                before: date,\n                history: true\n            }),\n            afterPromise: this.requestRoomHistory(room, {\n                jid: room.get('jid'),\n                after: afterDate,\n                history: true\n            })\n        });\n        hash.then(hash => {\n            var combinedMessages;\n            combinedMessages = hash.beforePromise.concat(hash.afterPromise.reverse());\n            return this._addHistoryMessages(room, combinedMessages);\n        });\n        hash.catch(function (error) {\n            return Ember.Logger.error('Error loading history for chat room', {\n                jid: room.get('jid'),\n                error\n            });\n        });\n        return hash.finally(function () {\n            return room.set('loadingHistory', false);\n        });\n    },\n\n    requestRoomHistory(room, options) {\n        return this.requestHistory(room, options).then(messages => {\n            if (messages == null) {\n                messages = [];\n            }\n            return this._updateRoomStatus(room, options, messages);\n        });\n    },\n\n    loadRoomHistoryWithOptions(room, options) {\n        room.set('loadingHistory', true);\n        let history = this.requestHistory(room, options).then(messages => {\n            if (messages == null) {\n                messages = [];\n            }\n            return this._processHistoryResults(room, options, messages);\n        });\n        history.catch(function (error) {\n            Ember.Logger.error('Error loading history for chat room', {\n                error,\n                jid: room.get('jid')\n            });\n            room.set('historyError', true);\n        });\n        return history.finally(function () {\n            return room.set('loadingHistory', false);\n        });\n    },\n\n    _processHistoryResults(room, options, messages) {\n        this._updateRoomStatus(room, options, messages);\n        return this._addHistoryMessages(room, messages);\n    },\n\n    _updateRoomStatus(room, options, messages) {\n        if (options.after) {\n            room.set('moreForwardHistoryAvailable', messages.length >= this.get('messagesPerHistoryRequest'));\n        } else {\n            room.set('moreHistoryAvailable', messages.length >= this.get('messagesPerHistoryRequest'));\n        }\n        return messages;\n    },\n\n    _addHistoryMessages(room, messages) {\n        room.addHistoryMessages(messages);\n        return room.get('messages');\n    },\n\n    loadRecentRoomHistory(room) {\n        var maxHistoryRequestSize, options;\n        room.set('loadingHistory', true);\n        maxHistoryRequestSize = this.get('maxHistoryRequestSize');\n        options = {\n            jid: room.get('jid'),\n            after: room.get('lastMessageTime').toDate(),\n            limit: maxHistoryRequestSize\n        };\n        return this.requestHistory(room, options).then(messages => {\n            var i, len, message;\n            if (messages == null) {\n                messages = [];\n            }\n            for (i = 0, len = messages.length; i < len; i++) {\n                message = messages[i];\n                room.addMessage(message);\n            }\n            if (messages.length === maxHistoryRequestSize) {\n                return this.loadRecentRoomHistory(room);\n            } else {\n                room.set('loadingHistory', false);\n                return room;\n            }\n        });\n    },\n\n    _resolveRealtimeDependentCalls: Ember.observer('connected', function () {\n        if (this.get('connected') && this.get('streamingConnectDeferred')) {\n            this.get('streamingConnectDeferred').resolve();\n            this.set('streamingConnectDeferred', null);\n        }\n    }),\n\n    /**\n     * Uses Realtime Chat API to get room details and pass to room model.\n     * @param {string} jid room jid\n     * @returns\n     */\n    setRoomDetails(jid) {\n        return this.getChatRoom(jid).then(room => {\n            return this.get('ajax')\n                .ajaxGet(this.get('application').pcV2Uri(`api/v2/chats/rooms/${jid}`))\n                .then(details => {\n                    room.processRoomDetails(details);\n                    return room;\n                })\n                .catch(err => {\n                    Ember.Logger.error('service/chat setRoomDetails: ', {\n                        error: err\n                    });\n                    return room;\n                });\n        });\n    },\n\n    async deleteParticipantFromChatRoom(room, participant) {\n        try {\n            await this.get('ajax').delete(\n                this.get('application').pcV2Uri(`api/v2/chats/rooms/${room.jid}/participants/${participant.id}`)\n            );\n            this.removeParticipantFromRoom(room, participant);\n        } catch (err) {\n            throw err;\n        }\n    },\n\n    getStreamingRoomInfo(roomJid) {\n        const getRoomInfo = () => {\n            return new Promise((resolve, reject) => {\n                return this.get('streaming.connection').getRoomInfo(roomJid, function (err, description) {\n                    if (err) {\n                        return reject(err);\n                    } else {\n                        return resolve(description);\n                    }\n                });\n            });\n        };\n\n        const deferred = this.get('streamingConnectDeferred');\n\n        if (deferred) {\n            return deferred.promise.then(getRoomInfo);\n        } else {\n            return getRoomInfo();\n        }\n    },\n\n    updateRoomSubject(room, subject) {\n        return room.set('rawSubject', subject);\n    },\n\n    getTargetRoomJid(arg) {\n        let { to, from } = arg;\n        if (isRoomJid(to)) {\n            return to;\n        } else if (compareJids(to, this.get('session.person.jid'))) {\n            return from;\n        } else {\n            return to;\n        }\n    },\n\n    addParticipantToRoom(room, person) {\n        if (room && person) {\n            return room.addParticipant(person);\n        }\n    },\n\n    removeParticipantFromRoom(room, person) {\n        if (room && person) {\n            return room.removeParticipant(person);\n        }\n    },\n\n    loadRoomAndUser(roomJid, userJid) {\n        return Ember.RSVP.hash({\n            room: this.getChatRoom(roomJid),\n            person: this.get('batchDataRequests').getChatUser(userJid)\n        });\n    },\n\n    loadUsersForHistory(historyMessages) {\n        var message;\n        if (_.isEmpty(historyMessages)) {\n            return Ember.RSVP.resolve(historyMessages);\n        }\n        return Ember.RSVP.all(\n            function () {\n                var i, len, results;\n                results = [];\n                for (i = 0, len = historyMessages.length; i < len; i++) {\n                    message = historyMessages[i];\n                    results.push(this.processNewChatMessage(message));\n                }\n                return results;\n            }.call(this)\n        );\n    },\n\n    processNewChatMessage(message) {\n        const owner = Ember.getOwner(this);\n        let messageBody = this.parseMessageBody(message);\n\n        delete message.body;\n\n        Ember.setOwner(message, owner);\n        let messageModel = ChatMessage.create(message);\n\n        this.parseWidgetData(messageModel);\n\n        messageModel.set('messageBody', messageBody);\n        messageModel.set('time', moment(message.time));\n\n        this.checkForMentions(messageModel);\n\n        return this.get('batchDataRequests')\n            .getChatUser(message.from)\n            .then(person => {\n                messageModel.set('chatUser', person);\n                this.setMessageReadState(messageModel);\n                return messageModel;\n            });\n    },\n\n    parseWidgetData(message) {\n        message.get('stanza.children').forEach(child => {\n            if (this.widgets.indexOf(child.name) >= 0) {\n                let data;\n\n                try {\n                    if (child.name === 'videoNotification' && child.children.length == 0) {\n                        data = child.attrs;\n                    } else {\n                        data = JSON.parse(child.children[0]);\n                    }\n                } catch (e) {\n                    Ember.Logger.error('Error parsing chat widget data', {\n                        name: child.name,\n                        child: child.children[0],\n                        error: e\n                    });\n                    return;\n                }\n\n                message.set('widgetType', child.name);\n                message.set('widget', Ember.Object.create({ data }));\n            }\n        });\n    },\n\n    parseMessageBody(message) {\n        var body, raw;\n        raw = message.raw;\n        body = message.body;\n        if (raw) {\n            return markdownToHtml(raw);\n        } else {\n            return body;\n        }\n    },\n\n    checkForMentions(message) {\n        /* eslint-disable */\n        var match, mention, mentionRegex, mentions, oid, raw;\n        mentions = [];\n        mentionRegex = /\\[@.*\\]\\(#\\/person\\/(.*)\\)/g;\n        raw = message.get('raw');\n        while ((match = mentionRegex.exec(raw))) {\n            mention = match[0];\n            oid = match[1];\n            mentions.push(\n                Ember.Object.create({\n                    mention: mention,\n                    oid: oid\n                })\n            );\n        }\n        message.set('mentions', mentions);\n        return message.set('hasMentionLinks', mentions.length > 0);\n        /* eslint-enable */\n    },\n\n    setMessageReadState(message) {\n        var roomIsVisible, windowFocused;\n        if (compareJids(message.get('chatUser.jid'), this.get('session.person.jid')) || message.get('history')) {\n            return message.set('unread', false);\n        } else {\n            windowFocused = this.windowInFocus();\n            return message.set('unread', !roomIsVisible || !windowFocused);\n        }\n    },\n\n    isActiveRoom(room) {\n        return this.isActiveRoomJid(Ember.get(room, 'jid'));\n    },\n\n    isActiveRoomJid(jid) {\n        return jid && this.get('activeRoom.jid') === jid;\n    },\n\n    isRoomVisible() {\n        return false;\n    },\n\n    isChatVisible() {\n        return false;\n    },\n\n    windowInFocus() {\n        var hosted;\n        hosted = this.get('applicationService.hostedContext');\n        if (hosted != null ? hosted.isHosted() : void 0) {\n            return hosted.applicationHasFocus();\n        } else {\n            return !this.get('application.browserHidden');\n        }\n    },\n\n    async popoutChatRoom() {\n        // no op for now\n    },\n\n    handleXMPPReferenceMention(message) {\n        const {\n            stanza: { children },\n            from,\n            to\n        } = message;\n        const personJid = this.get('session.person.jid');\n        const referenceChildren = _.filter(children, {\n            name: 'reference',\n            attrs: {\n                uri: personJid,\n                action: 'SUCCEEDED'\n            }\n        });\n\n        referenceChildren.forEach(() => {\n            this.handleMentionEvent(from, to, message);\n        });\n    },\n\n    async handleMentionEvent(from, room, message) {\n        const user = await this.get('batchDataRequests').getChatUser(from);\n        const chatRoom = await this.getChatRoom(room);\n\n        this.sendMentionNotification(chatRoom, user, message);\n    },\n\n    handleCollaborateChatMessage(message) {\n        const children = message.stanza.children;\n        const isMention = children.findBy('name', 'reference') !== undefined;\n        if (isMention) {\n            this.handleXMPPReferenceMention(message);\n        }\n        const roomJid = this.getTargetRoomJid(message);\n        this.getChatRoom(roomJid).then(room => {\n            this.processNewChatMessage(message).then(async messageModel => {\n                messageModel.set('room', room);\n                if (room.isOneToOneRoom()) {\n                    // this.savePersonalChats(messageModel, room);\n                } else {\n                    // this.savePersonalMentions(messageModel);\n                    // this.saveRoomChats(messageModel, room);\n                    this.get('roster').incrementUnreadGroupMessage(messageModel, room);\n                }\n\n                if (this.get('permissions.canViewBusinessChat')) {\n                    this.sendNotification(messageModel);\n                }\n            });\n        });\n    }\n});\n","define(\"connections-ui/services/clock\", [\"exports\", \"ember-purecloud-components/services/clock\"], function (_exports, _clock) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _clock.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport _ from 'lodash';\nimport ConversationMixin from 'connections-ui/mixins/conversation';\nimport moment from 'connections-ui/utils/dates';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport UriBuilder from '../mixins/conversation-uri-builder';\nimport participantStatus from '../utils/acdParticipantStatuses';\nimport timeoutPromise from '../utils/timeout-promise';\n\nconst { inject, Evented } = Ember;\nconst { Promise } = Ember.RSVP;\nconst INTERACTION_TYPE = {\n    call: 'calls',\n    chat: 'chats',\n    email: 'emails',\n    callback: 'callbacks',\n    message: 'messages'\n};\n\nexport default Ember.Service.extend(UriBuilder, LoggerMixin, ConversationMixin, Evented, {\n    // Note:\n    //\n    // Most of this was ported from the design pattern we had in Engage.\n    // We'll need to re-evaluate its usage here to determine if this is\n    // still something we want to do or if its a little heavy-handed since\n    // we're not abstracting this logic from all interaction types like\n    // we previously were.\n\n    application: inject.service(),\n    session: inject.service(),\n    store: inject.service(),\n    addressformat: inject.service(),\n    ajax: inject.service(),\n    phone: inject.service(),\n\n    validationWaitTime: isTesting ? 0 : 15000,\n\n    init() {\n        this._super(...arguments);\n        this.set('_timers', []);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this.get('_timers').forEach(item => Ember.run.cancel(item));\n    },\n\n    getAllActiveConversations() {\n        const url = this.baseUri();\n        return this.makeRequest(url, {}, 'get').then(response => response.entities);\n    },\n\n    getAllActive(communicationType) {\n        const url = this.baseUri();\n        const options = { data: { communicationType } };\n        return this.makeRequest(url, options, 'get').then(response => response.entities);\n    },\n\n    /**\n     * Places a call on the participantForCurrentUser for the given interaction.\n     * @param {Interaction} interaction - the interaction to add a call to\n     * @param {string} number - the number to dial\n     * @param {string} phoneColumn - for a dialer preview/scheduled callback, the phone column associated with the number\n     */\n    addCall(interaction, number, phoneColumn) {\n        const id = interaction.get('id');\n        const url = this.callsUri(id);\n        const options = { data: { callNumber: number, phoneColumn: phoneColumn } };\n        return this.makeRequest(url, options, 'post');\n    },\n\n    /**\n     * Schedules a callback for an existing conversation.\n     *\n     * @param {Interaction} interaction - the interaction to schedule a callback for\n     * @param {object} data -\n     *              {array} callbackNumbers - the numbers for the callback\n     *              {string} callbackScheduledTime - ISO8601 string for when to send the callback\n     *                  {object} routingData -\n     *                  {array} preferredAgents - list of preferred agent ids\n     */\n    scheduleCallback(interaction, data) {\n        const customer = interaction.get('participantForCustomer');\n        let queueId = interaction.get('participantForCurrentUser.queueId') || customer.queueId;\n        const callbackUserName = customer.name ? customer.name.toString() : null;\n        const countryCode = this.get('addressformat.countryCode');\n        const id = interaction.get('id');\n\n        if (data && data.routingData) {\n            if (!data.routingData.queueId) {\n                Object.assign(data.routingData, { queueId: queueId });\n            } else {\n                queueId = data.routingData.queueId;\n            }\n        }\n\n        const uri = this.scheduleCallbackUri(id, customer.id);\n        const postData = Object.assign(\n            {},\n            {\n                callbackUserName: callbackUserName,\n                countryCode: countryCode,\n                queueId: queueId\n            },\n            data\n        );\n        const options = { data: postData };\n\n        return this.makeRequest(uri, options, 'post');\n    },\n\n    answer(interaction) {\n        const userId = interaction.get('participantForCurrentUser.id');\n        const url = this.participantUri(interaction.id, userId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { state: participantStatus.CONNECTED } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return this.validateActionSucceeded(interaction, 'interactionState', participantStatus.CONNECTED);\n        });\n    },\n\n    disconnectParticipant(interactionId, participantId, mediaType) {\n        const url = this.participantUri(interactionId, participantId, INTERACTION_TYPE[mediaType]);\n        const options = { data: { state: participantStatus.DISCONNECTED } };\n\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    hold(interaction) {\n        const interactionId = interaction.get('id');\n        const userId = interaction.get('participantForCurrentUser.id');\n        const url = this.participantUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { held: true } };\n\n        if (!Ember.get(interaction, 'isConnected')) {\n            this.logger.debug(`Attempted to hold non-connected conversation: ${interaction.get('id')}`);\n            return Promise.resolve();\n        }\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return this.validateActionSucceeded(interaction, 'isHeld', true);\n        });\n    },\n\n    unhold(interaction) {\n        const interactionId = interaction.get('id');\n        const userId = interaction.get('participantForCurrentUser.id');\n        const url = this.participantUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { held: false } };\n\n        if (!Ember.get(interaction, 'isConnected')) {\n            this.logger.debug(`Attempted to set hold state for non-connected conversation: ${interaction.get('id')}`);\n            return Promise.resolve();\n        }\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return this.validateActionSucceeded(interaction, 'isHeld', false);\n        });\n    },\n\n    pause(interaction) {\n        const interactionId = interaction.get('id');\n        const url = this.communicationUri(interactionId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { recordingState: 'PAUSED' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            if (!this.get('session.features.acdSecurePause')) {\n                return this.validateActionSucceeded(interaction, 'isPaused', true);\n            }\n        });\n    },\n\n    unpause(interaction) {\n        const interactionId = interaction.get('id');\n        const url = this.communicationUri(interactionId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { recordingState: 'ACTIVE' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            if (!this.get('session.features.acdSecurePause')) {\n                return this.validateActionSucceeded(interaction, 'isPaused', false);\n            }\n        });\n    },\n\n    requestAcw(interactionId, participantId, agentCommunicationId) {\n        const url = this.requestACWUri(interactionId, participantId, agentCommunicationId);\n        const options = { data: { afterCallWorkRequired: true } };\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    skipAcw(interactionId, participantId, agentCommunicationId) {\n        const url = this.requestACWUri(interactionId, participantId, agentCommunicationId);\n        const options = { data: { afterCallWorkRequired: false } };\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    disconnect(interaction) {\n        const interactionId = interaction.get('id');\n        const userId = interaction.get('participantForCurrentUser.id');\n        const url = this.participantUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n        let options = {\n            data: {\n                state: participantStatus.DISCONNECTED\n            }\n        };\n\n        //\n        // Note We only want to apply communicationWrapupSkipped to callbacks not within campains. We do this\n        // to prevent wrapup showing now where it did not use to show before.\n        //\n        const isDialerCampaign = Ember.get(interaction, 'isCampaignCallback');\n        const isSkippingPreviewCampaign =\n            isDialerCampaign && Ember.get(interaction, 'selectedWrapupCode.id') === 'ININ-OUTBOUND-PREVIEW-SKIPPED';\n        const hasPlacedCallsInCallback =\n            typeof Ember.get(interaction, 'participantForCurrentUser.calls.firstObject') === 'object';\n        if (\n            Ember.get(interaction, 'useCommunicationACW') &&\n            Ember.get(interaction, 'isCallback') &&\n            hasPlacedCallsInCallback &&\n            !isSkippingPreviewCampaign\n        ) {\n            options.data.communicationWrapupSkipped = true;\n        }\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return this.validateActionSucceeded(interaction, 'interactionState', [\n                undefined,\n                participantStatus.DISCONNECTED\n            ]);\n        });\n    },\n\n    park(interaction) {\n        // PATCH /api/v2/conversations/emails/{id}/participants/{id} + state\n        const interactionId = interaction.get('id');\n        const userId = interaction.get('participantForCurrentUser.id');\n        const url = this.participantUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { state: participantStatus.PARKED } };\n\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    disconnectCall(interaction) {\n        const conversation = this.get('phone.conversations').findBy('id', interaction.get('id'));\n        if (conversation) {\n            this.trigger('endCall', conversation);\n        }\n    },\n\n    getWrapUpCodes(interaction) {\n        const userId = interaction.get('participantForCurrentUser.id');\n        const interactionId = interaction.get('id');\n        const url = this.participantWrapupCodesUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n        return this.makeRequest(url, {}, 'get');\n    },\n\n    getProvisionalACWNotes(interaction, participantId) {\n        const userId = participantId ? participantId : interaction.get('participantForCurrentUser.id');\n        const interactionId = interaction.get('id');\n        const communicationId = interaction.get('communicationMedia.id');\n        const options = {\n            type: 'GET',\n            data: { provisional: 'true' }\n        };\n        let url = this.participantWrapupUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n\n        if (Ember.get(interaction, 'useCommunicationACW')) {\n            url = this.participantCommunicationWrapupUri(\n                interactionId,\n                userId,\n                INTERACTION_TYPE[interaction.get('type')],\n                communicationId\n            );\n        }\n\n        return this.makeRequest(url, options, 'raw');\n    },\n\n    loadParticipantPerson(userId) {\n        if (userId) {\n            if (this.get('store').hasRecordForId('person', userId)) {\n                return Promise.resolve(this.get('store').peekRecord('person', userId));\n            }\n            return this.get('store')\n                .findRecord('person', userId)\n                .catch(error => {\n                    this.logger.error('Unable to retrieve person for participant', { userId, error });\n                    return Promise.resolve();\n                });\n        } else {\n            return Promise.resolve();\n        }\n    },\n\n    /**\n     * Fetches the notes based on the participant and their corresponding wrap up object within a\n     * specified interaction. If the notes are within the data already then it prevents the need to\n     * fetch the participants current provisional notes.\n     * @param interaction The currently active interaction\n     * @param {{ wrapup }} param1 Any data object that could contain the wrapup information\n     * @param participantId The id of the participant that the notes are coming from\n     * @returns A promise that resolves to a data object containing wrap up and note information\n     */\n    getParticipantNotes(interaction, { wrapup }, participantId) {\n        if (wrapup) {\n            return Promise.resolve(wrapup);\n        } else {\n            return this.getProvisionalACWNotes(interaction, participantId);\n        }\n    },\n\n    /**\n     * Iterates through all of the historical notes in an interaction and fetches additional information needed\n     * to populate the historical notes timeline. Based on the `useCommunicationACW` model function in an interaction,\n     * it determines where we are pulling the notes from.\n     * @param interaction The currently active interaction\n     * @returns An array of promises to fetch the notes of the interaction\n     */\n    getAllHistoricalACWNotes(interaction) {\n        const currentParticipantId = interaction.get('participantForCurrentUser.id');\n        let promiseArray = [];\n\n        interaction.participants.forEach(participant => {\n            const participantId = participant.id;\n            const userId = participant.userId;\n\n            if (participantId && userId) {\n                if (Ember.get(interaction, 'useCommunicationACW')) {\n                    const media = [...(participant[interaction.type] || participant[`${interaction.type}s`] || [])];\n\n                    //An agent receiving a callback should be able to read notes from all previous calls and callbacks\n                    //So callback interactions need to include data from previous calls (aka participant['calls']), and vice versa\n                    if (interaction.type === 'callback') {\n                        media.push(...(participant['calls'] || []));\n                    }\n\n                    if (interaction.type === 'call') {\n                        media.push(...(participant['callbacks'] || []));\n                    }\n\n                    if (!!media.length) {\n                        /**\n                         * For this implementation we are no longer fetching the other agents provisional notes\n                         * and adding them to the historical timeline. That is why this iteration is not using the\n                         * `getParticipantNotes` function like it is below. We do not need to check if the `purpose`\n                         * value on the participant is equal to `agent` since media items only show up on a\n                         * participants that can add notes and wrap up. In short, this will allow any participant to add\n                         * notes to the timeline if we ever decide to support that elsewhere.\n                         */\n                        promiseArray.push(\n                            ...media\n                                // This filter prevents empty promises and ensures that the array will not have duplicate messages\n                                .filter((data, index, array) => {\n                                    return (\n                                        !!data.wrapup &&\n                                        index ===\n                                            array.findIndex(\n                                                element =>\n                                                    !!element.wrapup &&\n                                                    element.wrapup.endTime === data.wrapup.endTime &&\n                                                    element.wrapup.notes === data.wrapup.notes\n                                            )\n                                    );\n                                })\n                                .map(async data => {\n                                    const { wrapup } = data;\n                                    const person = await this.loadParticipantPerson(userId);\n                                    if (person) {\n                                        wrapup.person = person;\n                                    }\n                                    return wrapup;\n                                })\n                        );\n                    }\n                } else if (\n                    /**\n                     * If the participant object has a `wrapup` object on it then allow it to pass through regardless no matter what the purpose\n                     * of the participant is. However, if there is not a `wrapup` object then we check the `id`'s to prevent the return of the\n                     * current users own provisional notes, and we only want to try and fetch the provisional notes if the purpose is of `agent`.\n                     * This implementation allows the fetching of other agents provisional notes. In contrast, the implementation above does NOT.\n                     * This is intentional and we will want to move to the implementation above eventually.\n                     */\n                    participant.wrapup ||\n                    (currentParticipantId !== participantId && participant.purpose !== 'agent')\n                ) {\n                    promiseArray.push(\n                        this.getParticipantNotes(interaction, participant, participantId).then(async response => {\n                            const result = response.payload || response;\n                            const person = await this.loadParticipantPerson(userId);\n                            if (person) {\n                                result.person = person;\n                            }\n                            return result;\n                        })\n                    );\n                }\n            }\n        });\n\n        return Promise.all(promiseArray);\n    },\n\n    saveProvisionalACW(interaction, { notes, wrapup }) {\n        if (!interaction) {\n            return Ember.RSVP.Promise.reject('No interaction provided.');\n        }\n\n        if (!notes && !wrapup) {\n            return Ember.RSVP.Promise.reject('Nothing to save to provisional ACW');\n        }\n\n        const interactionId = Ember.get(interaction, 'id');\n        const userId = Ember.get(interaction, 'participantForCurrentUser.id');\n        const mediaType = Ember.get(interaction, 'type');\n        const communicationId = Ember.get(interaction, 'communicationMedia.id');\n        const code = wrapup ? wrapup.id : Ember.get(interaction, 'selectedWrapupCode.id');\n        const name = wrapup ? wrapup.name : Ember.get(interaction, 'selectedWrapupCode.name');\n        notes = notes || Ember.get(interaction, 'notes');\n\n        let method = 'patch';\n        let url = this.participantUri(interactionId, userId, INTERACTION_TYPE[mediaType]);\n        let payload = {\n            wrapup: { provisional: true }\n        };\n\n        if (code && name) {\n            payload.wrapup.code = code;\n            payload.wrapup.name = name;\n        }\n\n        if (notes) {\n            payload.wrapup.notes = notes;\n        }\n\n        if (Ember.get(interaction, 'useCommunicationACW')) {\n            method = 'post';\n            url = this.participantCommunicationWrapupUri(\n                interactionId,\n                userId,\n                INTERACTION_TYPE[interaction.get('type')],\n                communicationId\n            );\n            payload = payload.wrapup;\n        }\n\n        const options = { data: payload };\n        return this.makeRequest(url, options, method);\n    },\n\n    /**\n     * Start a monitor on a participant in a conversation\n     */\n    monitor(callId, participantId) {\n        const url = this.monitorUri(callId, participantId);\n        return this.makeRequest(url, {}, 'post');\n    },\n\n    transfer(interaction, options, query, entityType = '') {\n        const userId = interaction.get('participantForCurrentUser.id');\n        const interactionId = interaction.get('id');\n        const interactionType = !this.get('session.features.acdTransferPermissions')\n            ? INTERACTION_TYPE[interaction.get('type')]\n            : null;\n        const url = this.replaceUri(interactionId, userId, null, interactionType, entityType);\n        const transferType = query.transferType || 'Unattended';\n\n        options = options || {};\n        options.data = query;\n\n        return this.makeRequest(url, options, 'post').then(() => {\n            this.trigger('callTransferred', interaction);\n\n            if (transferType === 'Attended') {\n                return this.validateActionSucceeded(interaction, 'isAttendedTransferring', true);\n            } else {\n                return this.validateActionSucceeded(interaction, 'interactionState', [\n                    participantStatus.DISCONNECTED,\n                    participantStatus.TERMINATED\n                ]);\n            }\n        });\n    },\n\n    cancelTransfer(interaction, participant) {\n        const interactionId = interaction.get('id');\n        const interactionType = INTERACTION_TYPE[interaction.get('type')];\n        const communicationId = participant[interactionType].get('firstObject.id');\n\n        return this.makeRequest(\n            this.communicationsUri(interactionId, participant.id, interactionType, communicationId),\n            { data: { state: 'disconnected' } },\n            'patch'\n        )\n            .then(() => this.validateActionSucceeded(interaction, 'wasTransferCanceled', true))\n            .catch(error => {\n                this.get('logger').error('There was an issue canceling the transfer', error);\n            });\n    },\n\n    // Once we move interactions to use Ember data, we'll extract this into a stand alone utility.\n    // (https://inindca.atlassian.net/browse/UI-2200)\n    validateActionSucceeded(interaction, attributeToMonitor, expectedValue) {\n        const logger = this.logger;\n        const ajax = this.get('ajax');\n        const userId = this.get('session.person.guid');\n\n        logger.debug('ACD: validateActionSucceeded: Validating interaction', interaction);\n\n        return new Promise((resolve, reject) => {\n            const requestUri = this.baseUri();\n            const communicationType = interaction.get('type');\n            const data = { communicationType };\n            const VALIDATION_INTERVAL = this.get('validationWaitTime');\n\n            const VALIDATION_TIMEOUT = Ember.run.later(function () {\n                return verifyViaAjax();\n            }, VALIDATION_INTERVAL);\n            this.get('_timers').push(VALIDATION_TIMEOUT);\n\n            if (!interaction) {\n                return valResolve();\n            }\n\n            checkForSuccessUpdate();\n            createObserver();\n\n            function valResolve() {\n                destroyObserver();\n                return resolve();\n            }\n\n            function valReject() {\n                destroyObserver();\n                return reject();\n            }\n\n            function createObserver() {\n                logger.debug(`ACD: validateActionSucceeded: Observer created on ${attributeToMonitor}`);\n                interaction.addObserver(`${attributeToMonitor}`, this, checkForSuccessUpdate);\n            }\n\n            function destroyObserver() {\n                logger.debug(`ACD: validateActionSucceeded: Observer destroyed on ${attributeToMonitor}`);\n                interaction.removeObserver(`${attributeToMonitor}`, this, checkForSuccessUpdate);\n            }\n\n            function checkForSuccessUpdate() {\n                if (actionHasSucceeded()) {\n                    Ember.run.cancel(VALIDATION_TIMEOUT);\n                    return valResolve();\n                }\n            }\n\n            /**\n             * Formats the expected value to an array with all string expectations lowercase.\n             * @param {string|boolean|undefined|string[]} expectedValue\n             *          The expected value(s)\n             * @returns {[]} An array containing the expected value(s). All strings are lowercased, booleans and 'undefined' are unchanged.\n             */\n            function formatExpectedValue(expectedValue) {\n                if (Array.isArray(expectedValue)) {\n                    let lowercaseValues = _.chain(expectedValue)\n                        .filter(value => typeof value === 'string')\n                        .map(value => value.toLowerCase())\n                        .value();\n                    if (_.includes(expectedValue, undefined)) {\n                        lowercaseValues.push(undefined);\n                    }\n                    return lowercaseValues;\n                } else if (typeof expectedValue === 'string') {\n                    return [expectedValue.toLowerCase()];\n                } else if (typeof expectedValue === 'boolean') {\n                    return [expectedValue];\n                } else if (expectedValue === undefined) {\n                    return [expectedValue];\n                }\n                return [];\n            }\n\n            function actionHasSucceeded() {\n                let formattedExpectedValues = formatExpectedValue(expectedValue);\n\n                let currentValue = interaction.get(`${attributeToMonitor}`);\n                if (typeof currentValue === 'string') {\n                    currentValue = currentValue.toLowerCase();\n                }\n\n                const actionSucceeded = _.includes(formattedExpectedValues, currentValue);\n\n                if (actionSucceeded) {\n                    logger.debug('ACD: validateActionSucceeded: action succeeded for attr ', attributeToMonitor);\n                    return true;\n                }\n\n                return false;\n            }\n\n            function verifyViaAjax() {\n                return timeoutPromise(\n                    new Promise((resolve, reject) => {\n                        logger.debug('ACD: validateActionSucceeded: Will verify via ajax', attributeToMonitor);\n                        return ajax\n                            .ajaxGet(requestUri, { data })\n                            .then(interactions => {\n                                if (interaction && (interaction.isDestroyed || interaction.isDestroying)) {\n                                    logger.debug(\n                                        'ACD: validateActionSucceeded: interaction destroyed while verifying.'\n                                    );\n                                    return resolve();\n                                }\n\n                                let newInteraction = _.find(interactions.entities, { id: interaction.get('id') });\n\n                                if (interaction && newInteraction) {\n                                    interaction.setProperties(newInteraction);\n                                    if (Ember.get(interaction, 'conversation')) {\n                                        interaction.get('conversation').setProperties(newInteraction);\n                                    }\n                                }\n\n                                if (actionHasSucceeded()) {\n                                    return resolve();\n                                }\n\n                                logger.info('Conversation attribute resolved, but never updated', {\n                                    namespace: 'conversations',\n                                    options: {\n                                        attributeToMonitor,\n                                        expectedValue,\n                                        actualValue: interaction.get(`${attributeToMonitor}`)\n                                    },\n                                    user: userId,\n                                    conversationId: interaction.get('id')\n                                });\n\n                                reject('Attribute never updated.');\n                            })\n                            .catch(err => {\n                                logger.error('Conversation attribute never updated', {\n                                    namespace: 'conversations',\n                                    options: {\n                                        attributeToMonitor,\n                                        expectedValue,\n                                        actualValue: interaction.get(`${attributeToMonitor}`)\n                                    },\n                                    error: err,\n                                    user: userId,\n                                    conversationId: interaction.get('id')\n                                });\n                                reject(err);\n                            });\n                    }),\n                    VALIDATION_INTERVAL,\n                    'communication#verifyViaAjax'\n                )\n                    .then(function () {\n                        return valResolve();\n                    })\n                    .catch(function (err) {\n                        return valReject(err);\n                    });\n            }\n        });\n    },\n\n    /** Begins a consult transfer interaction for the provided participant\n     * with a given address.\n     * @param {string} interaction the model for the call\n     * @param {Object} destination the destination participant to consult with\n     * @param {string} entityType the type of entity participant is consulting with | Values queue, person, ''\n     */\n    initiateConsult(interaction, destination, entityType = '') {\n        const customerId = interaction.get('participantForCustomer.id');\n        const interactionId = interaction.get('id');\n        let data = {\n            speakTo: 'DESTINATION',\n            destination: destination\n        };\n        if (this.get('session.features.acdTransferPermissions') && typeof destination === 'object' && entityType) {\n            data = destination;\n        }\n        const options = { data };\n        const url = this.consultUri(interactionId, customerId, INTERACTION_TYPE[interaction.get('type')], entityType);\n\n        return !customerId\n            ? Ember.RSVP.reject(new Error('customer not present'))\n            : this.makeRequest(url, options, 'post');\n    },\n\n    /** Updates a consult transfer interaction to speak to both consulting parties\n     * @param {string} callId the id of the call the consult is occurring on\n     * @param {string} participantId the id of the participant being transferred\n     */\n    consultBoth(interaction) {\n        const callId = interaction.get('id');\n        const participantId = interaction.get('consultParticipant.id');\n        const url = this.consultUri(callId, participantId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { speakTo: 'BOTH' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return Ember.RSVP.all([\n                this.validateActionSucceeded(interaction, 'isConsultParticipantHolding', false),\n                this.validateActionSucceeded(interaction, 'consultAgentParticipant.calls.firstObject.confined', false)\n            ]);\n        });\n    },\n\n    /** Updates a consult transfer interaction to speak to Conference\n     * @param {string} callId the id of the call the consult is occurring on\n     * @param {string} participantId the id of the participant being transferred\n     */\n    consultConference(interaction) {\n        const callId = interaction.get('id');\n        const participantId = interaction.get('consultParticipant.id');\n        const url = this.consultUri(callId, participantId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { speakTo: 'CONFERENCE' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return Ember.RSVP.all([\n                this.validateActionSucceeded(interaction, 'isConsultParticipantHolding', false),\n                this.validateActionSucceeded(interaction, 'consultAgentParticipant.calls.firstObject.confined', false)\n            ]);\n        });\n    },\n\n    /** Updates a consult transfer interaction to speak to the destination consulting party\n     * @param {string} callId the id of the call the consult is occurring on\n     * @param {string} participantId the id of the participant being transferred\n     */\n    consultDestination(interaction) {\n        const callId = interaction.get('id');\n        const participantId = interaction.get('consultParticipant.id');\n        const url = this.consultUri(callId, participantId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { speakTo: 'DESTINATION' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return Ember.RSVP.all([\n                this.validateActionSucceeded(interaction, 'isConsultParticipantHolding', true),\n                this.validateActionSucceeded(interaction, 'consultAgentParticipant.calls.firstObject.confined', false)\n            ]);\n        });\n    },\n\n    /**\n     * Updates a consult transfer interaction to speak to the object (customer) consulting party\n     * @param {string} callId the id of the call the consult is occurring on\n     * @param {string} participantId the id of the participant being transferred\n     */\n    consultObject(interaction) {\n        const callId = interaction.get('id');\n        const participantId = interaction.get('consultParticipant.id');\n        const url = this.consultUri(callId, participantId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { speakTo: 'OBJECT' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return Ember.RSVP.all([\n                this.validateActionSucceeded(interaction, 'isConsultParticipantHolding', false),\n                this.validateActionSucceeded(interaction, 'consultAgentParticipant.calls.firstObject.confined', true)\n            ]);\n        });\n    },\n\n    /**\n     * Cancels a consult transfer interaction\n     * @param {string} callId the id of the call the consult is occurring on\n     * @param {string} participantId the id of the participant being transferred\n     */\n    cancelConsult(interaction) {\n        const callId = interaction.get('id');\n        const participantId = interaction.get('consultParticipant.id');\n        const url = this.consultUri(callId, participantId, INTERACTION_TYPE[interaction.get('type')]);\n\n        return this.makeRequest(url, {}, 'DELETE');\n    },\n\n    /**\n     * Initiates a shared session (screen share, co-browse, video)\n     *\n     * NOTE: This request does not require the mediaType in URL.  This\n     * is essentially the same URL pattern as v1.\n     *\n     * @param {object} interaction object\n     * @param {object} customer participant\n     */\n    initiateSessionShare(interaction, customerId) {\n        const interactionId = interaction.get('id');\n        const mediaType = 'screenshare';\n        const sessionCodeUrl = this.sessionShareCodeUri(interactionId, customerId);\n        const options = { data: { mediaType } };\n\n        if (interaction.get('isV2Provider')) {\n            return this.makeRequest(sessionCodeUrl, options, 'post').then(res => {\n                if (!res.sourceCommunicationId || !res.addCommunicationCode) {\n                    return Ember.RSVP.reject(new Error('No session share code.'));\n                }\n\n                const types = [];\n                if (interaction.get('canCobrowse')) {\n                    types.push('cobrowse');\n                }\n                if (interaction.get('canScreenShare')) {\n                    types.push('screenshare');\n                }\n\n                const url = this.mediaRequestUri(interactionId, 'chats');\n                const toId = interaction.get('participantForCustomer.chats.firstObject.id');\n                const fromId = interaction.get('participantForCurrentUser.chats.firstObject.id');\n                const mediaRequestOptions = {\n                    data: {\n                        types,\n                        state: 'PENDING',\n                        toCommunicationId: toId,\n                        fromCommunicationId: fromId,\n                        communicationId: res.sourceCommunicationId,\n                        securityKey: res.addCommunicationCode\n                    }\n                };\n                return Ember.RSVP.all([Ember.RSVP.resolve(res), this.makeRequest(url, mediaRequestOptions, 'post')]);\n            });\n        }\n\n        return Ember.RSVP.all([this.makeRequest(sessionCodeUrl, options, 'post')]);\n    },\n\n    /**\n     * Ends a shared session (screen share, co-browse, video)\n     * @param {object} interaction object\n     */\n    expireSessionShareCode(interaction, customerId) {\n        const interactionId = interaction.get('id');\n        const securityKey = interaction.get('sessionShareCode');\n        const url = this.expireSessionShareCodeUri(interactionId, customerId, securityKey);\n\n        return this.makeRequest(url, {}, 'DELETE');\n    },\n\n    disconnectMediaType(interaction, mediaType, mediaId) {\n        const userId = Ember.get(interaction, 'participantForCurrentUser.id');\n        const interactionId = Ember.get(interaction, 'id');\n        const url = this.disconnectMediaTypeUri(interactionId, mediaId, userId, mediaType);\n        const options = {\n            data: {\n                state: participantStatus.DISCONNECTED\n            }\n        };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return this.validateActionSucceeded(interaction, 'sessionShareState', 'disconnected');\n        });\n    },\n\n    createEmail: function (queueId, email, externalContactId) {\n        const url = '/platform/api/v2/conversations/emails';\n        const options = {\n            data: {\n                direction: 'OUTBOUND',\n                queueId: queueId,\n                toAddress: email\n            },\n            headers: {\n                'Content-Type': 'application/json'\n            },\n            method: 'post'\n        };\n        if (externalContactId) {\n            options.data.externalContactId = externalContactId;\n        }\n        return this.makeRequest(url, options);\n    },\n\n    /**\n     * Initializes the draft to be ready for use in editor.\n     * @param {string} emailId: id of conversation\n     * @param {object} options: object containing draft options\n     * @param {object} query: endpoint query paramaters\n     * @returns promise\n     */\n    initializeDraft(emailId, options, query) {\n        const url = this.draftUri(emailId, 'emails', query);\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    /**\n     * Discards the draft to be ready for initializing once more.\n     * @param {string} emailId: id of conversation\n     * @param {object} query: enpoint query paramaters\n     * @returns promise\n     */\n    discardDraft(emailId, options, query = { autoFill: false, discard: true }) {\n        const url = this.draftUri(emailId, 'emails', query);\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    loadSMSHistory: function (interactionId) {\n        const url = this.smsHistoryUri(interactionId);\n        return this.makeRequest(url, {}, 'get').then(response => {\n            let messageIds = [];\n            _.each(response.participants, participant => {\n                _.each(participant.messages, message => {\n                    _.each(message.messages, msg => {\n                        messageIds.push(msg.messageId);\n                    });\n                });\n            });\n            return _.uniq(messageIds);\n        });\n    },\n\n    sendSMSMessage: function (interactionId, communicationId, message) {\n        const url = this.sendSMSMessageUri(interactionId, communicationId);\n        const timestamp = moment().utc().format();\n        const options = {\n            data: {\n                direction: 'outbound',\n                timestamp: timestamp\n            },\n            method: 'post'\n        };\n        if (this.get('session.features.acdNormalizedMessages')) {\n            if (\n                message.normalizedMessage &&\n                message.normalizedMessage.content &&\n                message.normalizedMessage.content.length > 0 &&\n                message.normalizedMessage.content[0].attachment\n            ) {\n                if (message.normalizedMessage.content[0].attachment.mime === 'image/vnd.genesys.sticker')\n                    options.data.stickerIds = [message.normalizedMessage.content[0].attachment.id];\n                else options.data.mediaIds = [message.normalizedMessage.content[0].attachment.id];\n            } else if (message.messagingTemplate) {\n                options.data.messagingTemplate = message.messagingTemplate;\n            } else {\n                options.data.textBody = message.normalizedMessage.text;\n            }\n        } else {\n            if (message.media && message.media.length > 0 && message.attachmentId) {\n                options.data.mediaIds = [message.attachmentId];\n            } else if (message.stickers && message.stickers.length > 0) {\n                options.data.stickerIds = [message.stickers[0].id];\n            } else if (message.messagingTemplate) {\n                options.data.messagingTemplate = message.messagingTemplate;\n            } else {\n                options.data.textBody = message.textBody;\n            }\n        }\n        return this.makeRequest(url, options);\n    },\n\n    createMediaAttachment: function (interactionId, communicationId) {\n        const url = this.createMediaAttachmentUri(interactionId, communicationId);\n        return this.makeRequest(url, {}, 'post');\n    },\n\n    createMessage: function (options, useExistingConversation) {\n        const url = this.createCommunicationUri('messages');\n        const isExternalContact = Ember.get(options, 'entity.entity.type') === 'externalcontacts/contact';\n        const requestOptions = {\n            data: {\n                queueId: options.queueId,\n                toAddress: options.entity.value,\n                useExistingConversation,\n                toAddressMessengerType: options.toAddressMessengerType,\n                useUserFromAddress: options.useUserFromAddress,\n                externalContactId: isExternalContact ? options.entity.id : null\n            }\n        };\n        return this.makeRequest(url, requestOptions, 'post');\n    },\n\n    getMediaAttachment: function (interactionId, communicationId, mediaId) {\n        const url = this.getMediaAttachmentUri(interactionId, communicationId, mediaId);\n        return this.makeRequest(url, {}, 'get');\n    },\n\n    getSMSDetails: function (interactionId, smsIds) {\n        if (_.isEmpty(smsIds)) {\n            return Promise.resolve([]);\n        }\n        const url = this.smsMessageBatchUri(interactionId);\n        const options = {\n            data: smsIds\n        };\n        return this.makeRequest(url, options, 'post');\n    },\n\n    getMessageSupportedContent: function (interaction) {\n        const subMessageType = interaction.get('subMessageType');\n        if (subMessageType) {\n            const integrationId = interaction.get(\n                'participantForCustomer.messages.firstObject.toAddress.addressNormalized'\n            );\n            const deploymentId = interaction.get('participantForCustomer.messages.firstObject.toAddress.addressRaw');\n            if (integrationId && subMessageType !== 'webmessaging') {\n                const integrationUri = this.getSupportedContentUri(subMessageType, integrationId);\n                return this.makeRequest(integrationUri, {}, 'get');\n            } else if (deploymentId) {\n                return this.getDeploymentConfig(deploymentId, true);\n            }\n        }\n\n        return Ember.RSVP.reject(\n            new Error('Missing integration Id or sub message type from interaction ', Ember.get(interaction, 'id'))\n        );\n    },\n\n    getDeploymentConfig(deploymentId, getSupportedContent = false) {\n        if (deploymentId) {\n            const deploymentConfigUri = this.getDeploymentConfigUri(deploymentId, getSupportedContent);\n            return this.makeRequest(deploymentConfigUri, {}, 'get');\n        }\n        return Ember.RSVP.reject(new Error('Missing deployment Id', deploymentId));\n    },\n\n    getMessagingSettings(subMessageType, integrationId) {\n        if (integrationId && subMessageType) {\n            const integrationIdConfigUri = this.getIntegrationConfigUri(subMessageType, integrationId);\n            return this.makeRequest(integrationIdConfigUri, {}, 'get');\n        }\n        return Ember.RSVP.reject(new Error(`Missing integration Id: ${integrationId} or subtype: ${subMessageType}`));\n    },\n\n    createConversationSummaryFeedback(conversationId, summaryId, data) {\n        if (conversationId && summaryId) {\n            const url = this.getConversationSummaryFeedbackUri(conversationId, summaryId);\n            const options = data ? { data } : {};\n            return this.makeRequest(url, options, 'post');\n        }\n        return Ember.RSVP.reject(new Error(`Missing conversation Id: ${conversationId} or summary Id: ${summaryId}`));\n    }\n});\n","define(\"connections-ui/services/conversation\", [\"exports\", \"ember-purecloud-components/services/conversation\"], function (_exports, _conversation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _conversation.default;\n    }\n  });\n});\n","import CookiesService from 'ember-cookies/services/cookies';\n\nexport default CookiesService;\n","import { observer } from '@ember/object';\nimport Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { Service, inject, computed, Evented } = Ember;\n\nconst notificationTag = 'device-list-updated';\n\nfunction arrayComparerByDeviceId(otherArray) {\n    return current => {\n        const itemInOtherArray =\n            otherArray.filter(other => {\n                return other.deviceId === current.deviceId;\n            }).length === 0;\n\n        return itemInOtherArray;\n    };\n}\n\nfunction diffListsByDeviceId(existingList, newList) {\n    const itemsRemoved = (existingList || []).filter(arrayComparerByDeviceId(newList));\n    const itemsAdded = newList.filter(arrayComparerByDeviceId(existingList || []));\n\n    return { added: itemsAdded, removed: itemsRemoved };\n}\n\nfunction sanitizeDeviceLabel(deviceLabel) {\n    const idRegex = /(.*)\\s?\\(.*/;\n    const defaultTextRegex = /^(.*\\s-\\s)/;\n\n    // Remove the trailing numbers\n    let sanitizedLabel = deviceLabel ? deviceLabel.replace(idRegex, '$1').trim() : '';\n\n    // Remove the 'Default - ' text added by the browser\n    sanitizedLabel = sanitizedLabel ? sanitizedLabel.replace(defaultTextRegex, '').trim() : '';\n\n    return sanitizedLabel;\n}\n\nexport default Service.extend(Evented, LoggerMixin, {\n    session: inject.service(),\n    webrtcSettings: inject.service(),\n    webrtcSdkService: inject.service('webrtcSdk'),\n    intl: inject.service(),\n    phone: inject.service(),\n    chat: inject.service(),\n    settings: inject.service(),\n    feature: inject.service(),\n\n    selectedProfileId: null,\n    vanillaProfiles: [],\n    profiles: [],\n\n    microphone: null,\n    camera: null,\n    outputDevice: null,\n    notificationDevice: null,\n\n    notification: inject.service('notification-proxy'),\n    incomingInvitations: Ember.A(),\n    headset: inject.service(),\n\n    deviceUpdateDelay: 1500,\n    deviceChanges: null,\n    recentlyConnectedDevices: null,\n    allowDisableProfileNotifications: Ember.computed.readOnly(\n        'session.features.webrtcDisableDeviceProfileNotifications'\n    ),\n    // Returns settings once the webrtc-settings service has initialized and fetched settings.\n    profileSettingsPromise: computed.readOnly('webrtcSettings.userSettingsPromise'),\n    allowDefaultProfiles: computed.reads('session.features.webrtcDefaultDeviceProfile'),\n    initProfiles: observer('allowDefaultProfiles', async function () {\n        // Fetch profiles again when we have a value here.\n        await this._fetchProfiles();\n    }),\n\n    async init() {\n        this._super(...arguments);\n        this.get('webrtcSdkService').on('mediaStateChange', this._handleMediaStateChange.bind(this));\n        this.get('webrtcSettings').on('sdkSettingsUpdate', async () => {\n            await this._updateVolumes();\n        });\n        await this._fetchProfiles();\n        const currentMediaState = this.get('webrtcSdkService.mediaState');\n        if (currentMediaState) {\n            this._handleMediaStateChange(currentMediaState);\n        }\n    },\n\n    async _fetchProfiles() {\n        this.logger.debug('Fetching device profiles');\n        const settings = await this.get('profileSettingsPromise');\n        const selectedProfile = (settings.directorySettings && settings.directorySettings.selectedProfile) || '';\n        const defaultProfileId = settings.directorySettings.defaultProfileId;\n        const defaultExists =\n            settings.directorySettings &&\n            settings.directorySettings.profiles &&\n            settings.directorySettings.profiles.find(profile => profile.id === defaultProfileId);\n\n        // If a default device profile isn't saved or no longer exists, resort to the last selected profile or computer settings.\n        this.setProperties({\n            selectedProfileId: defaultExists && this.get('allowDefaultProfiles') ? defaultProfileId : selectedProfile,\n            vanillaProfiles: (settings.directorySettings && settings.directorySettings.profiles) || []\n        });\n    },\n\n    async _handleMediaStateChange(mediaState) {\n        if (!mediaState.hasMicPermissions) {\n            return;\n        }\n\n        const camerasDiff = diffListsByDeviceId(this.get('mediaState.videoDevices'), mediaState.videoDevices);\n        const microphonesDiff = diffListsByDeviceId(this.get('mediaState.audioDevices'), mediaState.audioDevices);\n        const outputDevicesDiff = diffListsByDeviceId(this.get('mediaState.outputDevices'), mediaState.outputDevices);\n\n        const isInitialUpdate = !this.get('mediaState');\n\n        const added = {\n            cameras: camerasDiff.added,\n            microphones: microphonesDiff.added,\n            outputDevices: outputDevicesDiff.added,\n            total: camerasDiff.added.length + microphonesDiff.added.length + outputDevicesDiff.added.length\n        };\n        const removed = {\n            cameras: camerasDiff.removed,\n            microphones: microphonesDiff.removed,\n            outputDevices: outputDevicesDiff.removed,\n            total: camerasDiff.removed.length + microphonesDiff.removed.length + outputDevicesDiff.removed.length\n        };\n        this.set('mediaState', mediaState);\n        await this._updateProfileAvailability();\n        await this._maybeFixSelectedProfile();\n\n        if (added.total && !isInitialUpdate) {\n            this._updateRecentlyConnectedDevices(added);\n            await this._conditionallyShowToastForAddedDevices(added);\n        }\n\n        this.trigger('deviceListsUpdated', { added, removed });\n    },\n\n    async _updateProfileAvailability() {\n        const profiles = this.get('vanillaProfiles').map(profile => {\n            let canBeSelected = true;\n            let matchingCamera = null;\n            let matchingOutputDevice = null;\n            let matchingMicrophone = null;\n            let matchingNotificationDevice = null;\n\n            if (profile.camera) {\n                matchingCamera = this._findMatchingDevice(this.get('mediaState.videoDevices'), profile.camera);\n                const profileCameraIsNotDefault = profile.camera.deviceId !== 'default';\n                if (!matchingCamera && profileCameraIsNotDefault && !profile.validWithoutCamera) {\n                    canBeSelected = false;\n                }\n            }\n            if (profile.microphone) {\n                matchingMicrophone = this._findMatchingDevice(this.get('mediaState.audioDevices'), profile.microphone);\n                if (!matchingMicrophone) {\n                    canBeSelected = false;\n                }\n            }\n            if (profile.outputDevice) {\n                matchingOutputDevice = this._findMatchingDevice(\n                    this.get('mediaState.outputDevices'),\n                    profile.outputDevice\n                );\n                if (!matchingOutputDevice) {\n                    canBeSelected = false;\n                }\n            }\n            if (profile.notificationDevice) {\n                matchingNotificationDevice = this._findMatchingDevice(\n                    this.get('mediaState.outputDevices'),\n                    profile.notificationDevice\n                );\n                if (!matchingNotificationDevice) {\n                    canBeSelected = false;\n                }\n            }\n            return Object.assign({}, profile, {\n                canBeSelected: !!canBeSelected,\n                camera: matchingCamera || profile.camera,\n                microphone: matchingMicrophone || profile.microphone,\n                outputDevice: matchingOutputDevice || profile.outputDevice,\n                notificationDevice: matchingNotificationDevice || profile.outputDevice\n            });\n        });\n\n        this.set('profiles', profiles);\n\n        const settings = await this.get('profileSettingsPromise');\n        const defaultProfileId = settings.directorySettings.defaultProfileId;\n        if (this.get('selectableProfiles').findBy('id', defaultProfileId)) {\n            this.setProfile(defaultProfileId);\n        }\n    },\n\n    async _maybeFixSelectedProfile() {\n        // start with default devices\n        let camera = this.mediaState.videoDevices && this.mediaState.videoDevices[0];\n        let mic = this.mediaState.audioDevices && this.mediaState.audioDevices[0];\n        let outputDevice = this.mediaState.outputDevices && this.mediaState.outputDevices[0];\n        let notificationDevice = this.mediaState.outputDevices && this.mediaState.outputDevices[0];\n        const currentProfile = this.get('profiles').findBy('id', this.get('selectedProfileId'));\n        const hasOutputDeviceSupport = this.mediaState.hasOutputDeviceSupport;\n\n        // check if selectedProfile is valid\n        if (currentProfile) {\n            const profileCamera = this._findMatchingDevice(this.mediaState.videoDevices, currentProfile.camera);\n            const profileMic = this._findMatchingDevice(this.mediaState.audioDevices, currentProfile.microphone);\n            const profileOutputDevice = this._findMatchingDevice(\n                this.mediaState.outputDevices,\n                currentProfile.outputDevice\n            );\n            const profileNotificationDevice = this._findMatchingDevice(\n                this.mediaState.outputDevices,\n                currentProfile.notificationDevice\n            );\n\n            const cameraValid =\n                currentProfile.validWithoutCamera ||\n                profileCamera ||\n                (currentProfile.camera && currentProfile.camera.deviceId === 'default');\n            const outputValid = !hasOutputDeviceSupport || profileOutputDevice;\n            const notificationsValid = !hasOutputDeviceSupport || profileNotificationDevice;\n\n            const profileValid = cameraValid && outputValid && notificationsValid && profileMic;\n\n            if (profileValid) {\n                camera = profileCamera || camera;\n                mic = profileMic;\n                outputDevice = profileOutputDevice || outputDevice;\n                notificationDevice = profileNotificationDevice || notificationDevice;\n            } else {\n                this._showNotificationForCurrentProfileNoLongerValid();\n\n                return await this.setProfile('');\n            }\n        }\n\n        // make sure devices match what is in the profile\n        const cameraMatches = this.get('camera') === camera;\n        const micMatches = this.get('microphone') === mic;\n        const outputDeviceMatches = !hasOutputDeviceSupport || this.get('outputDevice') === outputDevice;\n        const notificationDeviceMatches =\n            !hasOutputDeviceSupport || this.get('notificationDevice') === notificationDevice;\n\n        if (!cameraMatches || !micMatches || !outputDeviceMatches || !notificationDeviceMatches) {\n            const newDevices = {\n                camera,\n                microphone: mic,\n                outputDevice,\n                notificationDevice\n            };\n            this.setProperties(newDevices);\n            await this._updateVolumes();\n\n            this.get('webrtcSdkService').setDevices(newDevices);\n            this.trigger('profileDevicesChanged', newDevices);\n        }\n    },\n\n    async _updateVolumes() {\n        const outputDeviceVolumes = await this._getVolumesForDevice(this.get('outputDevice'));\n        this.get('phone').updateVolumes(outputDeviceVolumes);\n\n        this.get('webrtcSdkService').setCallVolume(outputDeviceVolumes.callVolume);\n\n        const notificationDeviceVolumes = await this._getVolumesForDevice(this.get('notificationDevice'));\n        this.get('chat').updateVolumes(notificationDeviceVolumes);\n    },\n\n    async _getVolumesForDevice(device) {\n        const defaults = {\n            callVolume: 100,\n            ringerVolume: 100,\n            chatNotificationVolume: 100,\n            interactionNotificationVolume: 100\n        };\n\n        if (!device) {\n            return defaults;\n        }\n\n        // It is possible to have saved settings for a device but also for that device to be the default system device with its own default system settings.\n        const sanitizedLabel = device.deviceId === 'default' ? 'default' : sanitizeDeviceLabel(device.label);\n        const settings = await this.get('profileSettingsPromise');\n        const volumes = settings.volumeSettings ? settings.volumeSettings[sanitizedLabel] : undefined;\n        return volumes || defaults;\n    },\n\n    _getActionHandler(label, { profileToSet, createProfile, showOptions } = {}) {\n        return {\n            label,\n            action: notification => {\n                if (profileToSet) {\n                    this.setProfile(profileToSet.id);\n                } else if (createProfile || showOptions) {\n                    this._openPhoneSettingsTab();\n                }\n\n                if (createProfile) {\n                    Ember.run.later(() => this.trigger('showProfileSelection'));\n                }\n\n                notification.hide();\n            }\n        };\n    },\n\n    _openPhoneSettingsTab() {},\n\n    _findMatchingDevice(deviceList, device) {\n        const foundDevice = deviceList.find(deviceA => this._deviceMatches(deviceA, device));\n\n        return foundDevice;\n    },\n\n    _deviceMatches(deviceA, deviceB) {\n        if (!deviceA || !deviceB) {\n            return false;\n        }\n\n        const hasSameId = deviceA.deviceId === deviceB.deviceId;\n\n        const formattedNameA = deviceA.label ? deviceA.label.replace(/(.*)\\s?\\(.*/, '$1') : '';\n        const formattedNameB = deviceB.label ? deviceB.label.replace(/(.*)\\s?\\(.*/, '$1') : '';\n        const hasSameName = formattedNameA === formattedNameB;\n\n        return hasSameId || hasSameName;\n    },\n\n    async _conditionallyShowToastForAddedDevices(addedDevices) {\n        const settings = await this.get('profileSettingsPromise');\n        if (this.get('allowDisableProfileNotifications') && settings.directorySettings.disableProfileNotifications) {\n            return;\n        }\n        /*\n          DESIRED BEHAVIOR\n          When a new device is connected:\n            if (theres a profile that contains newly connected device)\n              show toast asking if you'd like to switch to profile containing new device\n            else\n              ask if you'd like to create a new profile with this device\n        */\n        const filteredSelectableProfiles = [];\n\n        // find selectable profiles that contain the new device(s)\n        this.get('selectableProfiles').forEach(profile => {\n            if (addedDevices.cameras.length && this._deviceMatches(profile.camera, addedDevices.cameras[0])) {\n                filteredSelectableProfiles.push(profile);\n            } else if (\n                addedDevices.microphones.length &&\n                this._deviceMatches(profile.microphone, addedDevices.microphones[0])\n            ) {\n                filteredSelectableProfiles.push(profile);\n            } else if (\n                addedDevices.outputDevices.length &&\n                this._deviceMatches(profile.outputDevice, addedDevices.outputDevices[0])\n            ) {\n                filteredSelectableProfiles.push(profile);\n            } else if (\n                addedDevices.outputDevices.length &&\n                this._deviceMatches(profile.notificationDevice, addedDevices.outputDevices[0])\n            ) {\n                filteredSelectableProfiles.push(profile);\n            }\n        });\n\n        const intl = this.get('intl');\n\n        // devices added and profiles are available\n        if (filteredSelectableProfiles.length) {\n            const title = intl.t('deviceProfiles.notifications.hardwareChangeTitle');\n            let message;\n            let actionHandlers = {};\n\n            if (filteredSelectableProfiles.length > 1) {\n                message = intl.t('deviceProfiles.notifications.newDevicesMatchMultipleProfiles');\n            } else {\n                message = intl.t('deviceProfiles.notifications.profilesAvailable');\n            }\n\n            if (filteredSelectableProfiles.length > 2) {\n                actionHandlers.other = this._getActionHandler(intl.t('deviceProfiles.notifications.otherLabel'), {\n                    showOptions: true\n                });\n            }\n\n            actionHandlers = filteredSelectableProfiles\n                .slice(0, 2)\n                .map(item => {\n                    return this._getActionHandler(Ember.Handlebars.Utils.escapeExpression(item.name), {\n                        profileToSet: item\n                    });\n                })\n                .reduce((acc, cur, i) => {\n                    acc[i] = cur;\n                    return acc;\n                }, actionHandlers);\n\n            this.get('notification').info(title, message, {\n                target: this,\n                tag: notificationTag,\n                actionHandlers\n            });\n        } else {\n            this.get('notification').info(\n                intl.t('deviceProfiles.notifications.hardwareChangeTitle'),\n                intl.t('deviceProfiles.notifications.promptAddProfileForNewDevice'),\n                {\n                    target: this,\n                    tag: notificationTag,\n                    actionHandlers: {\n                        yes: {\n                            label: intl.t('deviceProfiles.notifications.yesButton'),\n                            action: async notification => {\n                                notification.hide();\n                                await this.get('settings').openPreference('sound');\n                                this.trigger('showProfileSelection');\n                            }\n                        },\n                        no: {\n                            label: intl.t('deviceProfiles.notifications.noButton'),\n                            action: notification => {\n                                notification.hide();\n                            }\n                        }\n                    }\n                }\n            );\n        }\n    },\n\n    async _showNotificationForCurrentProfileNoLongerValid(hasNonDefaultDevices) {\n        const settings = await this.get('profileSettingsPromise');\n        if (this.get('allowDisableProfileNotifications') && settings.directorySettings.disableProfileNotifications) {\n            return;\n        }\n\n        const intl = this.get('intl');\n        const selectableProfiles = this.get('selectableProfiles');\n\n        // has profiles to choose from\n        if (selectableProfiles.length) {\n            let actionHandlers = {};\n\n            // option to go to the settings if there are too many possibilities\n            if (selectableProfiles.length > 2) {\n                actionHandlers.other = this._getActionHandler(intl.t('deviceProfiles.notifications.otherLabel'), {\n                    showOptions: true\n                });\n            }\n\n            if (selectableProfiles.length >= 2) {\n                actionHandlers = selectableProfiles\n                    .slice(0, 2)\n                    .map(item => {\n                        return this._getActionHandler(Ember.Handlebars.Utils.escapeExpression(item.name), {\n                            profileToSet: item\n                        });\n                    })\n                    .reduce((acc, cur, i) => {\n                        acc[i] = cur;\n                        return acc;\n                    }, actionHandlers);\n            }\n\n            let message = !this.get('selectedProfileId')\n                ? intl.t('deviceProfiles.notifications.usingDefaultTextWithOptions')\n                : intl.t('deviceProfiles.notifications.switchDefaultTextWithOptions');\n\n            if (selectableProfiles.length === 1) {\n                message = intl.t('deviceProfiles.notifications.profileAvailable', { name: selectableProfiles[0].name });\n                if (this.get('selectedProfileId')) {\n                    message = intl.t('deviceProfiles.notifications.switchDefaultProfileAvailable', {\n                        name: selectableProfiles[0].name\n                    });\n                }\n\n                actionHandlers = {\n                    yes: this._getActionHandler(intl.t('deviceProfiles.notifications.yesButton'), {\n                        profileToSet: selectableProfiles[0]\n                    }),\n                    no: this._getActionHandler(intl.t('deviceProfiles.notifications.noButton'))\n                };\n            }\n\n            this.get('notification').info(intl.t('deviceProfiles.notifications.hardwareChangeTitle'), message, {\n                target: this,\n                tag: notificationTag,\n                actionHandlers\n            });\n            return;\n        }\n\n        // does not have profiles to choose from but has non default devices\n        if (hasNonDefaultDevices) {\n            this.get('notification').info(\n                intl.t('deviceProfiles.notifications.hardwareChangeTitle'),\n                intl.t('deviceProfiles.notifications.switchDefaultTextPromptCreateProfile'),\n                {\n                    target: this,\n                    tag: notificationTag,\n                    actionHandlers: {\n                        yes: this._getActionHandler(intl.t('deviceProfiles.notifications.yesButton'), {\n                            createProfile: true\n                        }),\n                        no: this._getActionHandler(intl.t('deviceProfiles.notifications.noButton'))\n                    }\n                }\n            );\n\n            return;\n        }\n\n        // no profiles and no devices that aren't default\n        this.get('notification').info(\n            intl.t('deviceProfiles.notifications.hardwareChangeTitle'),\n            intl.t('deviceProfiles.notifications.switchDefaultText'),\n            {\n                target: this,\n                tag: notificationTag\n            }\n        );\n    },\n\n    _updateRecentlyConnectedDevices(addedDevices) {\n        const deviceConfig = {};\n\n        if (addedDevices.cameras && addedDevices.cameras.length) {\n            deviceConfig.camera = addedDevices.cameras[0];\n        }\n        if (addedDevices.microphones && addedDevices.microphones.length) {\n            deviceConfig.microphone = addedDevices.microphones[0];\n        }\n        if (addedDevices.outputDevices && addedDevices.outputDevices.length) {\n            deviceConfig.outputDevice = addedDevices.outputDevices[0];\n        }\n\n        this.set('recentlyConnectedDevices', deviceConfig);\n    },\n\n    // Select an already created profile.\n    async setProfile(profileId, skipProfileSave) {\n        this.set('recentlyConnectedDevices', null);\n        if (!skipProfileSave) {\n            this.get('webrtcSettings').updateSetting('directorySettings.selectedProfile', profileId);\n        }\n\n        this.set('selectedProfileId', profileId);\n        await this._maybeFixSelectedProfile();\n        await this._updateVolumes();\n    },\n\n    selectableProfiles: computed('profiles', function () {\n        return Ember.A(this.get('profiles').filter(p => p.canBeSelected));\n    }),\n\n    async deleteProfile(profileId) {\n        const profiles = [].concat(this.get('vanillaProfiles'));\n        const profileObj = profiles.find(p => p.id === profileId);\n        const index = profiles.indexOf(profileObj);\n        profiles.splice(index, 1);\n        this.set('vanillaProfiles', profiles);\n\n        if (this.get('selectedProfileId') === profileId) {\n            await this.setProfile('');\n        }\n\n        // Remove profile from stored profiles.\n        const settingsService = this.get('webrtcSettings');\n        await settingsService.updateSetting('directorySettings.profiles', profiles);\n        await this._updateProfileAvailability();\n    },\n\n    // Profile creation.\n    async saveAndSelectProfile(profile) {\n        try {\n            const vanillaProfiles = [].concat(this.get('vanillaProfiles'));\n            let savedProfile = vanillaProfiles.find(p => p.id === profile.id);\n\n            if (!savedProfile) {\n                vanillaProfiles.push(profile);\n            } else {\n                const index = vanillaProfiles.indexOf(savedProfile);\n                vanillaProfiles.splice(index, 1, profile);\n            }\n\n            this.set('vanillaProfiles', vanillaProfiles);\n\n            const settings = await this.get('profileSettingsPromise');\n            settings.directorySettings.selectedProfile = profile.id;\n            settings.directorySettings.profiles = this.get('vanillaProfiles');\n\n            await this.get('webrtcSettings').updateSettings(settings);\n            await this._updateProfileAvailability();\n            // Set the profile but skip the save because it's already been updated as the selected.\n            await this.setProfile(profile.id, true);\n        } catch (error) {\n            this.logger.error('Failed to save and select device profile', error);\n        }\n    },\n\n    clearRecentlyConnectedDevices() {\n        this.set('recentlyConnectedDevices', null);\n    }\n});\n","import Ember from 'ember';\nimport { Client } from 'iframe-coordinator/dist/client.js';\nimport { setCustomAttribute } from 'ember-purecloud-components/utils/newrelic-legacy';\nimport { getEnvDetails } from 'connections-ui/utils/net';\n\nconst { run } = Ember;\nconst defaultLocale = 'en-us';\nconst hostResponseTimeout = 10000;\nconst embeddedStatus = window.self !== window.parent;\nconst urlSearchParams = new URLSearchParams(window.location.search);\nconst isLocallyIntegrated = urlSearchParams.get('host-is-local') === 'false';\nconst integrationContext = urlSearchParams.get('context');\n\nexport const EmbeddedEvents = {\n    ENVIRONMENTAL_DATA: 'environmentalData',\n    NOTIFICATION: 'notificationEvent',\n    DISMISS_NOTIFICATION: 'dismissToast',\n    SHOW_NOTIFICATION: 'showToast',\n    PAGE_DATA: 'page.data',\n    LAUNCH_VIDEO_WITH_PERSON_BY_ID: 'launchVideoWithPersonById',\n    LAUNCH_VIDEO_PROVIDER_WITH_PERSON_BY_ID: 'launchVideoProviderWithPersonById',\n    START_CHAT_WITH_PERSON_BY_ID: 'startChatWithPersonById',\n    UPDATE_PROFILE_IMAGE: 'updateProfileImage',\n    START_CHAT_BY_JID: 'startChatByJid',\n    FAVORITE_ENTITY_BY_ID: 'favoriteEntityById',\n    START_CALL_PERSON_BY_ID: 'callPersonById',\n    START_CALL_BY_NUMBER: 'phone.makeCall',\n    USER_GENERAL_FIELD_UPDATED: 'userGeneralFieldUpdated',\n    EMERGENCY_ADDR_UPDATED: 'emergencyAddrUpdated',\n    STREAMING_TOPIC_SUBSCRIBE: 'streamingTopicSubscribe',\n    STREAMING_TOPIC_UNSUBSCRIBE: 'streamingTopicUnsubscribe'\n};\n\nconst LISTENERS = {\n    NOTIFICATION_ACTION: 'toastAction',\n    ENTITY_FAVORITE_ACTION: 'entityFavoriteAction',\n    STREAMING_TOPIC_MESSAGE: 'streamingTopicMessage',\n    STREAMING_TOPIC_SUBSCRIBE_ERROR: 'streamingTopicSubscribeError'\n};\n\nclass IframeClientTimeoutError extends Error {\n    constructor(event, timeout) {\n        super('Iframe coordinator client event listener timed out');\n        this.name = 'IframeClientTimeoutError';\n        this.event = event;\n        this.timeout = timeout;\n    }\n}\n\nexport default Ember.Service.extend({\n    intl: Ember.inject.service(),\n    stashLogger: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    application: Ember.inject.service(),\n    favorites: Ember.inject.service(),\n    session: Ember.inject.service(),\n    pigeon: Ember.inject.service(),\n\n    isEmbedded: embeddedStatus,\n\n    getHostOrigin() {\n        let env = getEnvDetails();\n        if (isLocallyIntegrated) {\n            return `https://apps.${env.runtime.currentDomainName}/`;\n        } else {\n            return env.local ? 'https://localhost:4300' : `${window.location.origin}`;\n        }\n    },\n\n    setLocale(locale) {\n        if (!locale) {\n            return;\n        }\n\n        setCustomAttribute('uiLanguage', locale);\n        return this.get('intl').setLocale(locale);\n    },\n\n    checkForHostRedirect() {\n        // noop for now\n    },\n\n    init() {\n        this._super(...arguments);\n        this.initializeFrame();\n    },\n\n    async initializeFrame() {\n        await this.initializeClient();\n    },\n\n    async initializeClient() {\n        if (integrationContext === 'adminui') {\n            this.set('application.adminUIContext', true);\n            return;\n        }\n\n        // Do not initialize client if not rendered in a frame\n        if (!this.get('isEmbedded')) {\n            this.setLocale(defaultLocale);\n            return;\n        }\n\n        // Only initialize client once\n        if (this.get('client')) {\n            return;\n        }\n\n        const client = new Client({\n            hostOrigin: this.getHostOrigin()\n        });\n\n        this.set('client', client);\n\n        const environmentalDataListener = new Promise((resolve, reject) => {\n            client.addListener(EmbeddedEvents.ENVIRONMENTAL_DATA, data => {\n                this.set('hostRootUrl', data.hostRootUrl);\n\n                if (data.custom) {\n                    this.set('application.browserHidden', data.custom.browserHidden);\n                }\n\n                resolve(this.setLocale(data.locale));\n            });\n\n            run.later(\n                this,\n                () => reject(new IframeClientTimeoutError(EmbeddedEvents.ENVIRONMENTAL_DATA, hostResponseTimeout)),\n                hostResponseTimeout\n            );\n        });\n\n        client.start();\n\n        try {\n            await environmentalDataListener;\n        } catch (e) {\n            this.setLocale(defaultLocale);\n            this.get('stashLogger').error(e.message, e);\n        }\n\n        this.registerEventHandlers();\n    },\n\n    //==========================================================\n    // Handle events from IFC\n    //==========================================================\n\n    registerEventHandlers() {\n        if (!this.get('client')) {\n            return;\n        }\n\n        const client = this.get('client');\n        Object.keys(LISTENERS).forEach(key => {\n            client.messaging.addListener(LISTENERS[key], event => {\n                if (event && event.payload) {\n                    this[LISTENERS[key]](event);\n                }\n            });\n        });\n    },\n\n    toastAction(event) {\n        const { action, id } = event.payload;\n        this.get('notification').handleNotificationAction(action, id);\n    },\n\n    entityFavoriteAction(event) {\n        this.get('favorites').handleEntityFavoriteAction(event.payload);\n    },\n\n    streamingTopicMessage(message) {\n        this.get('pigeon').onMessage('streaming', message.payload);\n    },\n    streamingTopicSubscribeError(message) {\n        this.get('pigeon').onSubscriptionError(message.payload);\n    },\n\n    //==========================================================\n    // Publish events to IFC\n    //==========================================================\n\n    requestNotification(notification) {\n        const client = this.get('client');\n\n        if (!client || !notification) {\n            return;\n        }\n        client.requestNotification(notification);\n    },\n\n    publishMessage(topic, payload) {\n        const client = this.get('client');\n\n        if (!topic || !payload || !client) {\n            return;\n        }\n\n        return client.publish({\n            topic,\n            payload\n        });\n    },\n\n    dismissNotification(id) {\n        this.publishMessage(EmbeddedEvents.DISMISS_NOTIFICATION, { id });\n    },\n\n    showNotification(options) {\n        this.publishMessage(EmbeddedEvents.SHOW_NOTIFICATION, { options });\n    },\n\n    notifyAcdCount(count) {\n        this.publishMessage(EmbeddedEvents.ACDCOUNT_EVENT, { count });\n    },\n\n    sendSidebarEvent(event, panel, key, value) {\n        if (!this.get('isEmbedded')) {\n            return;\n        }\n\n        const options = {\n            type: event\n        };\n\n        if (panel) {\n            options.panel = panel;\n        }\n\n        if (key) {\n            options.key = key;\n        }\n\n        if (value) {\n            options.value = value;\n        }\n\n        this.publishMessage(EmbeddedEvents.SIDEBAR_EVENT, options);\n    },\n\n    sendNavigationEvent({ hash }) {\n        const client = this.get('client');\n\n        if (!client || !hash) return;\n\n        const url = new URL(window.location.origin);\n        url.hash = hash;\n\n        if (!url) {\n            this.get('stashLogger').error('Unable to parse provided hash into url.', {\n                hash\n            });\n            return;\n        }\n\n        client.requestNavigation({ url: url.href });\n    },\n\n    sendPageData(options) {\n        this.publishMessage(EmbeddedEvents.PAGE_DATA, options);\n    },\n\n    launchVideoWithPersonById(personId) {\n        this.publishMessage(EmbeddedEvents.LAUNCH_VIDEO_WITH_PERSON_BY_ID, personId.toString());\n    },\n\n    launchVideoProviderWithPersonById(personId, providerId) {\n        this.publishMessage(EmbeddedEvents.LAUNCH_VIDEO_PROVIDER_WITH_PERSON_BY_ID, { personId, providerId });\n    },\n\n    startChatWithPersonById(personId) {\n        this.publishMessage(EmbeddedEvents.START_CHAT_WITH_PERSON_BY_ID, personId.toString());\n    },\n\n    notifyUserGeneralFieldUpdated(entityId) {\n        // trigger userGeneralFieldUpdated event to Web-Directory if entity is current user.\n        if (entityId === this.get('session.person.id')) {\n            this.publishMessage(EmbeddedEvents.USER_GENERAL_FIELD_UPDATED, {});\n        }\n    },\n\n    notifyEmergencyAddrUpdated() {\n        this.publishMessage(EmbeddedEvents.EMERGENCY_ADDR_UPDATED, {});\n    },\n\n    notifyUpdateProfileImage(images, entityJid) {\n        this.publishMessage(EmbeddedEvents.UPDATE_PROFILE_IMAGE, {\n            image: images,\n            entityJid\n        });\n    },\n\n    startChatByJid(jid) {\n        this.publishMessage(EmbeddedEvents.START_CHAT_BY_JID, { jid: jid.toString() });\n    },\n\n    favoriteEntityById(options) {\n        this.publishMessage(EmbeddedEvents.FAVORITE_ENTITY_BY_ID, options);\n    },\n\n    startCallPersonById(personId) {\n        this.publishMessage(EmbeddedEvents.START_CALL_PERSON_BY_ID, personId.toString());\n    },\n\n    startCallByNumber(phoneNumber) {\n        this.publishMessage(EmbeddedEvents.START_CALL_BY_NUMBER, { phoneNumber });\n    },\n\n    entityGeneralFieldUpdated(entityId, field) {\n        // trigger userGeneralFieldUpdated event to Web-Directory if entity is current user.\n        if (entityId === this.get('session.person.id')) {\n            this.publishMessage(EmbeddedEvents.USER_GENERAL_FIELD_UPDATED, field);\n        }\n    },\n\n    emergencyAdrUpdated(emergencyAdr) {\n        this.publishMessage(EmbeddedEvents.EMERGENCY_ADR_UPDATED, emergencyAdr);\n    },\n\n    streamingTopicSubscribe(topic) {\n        this.publishMessage(EmbeddedEvents.STREAMING_TOPIC_SUBSCRIBE, topic);\n    },\n\n    streamingTopicUnsubscribe(topic) {\n        this.publishMessage(EmbeddedEvents.STREAMING_TOPIC_UNSUBSCRIBE, topic);\n    }\n});\n","import Ember from 'ember';\nimport moment from '../utils/dates';\nimport EmergencyLocationUtil from '../utils/emergency-location-util';\nimport { isTesting } from 'connections-ui/utils/testing';\n\nconst { computed, inject } = Ember;\n\nconst POLL_INTERVAL = 1200000; //20min\n\nexport default Ember.Service.extend({\n    session: inject.service(),\n    ajax: Ember.inject.service(),\n    application: Ember.inject.service(),\n    intl: inject.service(),\n    logger: inject.service('stash-logger'),\n    addressformat: inject.service(),\n    embedded: inject.service(),\n\n    eLocation: null,\n    isAuthenticated: computed.reads('session.isAuthenticated'),\n    isEligibleForE911: false,\n    eLocationInlineWarning: null,\n    primaryVoice: null,\n\n    emergencyLocationData: computed(\n        'eLocation',\n        'isEligibleForE911',\n        'eLocationInlineWarning',\n        'primaryVoice',\n        function () {\n            return {\n                eLocation: this.get('eLocation'),\n                eLocationInlineWarning: this.get('eLocationInlineWarning'),\n                primaryVoice: this.get('primaryVoice'),\n                isEligibleForE911: this.get('isEligibleForE911')\n            };\n        }\n    ),\n\n    /**\n     * Gets emergency location\n     * @param  {string} phoneNumber the e164 formatted phone number paired with the emergency location being retrieved\n     * @return {promise} promise wraps object containing address location\n     */\n    getEmergencyLocation(phoneNumber) {\n        phoneNumber = !!phoneNumber ? phoneNumber : this.get('primaryVoice.number');\n        phoneNumber = this.get('addressformat').formatAddress(phoneNumber);\n\n        let url = this.get('application').pcV2Uri(`api/v2/carrierservices/integrations/emergencylocations/me`);\n        let options = {\n            data: {\n                phoneNumber\n            }\n        };\n        return this.get('ajax').request(url, options);\n    },\n\n    /**\n     * Fetches and loads primary contact information for user and sets primary number in service\n     * @param  {string} userId Optional userId for whom the primary contact information is fetched.\n     * @return {promise} returns promise containing number and also sets primaryVoice in this service\n     * @return {promise rejected} returns error message to display in notification\n     */\n    loadUserPrimaryNumber(userId) {\n        let url = this.get('application').pcV2Uri(`api/v2/users/me`);\n        if (userId) {\n            url = this.get('application').pcV2Uri(`api/v2/users/${userId}`);\n        }\n        return this.get('ajax')\n            .request(url)\n            .then(data => {\n                let number = null;\n                if (data && data.primaryContactInfo) {\n                    const primaryPhoneObject = data.primaryContactInfo.findBy('mediaType', 'PHONE');\n\n                    if (primaryPhoneObject && (primaryPhoneObject.address || primaryPhoneObject.display)) {\n                        number = this.get('addressformat').formatAddress(\n                            primaryPhoneObject.address || primaryPhoneObject.display\n                        );\n                        this.set('primaryVoice', {\n                            number,\n                            display: this.get('addressformat').formatAddressForDisplay(number)\n                        });\n                        return number;\n                    }\n                }\n                this.set('primaryVoice', {\n                    number,\n                    display: ''\n                });\n                this.set(\n                    'eLocationInlineWarning',\n                    this.get('intl').lookup('emergencyLocation.errors.primaryNumberNotFound')\n                );\n                return Ember.RSVP.reject({\n                    err: 'No primary number found',\n                    softError: this.get('intl').lookup('emergencyLocation.errors.primaryNumberNotFound')\n                });\n            })\n            .catch(err => {\n                if (err.softError) {\n                    return Ember.RSVP.reject(err);\n                }\n                this.set(\n                    'eLocationInlineWarning',\n                    this.get('intl').lookup('emergencyLocation.errors.primaryNumberLookup')\n                );\n                return Ember.RSVP.reject({\n                    err,\n                    hardError: this.get('intl').lookup('emergencyLocation.errors.primaryNumberLookup')\n                });\n            });\n    },\n\n    /**\n     * Fetches e911 eligibility status for a given phone number and sets isEligibleForE911 service property\n     * @param  {string} phoneNumber e164 formatted phone number that is checked for e911 eligibility\n     * @return {promise resolved} returns promise containing eligibility status\n     * @return {promise rejected} returns error message to display in notification\n     */\n    loadELocationEligibility(phoneNumber) {\n        let url = this.get('application').pcV2Uri(\n            'api/v2/carrierservices/integrations/emergencylocations/verifyphonenumber'\n        );\n        let options = {\n            data: {\n                phoneNumber\n            }\n        };\n        return this.get('ajax')\n            .post(url, options)\n            .then(data => {\n                if (data && data.supported) {\n                    this.set('isEligibleForE911', true);\n                    return data;\n                }\n                this.set('isEligibleForE911', false);\n                return Ember.RSVP.resolve({\n                    supported: false\n                });\n            })\n            .catch(err => {\n                this.set('isEligibleForE911', false);\n                return Ember.RSVP.reject({\n                    err,\n                    softError: this.get('intl').lookup('emergencyLocation.errors.e911IsSupported')\n                });\n            });\n    },\n\n    /**\n     *  Resets the eLocation property to an emty address.\n     */\n    clearElocation() {\n        const emptyAddress = {\n            id: '',\n            address: {\n                street1: '',\n                street2: '',\n                city: '',\n                state: '',\n                zipcode: '',\n                country: ''\n            },\n            did: '',\n            source: ''\n        };\n\n        this.set('eLocation', emptyAddress);\n    },\n\n    /**\n     * Refreshes the eLocation property containing the emergency location\n     * @param  {string} phoneNumber the e164 formatted phone number paired with the emergency location being retrieved\n     * @return {promise resolved} returns promise containing emergency address\n     * @return {promise rejected} returns error message to display in notification\n     */\n    refreshEmergencyLocation(phoneNumber) {\n        return this.getEmergencyLocation(phoneNumber)\n            .then(result => {\n                this.set('isEligibleForE911', true);\n                this.set('eLocation', result);\n\n                // Trigger an emergencyAddrUpdated event to Web-Directory.\n                this.get('embedded').notifyEmergencyAddrUpdated();\n            })\n            .catch(err => {\n                this.set('isEligibleForE911', false);\n                this.clearElocation();\n                const defaultMessage = this.get('intl').lookup('emergencyLocation.errors.e911LocationLookup', {\n                    number: this.get('primaryVoice.display')\n                });\n\n                const errorMessage = this.get('intl').lookup(EmergencyLocationUtil.getErrorString(err, defaultMessage));\n\n                // Trigger an emergencyAddrUpdated event to Web-Directory.\n                this.get('embedded').notifyEmergencyAddrUpdated();\n\n                return Ember.RSVP.reject({\n                    err,\n                    softError: errorMessage\n                });\n            });\n    },\n\n    /**\n     * Refreshes all emergency contact information properties:\n     *     1 - eLocation\n     *     2 - primaryVoice\n     *     3 - isEligibleForE911\n     * @return {promise} returns promise\n     */\n    refreshAllEmergencylocationInfo() {\n        this.set('eLocationInlineWarning', null);\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return Ember.RSVP.resolve();\n        }\n        if (!this.get('isAuthenticated')) {\n            return Ember.RSVP.resolve();\n        }\n        return this.loadUserPrimaryNumber()\n            .then(number => {\n                if (number) {\n                    return this.refreshEmergencyLocation(number);\n                }\n                this.clearElocation();\n                throw {\n                    err: 'Number not supported.',\n                    softError: this.get('intl').lookup('emergencyLocation.errors.e911NotEligible')\n                };\n            })\n            .catch(errObject => {\n                const messageBody = errObject.softError;\n                if (messageBody && !this.get('eLocationInlineWarning')) {\n                    this.set('eLocationInlineWarning', messageBody);\n                }\n\n                return Ember.RSVP.reject(errObject);\n            });\n    },\n\n    /**\n     * Begins polling to refresh all eLocation data\n     */\n    startPolling() {\n        if (isTesting) return;\n\n        const service = this;\n        const pollingIntervalInMinutes = moment.duration(POLL_INTERVAL).minutes();\n        let pollCounter = 0;\n        const pollingIntervalId = setInterval(() => {\n            this.get('logger').info(\n                `E911UI: Polling count: ${pollCounter++} - Polling time: ${moment().format()} - Polling every ${pollingIntervalInMinutes}min.`\n            );\n            service._refreshAllEmergencylocationInfo();\n        }, POLL_INTERVAL);\n        this.set('pollingIntervalId', pollingIntervalId);\n    },\n\n    init() {\n        this._super(...arguments);\n        if (this.get('session.features.emergencyLocation')) {\n            this.refreshAllEmergencylocationInfo().catch(() => {});\n            this.startPolling();\n        }\n    },\n\n    /**\n     * Wrapper function to put in runloop\n     */\n    _refreshAllEmergencylocationInfo() {\n        Ember.run.later(() => {\n            this.refreshAllEmergencylocationInfo().catch(() => {});\n        }, 100);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        clearInterval(this.get('pollingIntervalId'));\n    },\n\n    /**\n     * Sets eLocation on backend\n     * @param  {object} newAddress object\n     * @param  {string} number number to pair with newAddress\n     * @return {promise} returns promise\n     */\n    setElocation(newAddress, number) {\n        let url = this.get('application').pcV2Uri(`api/v2/carrierservices/integrations/emergencylocations/me`);\n        let options = {\n            data: {\n                did: number,\n                address: newAddress,\n                source: 'User'\n            }\n        };\n        return this.get('ajax')\n            .post(url, options)\n            .catch(err => {\n                let errorMessage = this.get('intl').lookup(EmergencyLocationUtil.getErrorString(err));\n                return Ember.RSVP.reject({\n                    err,\n                    hardError: errorMessage\n                });\n            });\n    },\n\n    /**\n     * Saves eLocation property on this service\n     * @param  {object} newAddress object\n     * @param  {string} number number to pair with newAddress\n     * @return {promise} returns promise\n     */\n    saveElocation(newAddress) {\n        if (!this.get('session.features.emergencyLocation')) {\n            return;\n        }\n        this.set('eLocationInlineWarning', null);\n        return this.loadUserPrimaryNumber()\n            .then(number => {\n                return this.setElocation(newAddress, number);\n            })\n            .then(() => {\n                return this.refreshAllEmergencylocationInfo();\n            });\n    }\n});\n","import Service from '@ember/service';\nimport Evented from '@ember/object/evented';\n\nexport const TOGGLE_EVENT = 'system.event.toggle';\nexport const TOGGLE_NAV_EVENT = 'system.event.navtoggle';\nexport const TOGGLE_ACTIVE_DRAWER_EVENT = 'system.event.drawerselect';\n\nconst eventsService = Service.extend(Evented, {\n    triggerEvent(event: any, payload: any) {\n        console.log('jrr: event triggered', {\n            event,\n            payload\n        });\n        this.trigger(event, payload);\n    }\n});\n\nexport default eventsService;\nexport class EventsService extends eventsService {}\n\ndeclare module '@ember/service' {\n    interface Registry {\n        events: EventsService;\n    }\n}\n","import Ember from 'ember';\nimport { createContactPojo } from 'connections-ui/utils/acd';\nconst { Service, inject, setProperties, get, computed } = Ember;\n\nexport const CONTACT_CHANGED_EVENT = 'contact-changed-event';\nexport const CONTACT_MERGED_EVENT = 'contact-merged-event';\n\nconst CONTACT_CHANGED = 'contact-changed';\nconst EXTERNAL_CONTACT = 'externalcontacts/contact';\nconst EXPANDED_PARTICIPANT_PURPOSES = ['customer', 'external'];\n\nconst TOPIC_PREFIX = 'v2.externalcontacts.contacts.';\n\n/**\n * Service supports expansion of external contacts for interactions and observation of changes associated with\n * with those contacts.  This dispatches an change event when an external contact is changed and a merge event\n * along with a change event when an external contact is merged with another contact\n */\nexport default Service.extend(Ember.Evented, {\n    store: inject.service(),\n    pigeon: inject.service(),\n    names: inject.service(),\n    permissions: inject.service(),\n    logger: inject.service('stash-logger'),\n\n    _trackedContacts: [],\n    contacts: computed.oneWay('_trackedContacts'),\n\n    init() {\n        this._super(...arguments);\n        this.set('_trackedContacts', []);\n        this.set('contactCallbackData', []);\n        this.get('pigeon').on(CONTACT_CHANGED, this, this._handleContactChanged);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this.get('pigeon').off(CONTACT_CHANGED, this, this._handleContactChanged);\n    },\n\n    /**\n     * Mutates (sets or resets) the provided interactionModel with the externalContact info.  This method\n     * assumes that the interactionModel participants have already been sync'd with the payload.\n     *\n     * @returns A promise which always resolves with undefined.  Any errors in expansion will be logged.\n     */\n    async setExternalContactInfo(interactionModel, payload) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n        const participantsToExpand = (interactionModel.get('participants') || []).filter(currParticipant => {\n            return currParticipant && EXPANDED_PARTICIPANT_PURPOSES.includes(Ember.get(currParticipant, 'purpose'));\n        });\n\n        if (!participantsToExpand.length) {\n            return;\n        }\n\n        for (let index = 0; index < participantsToExpand.length; index++) {\n            const currParticipant = participantsToExpand[index];\n\n            const rawParticipant =\n                payload && payload.participants ? payload.participants.find(p => p.id === currParticipant.id) : null;\n            if (!rawParticipant) {\n                this.get('logger').warn('ACD Relate: Could not correlate a model participant with a rawParticipant', {\n                    remoteData: {\n                        conversationId: interactionModel.get('id'),\n                        participantId: currParticipant.id\n                    }\n                });\n\n                continue;\n            }\n\n            if (!rawParticipant.externalContactId) {\n                setProperties(currParticipant, {\n                    isExternal: false,\n                    name: rawParticipant.name || '',\n                    externalContact: null\n                });\n            } else {\n                const externalContact = (await this._getContact(rawParticipant.externalContactId)) || null;\n                const name = externalContact ? this.get('names').fullName(externalContact) : null;\n\n                setProperties(currParticipant, {\n                    isExternal: true,\n                    name: name || rawParticipant.name || '',\n                    externalContact\n                });\n            }\n        }\n    },\n\n    /**\n     * Attempts to get a local contact model from the store and if none is found gets a remote model\n     * @param id - the contact id to load\n     * @param reload - if true - forces a reload of the contact\n     * @param errorMessage - specific error message for retrieval of contact context\n     * @returns {Promise.<*|{id}>}\n     */\n    async _getContact(id, reload, errorMessage = 'ACD Relate: failed to fetch contact') {\n        if (!id) return;\n        const store = this.get('store');\n        let contact = reload ? null : store.peekRecord(EXTERNAL_CONTACT, id);\n        if (!contact) {\n            try {\n                contact = await store.findRecord(EXTERNAL_CONTACT, id, { reload: true });\n            } catch (e) {\n                const { message: generalMessage, errors } = e;\n                const [errorData] = errors || [];\n                const { status, title, detail } = errorData || {};\n                const { message, contextId } = detail || {};\n                this.get('logger').error(errorMessage, {\n                    remoteData: {\n                        externalContactId: id,\n                        generalMessage,\n                        status,\n                        title,\n                        message,\n                        contextId\n                    }\n                });\n            }\n        }\n        return contact;\n    },\n\n    /**\n     * Gets the canonical contact based on the current contact.  It retrieves the local store's record first for\n     * both contact types if possible.  Changes to the contacts would have triggered updates through the update handler.\n     * @param id - the contact ID that will be used to retrieve the canonical contact.\n     * @param reload - if true forces reload of the contact and the canonical contact if applicable\n     * @returns {Promise.<*>} resolves to the current canonical contact for the passed in contact id\n     */\n    async getCanonicalExternalContact(id, reload = false) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n        let contact;\n        if (id) {\n            contact = await this._getContact(id, reload, 'ACD Relate: Failed to fetch External Contact from store');\n            const canonicalId = get(contact || {}, 'canonicalId');\n            if (canonicalId && canonicalId !== id) {\n                contact = await this._getContact(\n                    canonicalId,\n                    reload,\n                    'ACD Relate: Failed to fetch canonical External Contact from store'\n                );\n            }\n        }\n        return contact;\n    },\n\n    /**\n     * Synchronously gets the local contact canonical contact being tracked based on the passed in id.\n     * if nothing can be found - returns undefined\n     * @param contactId\n     */\n    getCanonicalContactSync(contactId) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n        // gets the contacts array since it is gated by the feature toggle\n        const contacts = this.get('contacts') || [];\n        let contact = contacts.findBy('id', contactId);\n        if (contact) {\n            const canonicalId = get(contact, 'canonicalId');\n            if (canonicalId && canonicalId !== contactId) {\n                contact = contacts.findBy('id', canonicalId);\n            }\n        }\n        return contact;\n    },\n\n    /**\n     * Adds change listener for customer participant bound contacts on their id in the payloads participant array.  It diffs the\n     * previous interaction states participants array to remove listeners that were previously attached.\n     * @param ModelBuilder - The Ember Class or a function to create an interaction model\n     * @param payload - the payload from an interaction update\n     * @param prevRaw - the previous payload for an the payload - for determining removed contacts\n     * @param callback - the callback that will be fired when a contact changes - The callbacks are invoked without\n     * contact binding to an appropriate context will be necessary\n     */\n    async addContactChangeListenersForInteraction(ModelBuilder, payload, prevRaw, callback) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n\n        const currInteraction = Object.prototype.hasOwnProperty.call(ModelBuilder, 'create')\n            ? ModelBuilder.create(payload, Ember.getOwner(this).ownerInjection())\n            : ModelBuilder(payload);\n        const externalContactId = get(currInteraction, 'participantForCustomer.externalContactId');\n        currInteraction.destroy();\n\n        if (prevRaw) {\n            const prevInteraction = Object.prototype.hasOwnProperty.call(ModelBuilder, 'create')\n                ? ModelBuilder.create(prevRaw, Ember.getOwner(this).ownerInjection())\n                : ModelBuilder(prevRaw);\n            const previousContactId = get(prevInteraction, 'participantForCustomer.externalContactId');\n            prevInteraction.destroy();\n            if (previousContactId && previousContactId !== externalContactId) {\n                this.removeContactChangeListener(previousContactId, callback);\n            }\n        }\n\n        if (externalContactId) {\n            await this.addContactChangeListener(externalContactId, callback);\n        }\n    },\n\n    /**\n     * Cleans up listeners in an interaction payload attached to external contacts attached to the participants\n     * @param model\n     * @param callback\n     */\n    removeContactChangeListenersForInteraction(model, callback) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n        if (!model) {\n            return;\n        }\n\n        const externalContactId = get(model, 'participantForCustomer.externalContactId');\n        this.removeContactChangeListener(externalContactId, callback);\n    },\n\n    /**\n     * Adds a change listener for the canonical contact associated with the passed in external contact id\n     * as well as the contact itself if they differ\n     * @param contactId\n     * @param callback\n     * @returns {Promise.<void>}\n     */\n    async addContactChangeListener(contactId, callback) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) return;\n        if (!(contactId && callback)) return;\n\n        const contact = await this._getContact(contactId);\n        if (!contact) {\n            throw new Error('ACD Relate: failed to load external contact', { cause: contactId });\n        }\n\n        const divisionId = Ember.get(contact, 'division.id') || '*';\n\n        if (!this.get('permissions').validateDonutPermission('externalContacts:contact:view', divisionId)) {\n            throw new Error('ACD Relate: insufficient privileges to add contact listeners');\n        }\n\n        const canonicalId = get(contact, 'canonicalId');\n        const canonicalContact = await this._getContact(canonicalId);\n        if (!canonicalContact) {\n            throw new Error('ACD Relate: failed to load canonical external contact', { cause: canonicalId });\n        }\n\n        const contactData = this.get('contactCallbackData').findBy('contactId', contactId);\n\n        if (!contactData) {\n            this.get('contactCallbackData').pushObject({ contactId, canonicalId, callbacks: [callback] });\n        } else {\n            const { callbacks } = contactData;\n            if (callbacks.indexOf(callback) === -1) {\n                callbacks.pushObject(callback);\n            }\n        }\n\n        if (!this.get('_trackedContacts').findBy('id', contactId)) {\n            this.get('_trackedContacts').pushObject(createContactPojo(contact));\n        }\n        if (canonicalId !== contactId && !this.get('_trackedContacts').findBy('id', canonicalId)) {\n            this.get('_trackedContacts').pushObject(createContactPojo(canonicalContact));\n        }\n        if (contactId) {\n            this._watchContactForChanges(contactId);\n        }\n        if (canonicalId && canonicalId !== contactId) {\n            this._watchContactForChanges(canonicalId);\n        }\n    },\n\n    /**\n     * Removes a change listener for a canonical contact based on the passed in external contact is as well as\n     * the contact itself if they differ\n     * @param contactId\n     * @param callback\n     * @returns {Promise.<void>}\n     */\n    removeContactChangeListener(contactId, callback) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n        if (!(contactId && callback)) return;\n\n        const contactCallbackData = this.get('contactCallbackData');\n        const contactData = contactCallbackData.findBy('contactId', contactId);\n        if (contactData) {\n            const { callbacks } = contactData;\n            callbacks.removeObject(callback);\n            if (!callbacks.length) {\n                contactCallbackData.removeObject(contactData);\n            }\n        }\n        this._updateTrackedContactsAndTopics();\n    },\n\n    /**\n     * Adds watcher for changes on a given external contact based on the passed in contact id\n     * @param externalContactId\n     */\n    _watchContactForChanges(externalContactId) {\n        if (externalContactId) {\n            const topic = `${TOPIC_PREFIX}${externalContactId}`;\n            if (this.get('pigeon.priorityTopics').indexOf(topic) === -1) {\n                this.get('pigeon').registerPriorityTopic(topic, CONTACT_CHANGED);\n            }\n        }\n    },\n\n    /**\n     * Removes watcher for changes on a given external contact based on the passed in contact id\n     * @param externalContactId\n     */\n    _unwatchContactForChanges(externalContactId) {\n        if (externalContactId) {\n            const topic = `${TOPIC_PREFIX}${externalContactId}`;\n            if (this.get('pigeon.priorityTopics').indexOf(topic) !== -1) {\n                this.get('pigeon').unRegisterPriorityTopic(topic);\n            }\n        }\n    },\n\n    _invokeCallbacks(callbacks = [], data = {}) {\n        callbacks.forEach(callback => {\n            if (typeof callback === 'function') {\n                callback(data);\n            }\n        });\n    },\n\n    /**\n     * Rolls through tracked contacts and topics to remove any orphan contacts or topics that\n     * whose callback data has been removed.\n     */\n    _updateTrackedContactsAndTopics() {\n        const trackedContactIds = this.get('trackedContactIds');\n        const trackedContacts = this.get('_trackedContacts');\n        for (let i = trackedContacts.length - 1; i >= 0; i--) {\n            const { id } = trackedContacts.objectAt(i);\n            if (id && trackedContactIds.indexOf(id) === -1) {\n                trackedContacts.splice(i, 1);\n                this._unwatchContactForChanges(id);\n            }\n        }\n    },\n\n    /**\n     * Returns an array of all the contact ids that are currently being tracked\n     */\n    trackedContactIds: computed('contactCallbackData.[]', function () {\n        return this.get('contactCallbackData')\n            .reduce((trackedIds, callbackData) => {\n                const { contactId, canonicalId, callbacks } = callbackData;\n                if (callbacks.length) {\n                    trackedIds.pushObject(contactId);\n                    if (contactId !== canonicalId) {\n                        trackedIds.pushObject(canonicalId);\n                    }\n                }\n                return trackedIds;\n            }, [])\n            .uniq();\n    }),\n\n    /**\n     * Reloads an external contact when it has changed and dispatches an external contact changed event.  If the change\n     * in question was a merger of contacts, a merge event is also generated containing the initial contact and the\n     * canonical contact that resulted from the merge event.\n     * @param externalContactId - an object that contains a single id property corresponding to which contact changed\n     * @returns {Promise.<void>}\n     */\n    async _handleContactChanged({ id: contactId }) {\n        if (contactId) {\n            try {\n                if (!this.get('contactCallbackData.length')) {\n                    return;\n                }\n                const contacts = this.get('_trackedContacts');\n                const contactCallbackData = this.get('contactCallbackData');\n\n                const staleContact = await this._getContact(contactId);\n                const staleCanonicalId = get(staleContact, 'canonicalId');\n\n                const freshContact = await this._getContact(contactId, true);\n                const freshCanonicalId = get(freshContact, 'canonicalId');\n                const freshCanonicalContact = await this._getContact(freshCanonicalId);\n\n                if (freshContact && freshCanonicalContact) {\n                    contacts.removeObject(contacts.findBy('id', contactId));\n                    contacts.pushObject(createContactPojo(freshContact));\n\n                    if (freshCanonicalId !== contactId) {\n                        contacts.removeObject(contacts.findBy('id', freshCanonicalId));\n                        contacts.pushObject(createContactPojo(freshCanonicalContact));\n                    }\n\n                    let callbacks, type, eventData;\n                    if (staleCanonicalId === freshCanonicalId) {\n                        type = CONTACT_CHANGED_EVENT;\n                    } else {\n                        type = CONTACT_MERGED_EVENT;\n\n                        //if this is a base contact - it will have a contactCallbackData\n                        // update it if it does to give it the new canonical contact id\n                        const callbackData = contactCallbackData.findBy('contactId', contactId);\n                        if (callbackData) {\n                            const { callbacks } = callbackData;\n                            contactCallbackData.removeObject(callbackData);\n\n                            // update the contact data with the new canonical and watch the news canonical\n                            contactCallbackData.pushObject({ contactId, canonicalId: freshCanonicalId, callbacks });\n                            this._watchContactForChanges(freshCanonicalId);\n                        }\n\n                        // removes orphan contacts and topics based on the currently tracked contact information\n                        this._updateTrackedContactsAndTopics();\n                    }\n\n                    callbacks = contactCallbackData\n                        .filter(data => data.contactId === contactId || data.canonicalId === contactId)\n                        .flatMap(({ callbacks }) => callbacks)\n                        .uniq();\n\n                    eventData = { type, contact: freshContact, canonicalContact: freshCanonicalContact };\n\n                    if (callbacks && type && eventData) {\n                        Ember.run.schedule('actions', this, '_invokeCallbacks', callbacks, eventData);\n                        this.trigger(type, eventData);\n                    }\n                }\n            } catch (e) {\n                this.get('logger').error('ACD Relate: Error occurred when handling external contact change event', {\n                    remoteData: {\n                        contactId\n                    }\n                });\n            }\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { inject, computed, observer, Service } = Ember;\n\nexport default Service.extend(Ember.Evented, LoggerMixin, {\n    intl: inject.service(),\n    ajax: inject.service(),\n    chat: inject.service(),\n    store: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n    embedded: inject.service(),\n\n    initialized: false,\n\n    _favorites: null,\n    favoritePromise: Ember.RSVP.defer(),\n\n    init() {\n        this._super(...arguments);\n\n        this.setProperties({\n            _favorites: []\n        });\n\n        this.loadFavoritesForSessionPerson();\n    },\n\n    enabled: computed('session.user.isTrustee', function () {\n        return !this.get('session.user.isTrustee');\n    }),\n\n    apiVersion: computed(function () {\n        return 'v3';\n    }),\n\n    loadFavoritesForSessionPerson: observer(\n        'session.{isAuthenticated,person}',\n        'session.user.{isTrustee,isSuper}',\n        function () {\n            if (this.get('session.user.isTrustee') || this.get('session.user.isSuper')) {\n                this.favoritePromise.resolve(this.get('_favorites'));\n                return;\n            }\n\n            if (!this.get('initialized') && this.get('session.isAuthenticated') && this.get('session.person')) {\n                return this.initFavorites().then(\n                    () => {\n                        this.favoritePromise.resolve(this.get('_favorites'));\n                    },\n                    () => {\n                        this.favoritePromise.resolve(this.get('_favorites'));\n                    }\n                );\n            }\n            this.favoritePromise.resolve(this.get('_favorites'));\n        }\n    ),\n\n    initFavorites() {\n        return this.getFavorites().then(peopleAndGroups => {\n            if (this.isDestroyed) {\n                return;\n            }\n            this.setFavorites(peopleAndGroups);\n            this.set('initialized', true);\n        });\n    },\n\n    getFavorites() {\n        return this.get('store')\n            .findFavorites()\n            .then(data => {\n                return this._handleHiddenGroups(data);\n            });\n    },\n\n    getLoadedFavorites() {\n        return this.favoritePromise.promise;\n    },\n\n    setFavorites(peopleAndGroups) {\n        const favorites = _.chain([])\n            .concat(peopleAndGroups)\n            .compact()\n            .uniq(false, x => x.get('id'))\n            .value();\n        this.set('_favorites', favorites);\n\n        favorites.forEach(entity => {\n            entity.set('isFavorite', true);\n        });\n    },\n\n    // Handle favorite action performed in Web-Directory.\n    async handleEntityFavoriteAction(event) {\n        if (!event) {\n            return;\n        }\n        if (event.action === 'Favorited') {\n            if (!event.data || !event.data.entityType || !event.entityId) {\n                return;\n            }\n            const entity = await this.get('store').findRecord(event.data.entityType, event.entityId);\n            if (!entity) {\n                return;\n            }\n            this.get('_favorites').addObject(entity);\n            entity.set('isFavorite', true);\n            this.trigger('favoriteChange', {\n                entityId: event.entityId,\n                favoriteStatus: true,\n                action: 'Favorited'\n            });\n        } else if (event.action === 'Unfavorited') {\n            if (!event.entityId) {\n                return;\n            }\n            const entity = this.get('_favorites').findBy('id', event.entityId);\n            if (!entity) {\n                return;\n            }\n            this.get('_favorites').removeObject(entity);\n            entity.set('isFavorite', false);\n            this.trigger('favoriteChange', {\n                entityId: event.entityId,\n                favoriteStatus: false,\n                action: 'Unfavorited'\n            });\n        }\n    },\n\n    favoriteEntity(entity) {\n        // Trigger a favorite event to Web-Directory.\n        this.get('embedded').favoriteEntityById({\n            entityId: entity.get('id') || entity.get('jid'),\n            entityType: entity.get('type'),\n            favoriteStatus: true\n        });\n    },\n\n    unfavoriteEntity(entity) {\n        // Trigger an unfavorite event to Web-Directory.\n        this.get('embedded').favoriteEntityById({\n            entityId: entity.get('id') || entity.get('jid'),\n            entityType: entity.get('type'),\n            favoriteStatus: false\n        });\n    },\n\n    toggleFavorite(entity) {\n        if (entity.get('isFavorite')) {\n            this.unfavoriteEntity(entity);\n        } else {\n            this.favoriteEntity(entity);\n        }\n    },\n\n    _handleHiddenGroups(models) {\n        const loadedIds = [...models.mapBy('entityId'), ...models.mapBy('guid'), ...models.mapBy('_id')].filter(\n            id => !!id\n        );\n        models._payload\n            .filter(object => object.entityType === 'group')\n            .forEach(object => {\n                const guid = object.entityId;\n                if (!_.includes(loadedIds, guid)) {\n                    // group wasn't loaded due to permissions\n                    const placeholder = this.get('store').push({\n                        data: {\n                            type: 'group',\n                            id: guid,\n                            attributes: {\n                                guid: guid,\n                                general: {\n                                    name: []\n                                }\n                            }\n                        }\n                    });\n\n                    this.logger.info('Favorites: Adding placeholder', { guid });\n\n                    models.pushObject(placeholder);\n                }\n            });\n\n        return models;\n    }\n});\n","define(\"connections-ui/services/feature\", [\"exports\", \"ember-purecloud-components/services/feature\"], function (_exports, _feature) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _feature.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport AjaxService from 'ember-ajax/services/ajax';\n\nexport default AjaxService.extend({\n    application: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n\n    trustedHosts: Ember.computed.alias('ajax.trustedHosts'),\n\n    upload(uri, formData) {\n        return this.raw(uri, {\n            contentType: false,\n            processData: false,\n            data: formData,\n            method: 'POST'\n        });\n    },\n\n    /**\n     * Fax upload using provided headers. This will use the Darth service for upload.\n     * @param {*} uri\n     * @param {*} formData\n     * @param {*} headers\n     * @returns\n     */\n    faxUploadWithHeaders(uri, formData, headers) {\n        const file = formData.get('file');\n        if (file) {\n            return this.raw(uri, {\n                contentType: false,\n                processData: false,\n                // darth upload doesn't like the form data object for all file types\n                // using the raw file appears to work consistently\n                data: file,\n                method: 'PUT',\n                headers,\n                dataType: 'text' // fax upload will have an empty response\n            });\n        } else {\n            Ember.Logger.error('<file-upload/faxUploadWithHeaders> file is undefined!');\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst { inject, Service } = Ember;\n\nexport default Service.extend(Ember.Evented, {\n    session: inject.service(),\n\n    isFullScreen: false,\n\n    handleFullScreenChange: function () {\n        Ember.run(() => {\n            if (!this.get('isDestroyed') && !this.get('isDestroying')) {\n                let fullScreen = document.webkitIsFullScreen || document.mozFullScreen || document.msFullscreenElement;\n                this.set('isFullScreen', !!fullScreen);\n\n                if (!this.get('isFullScreen')) {\n                    this.endFullScreen();\n                }\n            }\n        });\n    },\n\n    init() {\n        this._super(...arguments);\n        Ember.$(document).on('webkitfullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).on('fullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).on('mozfullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).on('MSFullscreenChange', this.handleFullScreenChange.bind(this));\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        Ember.$(document).off('webkitfullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).off('fullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).off('mozfullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).off('MSFullscreenChange', this.handleFullScreenChange.bind(this));\n    },\n\n    startFullScreen(isAcd = false, requestingElem) {\n        //Ensure messengerElement in under orgspan-app element to support toast notification while in fullscreen\n        const messengerElement = Ember.$('ul.messenger');\n        const orgspanApp = Ember.$('.orgspan-app');\n        if (!Ember.$.contains(orgspanApp, messengerElement)) {\n            messengerElement.appendTo(orgspanApp);\n        }\n\n        const hostedContext = this.get('applicationService.hostedContext');\n        if (hostedContext && hostedContext.isHosted()) {\n            $('.orgspan-app').addClass('hosted-fullscreen');\n        } else {\n            const elem = requestingElem ? $(requestingElem)[0] : $('.orgspan-app')[0];\n            const requestFullscreen =\n                elem.requestFullscreen ||\n                elem.webkitRequestFullscreen ||\n                elem.mozRequestFullScreen ||\n                elem.msRequestFullscreen;\n            requestFullscreen.apply(elem);\n        }\n\n        if (!isAcd) {\n            $('.orgspan-app').removeClass('fullscreen-v1');\n            $('.orgspan-app').addClass('fullscreen-v2');\n        } else {\n            $('.orgspan-app').removeClass('fullscreen-v2');\n            $('.orgspan-app').addClass('fullscreen-v1');\n        }\n\n        this.trigger('startFullscreen');\n    },\n\n    endFullScreen() {\n        const hostedContext = this.get('applicationService.hostedContext');\n        if (hostedContext && hostedContext.isHosted()) {\n            $('.orgspan-app').removeClass('hosted-fullscreen');\n        } else {\n            const exitFullscreen =\n                document.exitFullscreen ||\n                document.webkitExitFullscreen ||\n                document.webkitExitFullscreen ||\n                document.mozCancelFullScreen ||\n                window.msExitFullscreen;\n            const ret = exitFullscreen.apply(document);\n            if (ret && ret.catch) {\n                ret.catch(() => {});\n            }\n        }\n\n        this.trigger('endFullscreen');\n    }\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport geoUtil from '../utils/geolocation';\nimport uuid from '../utils/uuid';\nimport { task } from 'ember-concurrency';\nimport moment from '../utils/dates';\n\nconst REPORT_FREQUENCY_IN_MINUTES = 60;\n\nexport default Ember.Service.extend(LoggerMixin, {\n    currentPosition: {},\n    store: Ember.inject.service(),\n    session: Ember.inject.service(),\n    preferences: Ember.inject.service(),\n    application: Ember.inject.service(),\n    streaming: Ember.inject.service(),\n    geoUtil,\n    uuid: uuid,\n\n    isEnabled: Ember.computed.reads('isSwitchedOn'),\n    isSwitchedOn: false,\n\n    intervalReference: null,\n    isStarted: Ember.computed.and('geoWatchId', 'intervalReference'),\n\n    init() {\n        this._super(...arguments);\n        let context = this.get('application.hostedContext');\n        if (context && context.isHosted()) {\n            this.get('_desktopStart').perform();\n        } else {\n            this.get('start').perform();\n        }\n\n        this.get('geoUtil').setContext(context);\n    },\n\n    _lastReport: null,\n    report: Ember.observer('isSwitchedOn', 'streaming.connected', 'clientId', function () {\n        this.logger.debug(`GEOLOCATION: report observer fired`);\n        if (!this.get('isSwitchedOn') || !this.get('streaming.connected')) {\n            return;\n        }\n        const lastReport = this.get('_lastReport');\n        if (lastReport && moment().diff(lastReport, 'minutes') < REPORT_FREQUENCY_IN_MINUTES) {\n            return;\n        }\n        const clientId = this.get('clientId');\n        if (!clientId) {\n            return;\n        }\n        if (!this.get('geoUtil').isGeolocationAvailable()) {\n            this.logger.debug('GEOLOCATION: Not available');\n            return;\n        }\n        this.logger.debug(`GEOLOCATION: report observer triggering geo report`);\n        this.set('_lastReport', moment());\n        this.get('_reportCurrentPosition').perform(clientId);\n    }),\n\n    _desktopStart: task(function* () {\n        this.logger.debug('GEOLOCATION: Using desktop start');\n        let prefs = yield this.get('application.hostedContext').requestDesktopPromise({\n            cmd: 'getPreferences',\n            prefs: ['permission_geolocation']\n        });\n        if (prefs.permission_geolocation) {\n            this.logger.debug('GEOLOCATION: desktop preference on');\n            this.get('start').perform();\n        } else {\n            this.logger.debug('GEOLOCATION: desktop preference off', prefs);\n            try {\n                let result = yield this.get('store').findRecord('geolocation-settings', '1');\n                this.logger.debug(`GEOLOCATION: Got settings result`, result);\n                if (result.get('enabled')) {\n                    this.logger.debug(`GEOLOCATION: geolocation admin setting is enabled for this org`);\n                    this.set('isSwitchedOn', true);\n                }\n            } catch (e) {\n                this.logger.error('failed to get information about geolocation for this client', { error: e });\n            }\n        }\n    }),\n\n    start: task(function* () {\n        if (this.get('session.user.isTrustee') || this.get('session.user.isSuper')) {\n            return;\n        }\n\n        try {\n            let result = yield this.get('store').findRecord('geolocation-settings', '1');\n            this.logger.debug(`GEOLOCATION: Got settings result`, result);\n            if (!result.get('enabled')) {\n                return;\n            }\n            this.logger.debug(`GEOLOCATION: geolocation admin setting is enabled for this org`);\n\n            let clientId = yield this.get('preferences').getPreference('geolocation.clientId');\n            this.logger.debug(`GEOLOCATION: client id is ${clientId}`);\n            if (!clientId) {\n                clientId = this.get('uuid').generate();\n                try {\n                    yield this.get('preferences').setPreference('geolocation.clientId', clientId, false);\n                    this.logger.debug('GEOLOCATION: client ID saved to preferences, start monitoring');\n                } catch (e) {\n                    this.logger.error(\n                        'GEOLOCATION: client id could not be saved locally.  Not sending geolocation...',\n                        e\n                    );\n                    return;\n                }\n            }\n\n            // will trip observer and report current position\n            this.setProperties({\n                isSwitchedOn: true,\n                clientId\n            });\n        } catch (e) {\n            this.logger.error('failed to get information about geolocation for this client', { error: e });\n        }\n    }),\n\n    _reportCurrentPosition: task(function* (clientId) {\n        let position = yield this.get('geoUtil').fetchCurrentPostion();\n        this.logger.debug('GEOLOCATION: checking if primary');\n        this.logger.debug('GEOLOCATION: session geolocation', this.get('session.publicApiUser.geolocation'));\n        try {\n            if (!this.get('session').get('isAuthenticated')) {\n                //geolocation is requested at session authentication, if we are authenticated we got it\n                yield this.get('session').refreshPublicApiUser('geolocation');\n            }\n            this.logger.debug('GEOLOCATION: refreshed logged in user', this.get('session.publicApiUser'));\n            let primary = this._isPrimary();\n            this.logger.debug('GEOLOCATION: reporting position to server', position, clientId);\n            let resultPosition = this.get('store').push({\n                data: {\n                    type: 'geolocation',\n                    attributes: {\n                        primary,\n                        id: clientId,\n                        latitude: position.coords.latitude,\n                        longitude: position.coords.longitude,\n                        type: 'web'\n                    },\n                    id: clientId\n                }\n            });\n            yield resultPosition.save();\n            this.set('currentPosition', position);\n            this._onPositionSaved(position);\n        } catch (e) {\n            this._onErrorSavingPosition(e);\n        }\n    }),\n\n    _isPrimary() {\n        let isPrimary =\n            !this.get('session.publicApiUser.geolocation.type') ||\n            (this.get('session.publicApiUser.geolocation.type') !== 'ios' &&\n                this.get('session.publicApiUser.geolocation.type') !== 'android');\n        this.logger.debug('GEOLOCATION: is primary: ', isPrimary);\n        return isPrimary;\n    },\n\n    _onPositionSaved(position) {\n        this.logger.debug('GEOLOCATION: position saved', position);\n    },\n\n    _onErrorSavingPosition(e) {\n        // 405 for the geolocation api means its turned off thru admin for this org\n        if (e.code === 405) {\n            this.set('isSwitchedOn', false);\n            this.logger.debug('GEOLOCATION: Geolocation services are disabled for this org');\n        } else {\n            // In the case of another geolocation error, we assume that it is switched on, but unable\n            // to send from the browser.  In this case we want to still see other's and our own.\n            this.set('isSwitchedOn', true);\n            this.logger.error('GEOLOCATION: an error occurred saving current position', { error: e });\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\n// service for tracking a group's assigned roles and those roles' associated divisions\nexport default Ember.Service.extend({\n    // key: \"The role id\n    // value: An object containing the following\n    //      id: \"The role id\"\n    //      role: \"The role object\"\n    //      divisions: \"An array of division objects assigned to the role\"\n    _map: {},\n\n    changeCount: 0,\n\n    list: Ember.computed('_map', 'changeCount', function () {\n        return _.map(this.get('_map'), roleWithDivisions => {\n            return roleWithDivisions;\n        });\n    }),\n\n    addRole(roleId, { divisions, id, role }) {\n        this.get('_map')[roleId] = { divisions, id, role };\n        this.incrementChangeCount();\n    },\n\n    removeRole(roleId) {\n        delete this.get('_map')[roleId];\n        this.incrementChangeCount();\n    },\n\n    getRoleWithDivisions(roleId) {\n        return this.get('_map')[roleId];\n    },\n\n    setMap(assignedRolesMap) {\n        this.clear();\n        this.set('_map', assignedRolesMap);\n    },\n\n    incrementChangeCount() {\n        this.set('changeCount', this.get('changeCount') + 1);\n    },\n\n    containsRole(roleId) {\n        return !!this.get('_map')[roleId];\n    },\n\n    clear() {\n        this.incrementChangeCount();\n        this.set('_map', {});\n    }\n});\n","define(\"connections-ui/services/headset\", [\"exports\", \"ember-softphone-integration/services/headset\"], function (_exports, _headset) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _headset.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { addPageAction } from '../utils/newrelic';\n\nconst { Evented, inject } = Ember;\nconst FULL_URL_REG_EXP = /^.*:\\/\\/.*$/;\nconst LOCALE_REDIRECT_REGEX = /\\/redirect\\/[^/]+\\//;\nconst NO_OP = 'noop';\n\nexport default Ember.Service.extend(Evented, {\n    PC_HELP_FQDN: 'help.genesys.cloud',\n    EVENT_NAMES: {\n        SHOW_RC_ARTIFACT: 'showRcArtifact',\n        OPEN_CONTEXTUAL_HELP: 'openContextualHelp'\n    },\n\n    application: inject.service(),\n    relate: inject.service(),\n    centerStageFrame: inject.service(),\n\n    init() {\n        this._super(...arguments);\n        this.generateContextualHelpUrl();\n    },\n\n    previousContext: null,\n\n    contextualHelpUrl: '#',\n    contextualHelpAnchor: undefined,\n\n    observeRoutes: Ember.observer(\n        'application.currentRouteName',\n        'engage.{isEngageActive,route,helpURL}',\n        'relate.{isRelateActive,route,helpURL}',\n        'centerStageFrame.helpPath',\n        function () {\n            Ember.run.debounce(this, () => this.generateContextualHelpUrl(), 500);\n        }\n    ),\n\n    generateContextualHelpUrl() {\n        let locale = this.get('intl.isoLocale');\n        let contextualHelpUrl = '#';\n\n        //TEMP: Redirect all locales to en-US until Resource Center supports other locales (PCDWEBK-1883)\n        locale = 'en-US';\n\n        let route = this.get('application.currentRouteName');\n        let routePrefix = 'directory.';\n\n        if (this.get('relate.isRelateActive') && this.get('relate.route') !== NO_OP) {\n            // deprecated with changeover to engine below.\n            routePrefix = 'directory.relate.';\n            route = this.get('relate.route');\n        } else {\n            // used for ember-engine-contacts. The route is\n            // passed back unchanged if there is no contacts engine relevant path.\n            route = this.get('relate').getEngineHelp(route);\n        }\n\n        if (contextualHelpUrl === '#') {\n            contextualHelpUrl = `https://help.genesys.cloud/redirect/${locale}/${routePrefix}${route}`;\n        }\n\n        // ACE-1926, only support for en-US locales currently\n        contextualHelpUrl = contextualHelpUrl.replace(LOCALE_REDIRECT_REGEX, `/redirect/${locale}/`);\n\n        const evtPayload = {\n            route,\n            routePrefix,\n            contextualHelpUrl\n        };\n        addPageAction('contextualHelpRouteChange', evtPayload);\n\n        this.set('previousContext', contextualHelpUrl);\n        this.set('contextualHelpUrl', contextualHelpUrl);\n    },\n\n    /**\n     * Open the help panel and the Resource Center URL referenced by the relative path\n     *\n     * @param relPath A non-empty, relative path. Paths will be encoded.  Query parms\n     * are allowed but should be pre-encoded.  Hash params will be removed.\n     *\n     * @throws Error if the relPath is invalid:\n     * <ul>\n     *   <li>Empty (empty strings, empty paths and query strings)</li>\n     *   <li>Not a string</li>\n     *   <li>Leads with protocol</li>\n     *   <li>Path navigation</li>\n     * </ul>\n     */\n    showResourceCenterArtifact(relPath) {\n        let embededArtifactUrl = this.buildResourceCenterArtifactUrl(relPath);\n        let externalArtifactUrl = this.buildResourceCenterArtifactUrl(relPath, {\n            useSimplifiedTheme: false\n        });\n\n        this.trigger(this.EVENT_NAMES.SHOW_RC_ARTIFACT, {\n            requestedRelPath: relPath,\n            externalArtifactUrl,\n            embededArtifactUrl\n        });\n    },\n\n    /**\n     * Open the help panel to the contextual help tab and navigate to an anchor\n     * on the page if provided.\n     *\n     * @param anchor A non-empty anchor to be added to the relative path or undefined.\n     */\n    openContextualHelpTab(anchor) {\n        if (anchor) {\n            this.set('contextualHelpAnchor', anchor);\n        }\n        this.trigger(this.EVENT_NAMES.OPEN_CONTEXTUAL_HELP);\n    },\n\n    /**\n     * Build the absolute resource center url from the provided rel Path.\n     *\n     * @param relPath A non-empty, relative path. Paths will be encoded.  Query parms\n     * are allowed and should be encoded.  Hash params will be removed.\n     *\n     * @param options.useSimplifiedTheme boolean indicating if the simplified theme\n     * option should be added to the generated url; defaults to true\n     *\n     * @returns A full url to the resource center artifact. Paths will be encoded by this call.  Query parms\n     * are allowed but should be pre-encoded.  Hash params will be removed.\n     *\n     * @throws Error if the relPath is invalid:\n     * <ul>\n     *   <li>Empty (empty strings, empty paths and query strings)</li>\n     *   <li>Not a string</li>\n     *   <li>Leads with protocol</li>\n     *   <li>Path navigation</li>\n     * </ul>\n     */\n    buildResourceCenterArtifactUrl(relPath, { useSimplifiedTheme = true } = {}) {\n        if (!relPath || typeof relPath !== 'string' || relPath.trim().length === 0) {\n            throwBadRelPath(relPath, 'Empty relPath or invalid type');\n        }\n\n        let toCheck = relPath.trim();\n\n        if (toCheck.match(FULL_URL_REG_EXP)) {\n            throwBadRelPath(relPath, 'Full URL Attempted');\n        }\n\n        let path = '';\n        let query = null;\n\n        let hashIndex = toCheck.indexOf('#');\n        if (hashIndex >= 0) {\n            toCheck = toCheck.slice(0, hashIndex);\n        }\n\n        let queryIndex = toCheck.indexOf('?');\n        if (queryIndex >= 0) {\n            query = toCheck.slice(queryIndex + 1);\n            path = toCheck.slice(0, queryIndex);\n        } else {\n            path = toCheck;\n        }\n\n        if (path.length === 0 && !query) {\n            throwBadRelPath(relPath, 'Insufficient path');\n        } else if (path.length > 0) {\n            path = path\n                .split('/')\n                .map(pathSegment => {\n                    if (pathSegment === '.' || pathSegment === '..') {\n                        throwBadRelPath(relPath, 'Path Navigation Detected');\n                    }\n\n                    return encodeURIComponent(pathSegment);\n                })\n                .join('/');\n\n            if (path.charAt(0) !== '/') {\n                path = `/${path}`;\n            }\n        }\n\n        let result = `https://${this.PC_HELP_FQDN}${path}`;\n        if (query) {\n            result += `?${query}`;\n        }\n\n        if (useSimplifiedTheme) {\n            result += `${query ? '&' : '?'}theme=simplified`;\n        }\n\n        return result;\n    }\n});\n\nfunction throwBadRelPath(relPath, internalMsg) {\n    let err = new Error('service:help - Invalid Artifact Relative Path', relPath);\n    err.internalMsg = internalMsg;\n    throw err;\n}\n","define(\"connections-ui/services/iframe-state\", [\"exports\", \"ember-purecloud-components/services/iframe-state\"], function (_exports, _iframeState) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _iframeState.default;\n    }\n  });\n});\n","import Service from 'smoke-and-mirrors/services/in-viewport';\n\nexport default Service;\n","import Ember from 'ember';\nimport { addPageAction } from '../utils/newrelic';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport moment from 'connections-ui/utils/dates';\nimport { batchEntityIds } from './store';\nimport { isPresence } from 'connections-ui/mixins/entity-presence';\nconst { computed, inject } = Ember;\n\nexport const DEFAULT_PHONE_INTEGRATION_KEY = 'genesys';\nexport const GENESYS_SEARCH_TAB = {\n    key: 'genesys',\n    icon: 'assets/images/svg/genesys-logo-red.svg'\n};\nconst DEFAULT_PRESENCE_INTERVAL_SEC = 60;\nconst INTEGRATIONS_LOADED_EVENT = 'integrationsLoaded';\nconst PRESENCE_BATCH_SIZE_V2 = 25;\nconst NEW_RELIC_NAMESPACE = 'ucc.ui.integration';\nconst USE_PRESENCE_SOURCE_DIRECTORY_SEARCH_FT = 'gcucc.ui.useIntegrationPresenceSourceDirectorySearch';\nconst REDUCE_PRESENCE_POLLING_FT = 'gcucc-ui-PCUCC-3734';\n\nexport default Ember.Service.extend(Ember.Evented, LoggerMixin, {\n    apps: inject.service(),\n    application: inject.service(),\n    ajax: inject.service(),\n    session: inject.service(),\n    intl: inject.service(),\n    permissions: inject.service(),\n    store: inject.service(),\n    notification: inject.service('notification-proxy'),\n    phoneIntegrations: inject.service(),\n\n    newRelicNamespace: NEW_RELIC_NAMESPACE,\n    presencePollIntervalSec: DEFAULT_PRESENCE_INTERVAL_SEC,\n    presenceIntervalTimers: {},\n    presenceErrors: null,\n\n    presencePollInterval: computed('presencePollIntervalSec', function () {\n        return this.get('presencePollIntervalSec') * 1000;\n    }),\n\n    reducePresencePolling: computed('session.features', function () {\n        return this.getFeatureToggle(REDUCE_PRESENCE_POLLING_FT);\n    }),\n\n    useIntegrationPresenceDirectorySearch: Ember.computed('session.features', function () {\n        return this.getFeatureToggle(USE_PRESENCE_SOURCE_DIRECTORY_SEARCH_FT);\n    }),\n\n    getFeatureToggle(toggle) {\n        return this.get('session.features') && this.get('session.features')[toggle];\n    },\n\n    alreadyTriggeredPresenceInterval: false,\n\n    triggerPresenceInterval: Ember.on(\n        'init',\n        // set up an observer to fire when integrations change\n        Ember.observer('phoneIntegrations.integrations.[]', function () {\n            const phoneIntegrations = this.get('phoneIntegrations.integrations');\n\n            // only trigger presence interval if we haven't already and we have integrations\n            if (phoneIntegrations.length > 0 && !this.get('alreadyTriggeredPresenceInterval')) {\n                this.toggleProperty('alreadyTriggeredPresenceInterval');\n                this.trigger(INTEGRATIONS_LOADED_EVENT);\n            }\n        })\n    ),\n\n    presenceUpdateInterval: Ember.on(INTEGRATIONS_LOADED_EVENT, function () {\n        const phoneIntegrations = this.get('phoneIntegrations.integrations').filter(\n            integration => integration.pollingEnabled\n        );\n        if (phoneIntegrations.length > 0) {\n            phoneIntegrations.forEach(integration => this._managePolling(integration));\n        }\n    }),\n\n    init() {\n        this._super(...arguments);\n\n        this.set('presenceErrors', {});\n\n        // remove intervals if 401 happens\n        this.get('session').on('invalidatingAuthSession', this.removeAllPresenceIntervals.bind(this));\n    },\n\n    _managePolling(integration) {\n        const interval =\n            integration.pollIntervalSec && integration.pollIntervalSec > 0\n                ? integration.pollIntervalSec\n                : DEFAULT_PRESENCE_INTERVAL_SEC;\n        const presenceTimer = Ember.run.later(\n            this,\n            function () {\n                this._handlePresenceInterval(integration);\n                this._managePolling(integration);\n            },\n            interval * 1000\n        );\n        if (!this.get(`presenceIntervalTimers.${integration.key}`)) {\n            this.get('logger').debug(`Starting presence interval for ${integration.key}`, { integration });\n            this.set(`presenceIntervalTimers.${integration.key}`, {\n                timer: presenceTimer,\n                hasSession: false\n            });\n        }\n    },\n\n    removeAllPresenceIntervals() {\n        const timers = this.get('presenceIntervalTimers');\n        this.get('logger').info('Stopping all presence intervals due to 401', {\n            intervals: this.get('presenceIntervalTimers')\n        });\n        Object.keys(timers).forEach(timerKey => {\n            Ember.run.cancel(this.get(`presenceIntervalTimers.${timerKey}`));\n        });\n    },\n    removePresenceInterval(integration) {\n        this.get('logger').info(`Stopping the presence interval for ${integration.key}`, {\n            integration\n        });\n        const timer = this.get(`presenceIntervalTimers.${integration.key}`);\n        Ember.run.cancel(timer);\n    },\n\n    async updateSessionData(integration) {\n        const url = this.get('application').pcV2Uri(\n            `api/v2/integrations/unifiedcommunications/${integration.key}/auth/users/status`\n        );\n        const sessionData = await this.get('ajax').request(url);\n        if (sessionData) {\n            if (sessionData.code === 'session.not.available') {\n                this.set(`presenceIntervalTimers.${integration.key}.hasSession`, false);\n            } else {\n                this.set(`presenceIntervalTimers.${integration.key}.hasSession`, true);\n            }\n        }\n        return sessionData;\n    },\n\n    async _handlePresenceInterval(integration) {\n        try {\n            if (this.get('reducePresencePolling')) {\n                const hasSession = this.get(`presenceIntervalTimers.${integration.key}.hasSession`);\n                if (!hasSession) {\n                    await this.updateSessionData(integration);\n                    const fetchedSession = this.get(`presenceIntervalTimers.${integration.key}.hasSession`);\n                    if (!fetchedSession) {\n                        return;\n                    }\n                }\n            }\n            // try looking at the cache instead of making an api call\n            const users = this.get('store').peekAll('person');\n            const currentDate = moment();\n            const filteredUsers = users.filter(\n                user =>\n                    user.integrationContactInfo(integration.key) !== undefined &&\n                    user.integrationContactInfo(integration.key) !== null\n            );\n\n            // filter users based on presence modified date\n            let integrationUsers = filteredUsers.filter(user => {\n                const modifiedDate = user.get('integrationPresence.modifiedDate');\n                if (!modifiedDate) {\n                    return true;\n                }\n                return modifiedDate && this._isPresenceStale(currentDate, modifiedDate);\n            });\n\n            if (integrationUsers.length > 0) {\n                const integrationUsersIds = integrationUsers.map(user => user.get('id'));\n                let batchSize = PRESENCE_BATCH_SIZE_V2;\n                // batch integration user ids\n                const batchedIds = batchEntityIds(integrationUsersIds, batchSize);\n\n                const authError = await this._handleBatchPresenceRequest(integration, integrationUsers, batchedIds);\n                if (authError) {\n                    this._handleAuthError(integration);\n                    if (this.get('reducePresencePolling')) {\n                        this.set(`presenceIntervalTimers.${integration.key}.hasSession`, false);\n                    }\n                }\n            } else {\n                // log no users found\n                this.get('logger').info(\n                    `services/phone-integration: (${integration.key}): Did not find users to refresh presence.`\n                );\n            }\n        } catch (err) {\n            // scary err happened, stop the interval\n            this.removePresenceInterval(integration);\n            this.get('logger').error(`services/phone-integration: error fetching presence in interval`, {\n                err\n            });\n        }\n    },\n\n    /**\n     * Handle batch presence requests\n     * @param {*} integration client app integration\n     * @param {*} batchedIds 2d array, inner array is list of integration user ids\n     * @param {*} authErrors list of client app integration's that errored on auth\n     */\n    async _handleBatchPresenceRequest(integration, integrationUsers, batchedIds, bypassCache = false) {\n        let authError;\n        for (let i = 0; i < batchedIds.length; i++) {\n            const ids = batchedIds[i];\n            const idParams = ids.join(',');\n            const ucIntegrationId = integration.key;\n            const requestLatest = bypassCache ? 'true' : 'false'; // tells api to bypass cache if true\n            const url = this.get('application').pcV2Uri(\n                `api/v2/integrations/unifiedcommunications/${ucIntegrationId}/presences?requestLatest=${requestLatest}&id=${idParams}`\n            );\n            // ucIntegrationId should be the integration.key\n            try {\n                const presenceUserList = await this.get('ajax').request(url);\n\n                // for each presence response, find the user\n                // and update the presence for that user\n                // each user is an Ember model object so should update entire app\n                presenceUserList.forEach(presenceResponse =>\n                    this._handleIndividualPresenceResponse(integrationUsers, presenceResponse)\n                );\n            } catch (err) {\n                if (\n                    err.payload &&\n                    err.payload.message === 'Session not available, new authorization code must be defined!'\n                ) {\n                    authError = err;\n                    this.get('logger').warn(\n                        `services/phone-integration: You are not authenticated with the following 3rd party integration: ${integration.key}`,\n                        {\n                            err\n                        }\n                    );\n                    break;\n                } else {\n                    throw err;\n                }\n            }\n        }\n        return authError;\n    },\n\n    /**\n     * Finds and updates presence for integration user.\n     * @param {*} integrationUsers list of integration users\n     * @param {*} presenceResponse individual presence response\n     */\n    _handleIndividualPresenceResponse(integrationUsers, presenceResponse) {\n        const user = integrationUsers.find(u => u.get('id') === Ember.get(presenceResponse, 'userId'));\n        if (user) {\n            const presence = {\n                source: Ember.get(presenceResponse, 'source'),\n                message: Ember.get(presenceResponse, 'message'),\n                modifiedDate: Ember.get(presenceResponse, 'modifiedDate'),\n                presenceDefinition: Ember.get(presenceResponse, 'presenceDefinition')\n            };\n            Ember.set(user, 'activities.integrationPresence', presence);\n        }\n    },\n\n    _handleAuthError(integration) {\n        const hasShownError = this.get(`presenceErrors.${integration.key}`);\n        if (!hasShownError) {\n            const title = this.get('intl').t('integrationPresence.errors.auth.title');\n            // show specific toast with action handler\n            let message = this.get('intl').t(`integrationPresence.errors.auth.${integration.key}.message`);\n            this.get('notification').show({\n                title: title,\n                message: message,\n                hideAfter: 8,\n                type: 'info',\n                clickHandler: () => {}\n            });\n            this.set(`presenceErrors.${integration.key}`, true);\n        }\n    },\n\n    async alterUsersWithIntegration(users) {\n        const groupedUsers = this._groupUsersByIntegration(users);\n        const presenceSources = Object.keys(groupedUsers);\n        const phoneIntegrations = this.get('phoneIntegrations.integrations');\n\n        const promises = presenceSources.map(presenceSource => {\n            const integration = phoneIntegrations.find(\n                phoneIntegration =>\n                    phoneIntegration.integrationPresenceSource.toLowerCase() === presenceSource.toLowerCase()\n            );\n            const integrationUsers = groupedUsers[presenceSource];\n            const integrationUsersIds = integrationUsers.map(user => user.get('id'));\n            let batchSize = PRESENCE_BATCH_SIZE_V2;\n            // batch integration user ids\n            const batchedIds = batchEntityIds(integrationUsersIds, batchSize);\n            // ensure that bypassCache is true to get latest presence requests\n            return this._handleBatchPresenceRequest(integration, integrationUsers, batchedIds, true);\n        });\n\n        try {\n            await Promise.all(promises);\n        } catch (err) {\n            this.get('logger').error('services/integrations-presence: error occurred with alterUsersWithIntegration', {\n                err\n            });\n        }\n\n        return users;\n    },\n\n    _groupUsersByIntegration(users) {\n        const usersGroupedByIntegration = {};\n\n        for (const user of users) {\n            let integrationPhone = Ember.get(user, 'integrationPhone');\n            let integrationKey = integrationPhone && integrationPhone.value.integration;\n            const integrationConfig = this.get('phoneIntegrations').getIntegration(integrationKey);\n            if (integrationConfig) {\n                const presenceSource = integrationConfig.integrationPresenceSource;\n                if (!usersGroupedByIntegration[presenceSource]) {\n                    usersGroupedByIntegration[presenceSource] = [];\n                }\n                usersGroupedByIntegration[presenceSource].push(user);\n            }\n        }\n\n        return usersGroupedByIntegration;\n    },\n\n    sendNewRelicAction(metric, value, ucIntegrationKey) {\n        //capture analytics & send to new relic for UC Integrations\n        addPageAction(this.get('newRelicNamespace'), {\n            metric,\n            value,\n            ucIntegrationKey\n        });\n    },\n    _isPresenceStale(currentDate, modifiedDate) {\n        let diffInMS = moment(currentDate).diff(moment(modifiedDate));\n        return diffInMS > this.get('presencePollInterval');\n    },\n    _isGCOffline(user) {\n        const presenceDefinition = user.get('activities.presence.presenceDefinition');\n        return isPresence(this.get('session.presenceMap'), presenceDefinition, 'offline');\n    }\n});\n","import Ember from 'ember';\nexport default Ember.Service.extend({});\n","define(\"connections-ui/services/interval\", [\"exports\", \"ember-purecloud-components/services/interval\"], function (_exports, _interval) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _interval.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport IntlService from 'ember-intl/services/intl';\nimport _ from 'lodash';\nimport { isSameSiteNoneCompatible } from 'should-send-same-site-none';\nimport config from 'connections-ui/config/environment';\nimport moment from 'connections-ui/utils/dates';\nimport escape from 'connections-ui/utils/escape';\nimport missingMessage from 'connections-ui/utils/intl/missing-message';\nimport { getEnvCookieDomain } from 'connections-ui/utils/net';\nimport { isTesting } from 'connections-ui/utils/testing';\n\nconst { get, inject, computed, RSVP } = Ember;\n\nconst addServerPrefix = function (key) {\n    return `server_translations.${key}`;\n};\n\nconst safeString = function (s) {\n    return Ember.String.htmlSafe(s);\n};\n\nconst rtlLangs = ['he', 'ar'];\n\n// Object [locale String]: languageName String\n// values come directly from each locale's `languageName` key\nconst languages = config.APP.INTL_LANGUAGES;\nconst localeCookie = 'pcAuth-userPrefLangTag';\nconst localeCookieOptions = {\n    path: '/',\n    expires: new Date(Date.now() + 90 * 24 * 60 * 60 * 1000)\n    // expiration is 90 days into the future\n};\n\nexport default IntlService.extend({\n    ajax: inject.service(),\n    cookies: inject.service(),\n    application: inject.service(),\n\n    loaded: false,\n    loadedPromise: null,\n\n    languages,\n    baseLocale: 'en-us',\n    supportedLocales: Object.keys(languages),\n\n    systemLocale: computed('baseLocale', function () {\n        const { languages, language, userLanguage } = window.navigator;\n        const lang = Array.isArray(languages) && languages[0];\n        const navLocale = lang || language || userLanguage;\n        if (navLocale) {\n            return navLocale;\n        }\n        return this.get('baseLocale');\n    }),\n\n    isRTL: computed('isoLocale', function () {\n        const isoLocale = this.get('isoLocale');\n        return rtlLangs.includes(isoLocale);\n    }),\n\n    isoLocale: computed('locale.firstObject', function () {\n        return this.get('locale.firstObject');\n    }),\n\n    iso2LocaleCountry: computed('isoLocale', function () {\n        const isoLocale = this.get('isoLocale');\n        if (isoLocale) {\n            const countryData = window.intlTelInputGlobals.getCountryData();\n            const region = isoLocale.split('-')[1] || isoLocale;\n            if (region) {\n                return _.find(countryData, country => country && country.iso2 === region);\n            }\n        }\n        return null;\n    }),\n\n    isoRegionalLocale: computed('isoLocale', function () {\n        const [locale, region] = this.get('isoLocale').split('-');\n        if (region) {\n            return `${locale}-${region.toUpperCase()}`;\n        }\n        return locale;\n    }),\n\n    t(key, opts, noEscape) {\n        if (!key) {\n            Ember.Logger.warn('There was no key provided to translate.');\n            return '';\n        }\n\n        if (noEscape === true) {\n            return this._super(key, opts);\n        }\n        if (!opts) {\n            return this._super(key);\n        }\n\n        return this._super(key, escape(opts));\n    },\n\n    _initialLocale() {\n        const authLocale = this.get('cookies').read(localeCookie);\n        const systemLocale = this.get('systemLocale');\n        return authLocale || systemLocale;\n    },\n\n    _normalizeLocale(locale, localeRootFallback = true) {\n        locale = locale.toLowerCase().replace('_', '-');\n        if (locale.startsWith('en')) {\n            locale = 'en-us';\n        }\n        if (locale.startsWith('nn') || locale.startsWith('nb')) {\n            // Norwegian: nn-NO; nb-NO in Windows\n            locale = 'no';\n        }\n        const supportedLocales = this.get('supportedLocales');\n        if (!supportedLocales.includes(locale)) {\n            const rootLocale = locale.slice(0, 2);\n            if (supportedLocales.includes(rootLocale)) {\n                return rootLocale;\n            } else if (localeRootFallback) {\n                return supportedLocales.find(lang => {\n                    return lang.slice(0, 2) === rootLocale;\n                });\n            } else {\n                return null;\n            }\n        }\n        return locale;\n    },\n\n    getWithServerKey(key) {\n        return safeString(this.t(addServerPrefix(key)));\n    },\n\n    lookup(key, replacements, suppressError) {\n        if (this.exists(addServerPrefix(key))) {\n            return this.getWithServerKey(key);\n        }\n\n        if (!this.exists(key)) {\n            if (!isTesting && this.get('loaded')) {\n                Ember.Logger.warn('Undefined intl key', { key, locale: this.get('locale') });\n            }\n            return missingMessage(key, [this.get('locale')], suppressError);\n        }\n\n        //Achieves parity with old i18n functionality: all HTML was allowed in all translation strings\n        return safeString(this.t(key, replacements || {}));\n    },\n\n    query(key) {\n        return this.exists(key) || this.exists(addServerPrefix(key));\n    },\n\n    setLocale(locales) {\n        if (!Array.isArray(locales)) {\n            locales = [locales];\n        }\n\n        let validLocales = locales.map(l => this._normalizeLocale(l)).filter(l => l);\n\n        const baseLocale = this.get('baseLocale');\n        if (!validLocales.includes(baseLocale)) {\n            validLocales.push(baseLocale);\n        }\n\n        if (validLocales.length) {\n            // Set the moment locale\n            const lang = moment.locale(validLocales[0]);\n\n            // Set HTML locale (moment.locale returns just the language portion)\n            Ember.$('html').attr('lang', lang);\n        }\n\n        return this._super(validLocales);\n    },\n\n    setPreferredLanguage(locale) {\n        const safeLocale = this._normalizeLocale(locale);\n        if (!safeLocale) {\n            const error = new Error(`\"${locale}\" is not a supported locale.`);\n            return RSVP.reject(error);\n        }\n\n        try {\n            let dynamicCookieOptions = {\n                domain: getEnvCookieDomain()\n            };\n\n            if (window && window.location && window.location.protocol === 'https:') {\n                dynamicCookieOptions.secure = true;\n            }\n\n            if (navigator && navigator.userAgent && isSameSiteNoneCompatible(navigator.userAgent)) {\n                dynamicCookieOptions.sameSite = 'none';\n            }\n\n            const options = Ember.assign(dynamicCookieOptions, localeCookieOptions);\n            this.get('cookies').write(localeCookie, safeLocale, options);\n\n            return RSVP.resolve();\n        } catch (e) {\n            let msg = 'Failed to persist new locale setting.';\n            if (e && e.message) {\n                msg += `  Details: ${e.message}`;\n            }\n            return RSVP.reject(new Error(msg));\n        }\n    },\n\n    isLocale12Hour() {\n        return moment.localeData(this.get('locale')).longDateFormat('LT').indexOf('A') > -1;\n    },\n\n    init() {\n        this._super(...arguments);\n        this.set('_cache', {});\n        this.setLocale(this._initialLocale());\n\n        const defer = RSVP.defer();\n        this.setProperties({\n            _loadedResolve: defer.resolve,\n            loadedPromise: defer.promise\n        });\n    },\n\n    loadLanguage(locale) {\n        return this.get('ajax')\n            .request(`${this.get('application.urlprefix')}translations/${locale}.json`, { contentType: 'text/plain' })\n            .then(text => {\n                if (!text) {\n                    return RSVP.resolve();\n                }\n\n                try {\n                    // gotta be careful here...\n                    let lang = text;\n                    if (typeof text === 'string') {\n                        lang = JSON.parse(text);\n                    }\n                    if (lang) {\n                        get(this, '_cache')[locale] = lang;\n                        return this.addTranslations(locale, lang);\n                    }\n                } catch (e) {\n                    return RSVP.resolve();\n                }\n            });\n    },\n\n    loadTranslations() {\n        const baseLocale = this.get('baseLocale');\n        const isoLocale = this.get('isoLocale');\n        const locales = [baseLocale];\n        if (isoLocale !== baseLocale) {\n            locales.push(isoLocale);\n        }\n        const translations = locales.map(locale => {\n            let cache = get(this, '_cache');\n            const cached = get(cache, locale);\n            if (cached) {\n                return Ember.RSVP.resolve(cached);\n            }\n            return this.loadLanguage(locale);\n        });\n        return Ember.RSVP.all(translations).then(() => {\n            this.set('loaded', true);\n            this.get('_loadedResolve')();\n        });\n    },\n\n    setupServerTranslations() {\n        // go ahead and kick off local file loading\n        this.loadTranslations();\n\n        const locale = this.get('isoLocale');\n        const url = this.get('application').pcV2Uri('api/v2/languages/translations/organization');\n\n        const defaultRequest = this.get('ajax').request(url, {\n            data: {\n                language: 'en-us'\n            }\n        });\n\n        let localeRequest = Ember.RSVP.resolve({});\n        if (locale !== 'en-us') {\n            localeRequest = this.get('ajax').request(url, {\n                data: {\n                    language: locale\n                }\n            });\n        }\n\n        return Ember.RSVP.allSettled([defaultRequest, localeRequest])\n            .then(([defaultTranslationsResult, localeTranslationsResult]) => {\n                const defaultTranslations = defaultTranslationsResult.value;\n                const localeTranslations = localeTranslationsResult.value;\n\n                if (!defaultTranslations) {\n                    Ember.Logger.warn(\"Couldn't load API translations\", {\n                        remoteData: {\n                            reason: defaultTranslationsResult.reason\n                        }\n                    });\n                    return;\n                }\n\n                if (_.isEmpty(localeTranslations)) {\n                    return this.addTranslations(locale, { server_translations: defaultTranslations });\n                }\n\n                _.forIn(defaultTranslations, (value, key) => {\n                    if (!Object.prototype.hasOwnProperty.call(localeTranslations, key)) {\n                        localeTranslations[key] = value;\n                    }\n                });\n\n                return this.addTranslations(locale, { server_translations: localeTranslations });\n            })\n            .catch(err => {\n                Ember.Logger.warn(\"Couldn't load API translations:\", { err });\n            });\n    }\n});\n","import Ember from 'ember';\nimport { PROVIDER_ID as INTERNAL_VIDEO_PROVIDER_ID } from 'connections-ui/media-providers/purecloud';\nimport LoggerMixin from '../mixins/logger';\n\nexport default Ember.Service.extend(Ember.Evented, LoggerMixin, {\n    chat: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    store: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n\n    defaultVideoProviders: null,\n\n    activeProvider: null,\n\n    getProvidersForUser(type, user, chatRoom) {\n        if (type === 'video') {\n            return this.getVideoProviders(user, chatRoom);\n        }\n        return [];\n    },\n\n    getProvider(name, user) {\n        return this.lookup(name, user);\n    },\n\n    getVideoProviders(user, chatRoom = null) {\n        if (!user && !chatRoom) {\n            return [];\n        }\n\n        return [\n            this.lookup('purecloud', user, chatRoom),\n            this.lookup('zoom', user, chatRoom),\n            this.lookup('teams', user, chatRoom)\n        ];\n    },\n\n    usingVideoProvider: Ember.computed('activeProvider.type', function () {\n        return this.get('activeProvider.type') === 'video';\n    }),\n\n    enabled: Ember.computed.or('teamsEnabled', 'zoomMeetingsEnabled'),\n    zoomMeetingsEnabled: Ember.computed.readOnly('permissions.canViewZoomMeetings'),\n    teamsEnabled: Ember.computed.readOnly('permissions.canViewTeamsMeetings'),\n\n    // Internal\n\n    handleLogout(blockLogoutCb) {\n        if (this.get('usingVideoProvider')) {\n            blockLogoutCb('add', this);\n\n            let title = this.get('intl').t('mediaProviders.zoom.errors.cannotLogout.title');\n            let message = this.get('intl').t('mediaProviders.zoom.errors.cannotLogout.message');\n            this.get('notification').error(title, message);\n        } else {\n            blockLogoutCb('remove', this);\n        }\n    },\n\n    lookup(providerName, user, chatRoom) {\n        const provider = Ember.getOwner(this).lookup(`media-provider:${providerName}`);\n        provider.set('user', user);\n        provider.set('room', chatRoom);\n        provider.set('debug', this.get('debug'));\n        provider.loadData();\n        return provider;\n    },\n\n    userHasVideoMediaProviders(user) {\n        const providers = this.getProvidersForUser('video', user).filter(provider => provider.get('haveAccess'));\n        return providers.length > 1;\n    }\n});\n\n/**\n * Returns true if the provided list of providers contains an enabled,\n * supplemental (e.g. teams, zoom) video provider.\n * @param {Ember.Object[]} providers A list of provider Ember instances\n * @returns true if providers contains an enabled, supplemental provider;  false otherwise.\n */\nexport function hasSupplementalVideoProvider(providers) {\n    return providers.some(\n        currProvider =>\n            currProvider.get('type') === 'video' &&\n            currProvider.get('haveAccess') &&\n            currProvider.get('id') &&\n            currProvider.get('id') !== INTERNAL_VIDEO_PROVIDER_ID\n    );\n}\n","import Ember from 'ember';\nimport ENV from '../config/environment';\n\nconst { computed, Service } = Ember;\n\nfunction computedFromConfig(prop) {\n  return computed(function(){\n    return ENV['ember-modal-dialog'] && ENV['ember-modal-dialog'][prop];\n  });\n}\n\nexport default Service.extend({\n  hasEmberTether: computedFromConfig('hasEmberTether'),\n  hasLiquidWormhole: computedFromConfig('hasLiquidWormhole'),\n  hasLiquidTether: computedFromConfig('hasLiquidTether'),\n  destinationElementId: computed(function() {\n    /*\n      everywhere except test, this property will be overwritten\n      by the initializer that appends the modal container div\n      to the DOM. because initializers don't run in unit/integration\n      tests, this is a nice fallback.\n    */\n    if (ENV.environment === 'test') {\n      return 'ember-testing';\n    }\n  })\n});\n","import Ember from 'ember';\nimport MomentService from 'ember-moment/services/moment';\nimport config from '../config/environment';\n\nconst { get } = Ember;\n\nexport default MomentService.extend({\n  defaultFormat: get(config, 'moment.outputFormat')\n});\n","import Ember from 'ember';\n\nexport default Ember.Service.extend({\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    _getNamePart: function (externalContact, namePart) {\n        const result = externalContact[namePart];\n        return (\n            (typeof result === 'string' ? result : false) || (externalContact.get ? externalContact.get(namePart) : '')\n        );\n    },\n\n    _getNames: function (externalContact) {\n        return {\n            familyName: this._getNamePart(externalContact, 'lastName'),\n            givenName: this._getNamePart(externalContact, 'firstName')\n        };\n    },\n\n    initials: function (externalContact) {\n        // TODO: RELATE-1038 UI - ACD Need to localize the code for harvesting initials for display when transferring a call to a Relate External contact\n        const { familyName, givenName } = this._getNames(externalContact);\n\n        if (givenName) {\n            const givenNameInitial = givenName.charAt(0).toUpperCase();\n            if (familyName) {\n                const familyNameInitial = familyName.charAt(0).toUpperCase();\n                return this.get('intl').t('purecloud.acdInteraction.relate.misc.initials', {\n                    givenNameInitial,\n                    familyNameInitial\n                });\n            }\n            return givenNameInitial;\n        }\n        if (familyName) {\n            return familyName.charAt(0).toUpperCase();\n        }\n        return '';\n    },\n\n    fullName: function (externalContact) {\n        if (!externalContact) {\n            return;\n        }\n\n        const { familyName, givenName } = this._getNames(externalContact);\n        const optionalMiddleName = this._getNamePart(externalContact, 'middleName') || null;\n        if (familyName) {\n            if (givenName) {\n                return this.get('intl').lookup('purecloud.acdInteraction.relate.misc.fullName', {\n                    familyName,\n                    givenName,\n                    optionalMiddleName\n                });\n            } else {\n                return familyName;\n            }\n        }\n        return givenName;\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { Evented } = Ember;\n\nexport default Ember.Service.extend(Evented, {\n    notification: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n\n    _notificationId: 0,\n    _actionHandles: {},\n    _clickHandlers: [],\n\n    nextNotificationId: Ember.computed('_notificationId', function () {\n        const currentNotificationId = this.get('_notificationId');\n        return (currentNotificationId || 0) + 1;\n    }),\n\n    _cleanUpHandlers(id) {\n        const handles = this.get('_actionHandles');\n        delete handles[id];\n    },\n\n    handleNotificationAction(action, id) {\n        const handles = this.get('_actionHandles');\n        const clickHandlers = this.get('_clickHandlers');\n\n        if (handles[id]) {\n            const handler = _.find(handles[id], v => {\n                return v.actionKey === action;\n            });\n\n            if (handler && typeof handler.action === 'function') {\n                handler.action(handler.target);\n                this._cleanUpHandlers(id);\n            } else if (handler && handler.target && handler.target[handler.actionKey]) {\n                handler.target[handler.actionKey](handler.target);\n                this._cleanUpHandlers(id);\n            } else {\n                this.get('logger').error('Attempted to invoke undefined notification handler.');\n            }\n\n            this.set('_actionHandles', handles);\n        }\n\n        if (action === 'clickHandlerTriggered') {\n            if (typeof clickHandlers[id] === 'function') {\n                clickHandlers[id]();\n            } else {\n                this.get('logger').error(\n                    `Attempted to trigger a click handler that isnt a function or was not registered. Click handler at id: ${id} is ${clickHandlers[\n                        id\n                    ].toString()}\\n`\n                );\n            }\n        }\n    },\n\n    requestNotification(title, message = '', custom = {}, type = 'info') {\n        let options = _.pick(custom, [\n            'id',\n            'hideAfter',\n            'tag',\n            'type',\n            'forceBrowserNotification',\n            'icon',\n            'showCloseButton',\n            'messageStyle',\n            'shouldShowPopup',\n            'shouldPlaySound',\n            'markdownToHtml',\n            'fallbackToInBrowser',\n            'showNotificationEverywhere'\n        ]);\n\n        // Legacy api was tag only. Copy as id for events, etc.\n        if (options.tag && !options.id) {\n            options.id = options.tag;\n        }\n\n        // Escape safe srings\n        if (title && title.string) {\n            title = title.string;\n        }\n\n        // Set notification id\n        if (!options.id) {\n            const nextNotificationId = this.get('nextNotificationId');\n            const generatedIdentifier = `connections-ui-notification-${nextNotificationId}`;\n\n            // Add an ID to the notification so it can be associated with notification actions from the iframe host\n            options.id = generatedIdentifier;\n            options.tag = generatedIdentifier;\n\n            // Messages after this one should have a different gnerated identifier\n            this.incrementProperty('_notificationId');\n        }\n\n        if (custom.clickHandler) {\n            let clickHandlers = this.get('_clickHandlers') || [];\n            let clickHandlerFunction = custom.clickHandler;\n            let id = options.id;\n            if (!clickHandlers[id] && typeof clickHandlerFunction === 'function') {\n                clickHandlers[id] = clickHandlerFunction;\n            }\n            options.clickHandler = true;\n        }\n\n        // Store action handles\n        if (custom.actionHandlers && custom.target) {\n            let handles = this.get('_actionHandles') || [];\n            let id = options.id;\n\n            if (!handles[id]) {\n                handles[id] = {};\n            }\n\n            // Normalize and store handlers\n            _.forEach(custom.actionHandlers, (value, key) => {\n                let action, label;\n                if (value.action) {\n                    action = value.action;\n                    label = value.label;\n                } else {\n                    action = '';\n                    label = value;\n                }\n\n                handles[id][key] = {\n                    actionKey: key,\n                    action: action,\n                    target: custom.target,\n                    label: label\n                };\n            });\n\n            this.set('_actionHandles', handles);\n\n            // Normalize labels before sending to web-dir\n            let handlers = {};\n            _.forEach(custom.actionHandlers, (value, key) => {\n                if (value.action) {\n                    handlers[key] = value.label;\n                } else {\n                    handlers[key] = value;\n                }\n            });\n\n            options.actionHandlers = handlers;\n        }\n\n        options.type = type;\n\n        const notification = {\n            message,\n            custom: options\n        };\n\n        if (title) {\n            notification.title = title;\n        }\n        this.get('embedded').requestNotification(notification);\n        return notification;\n    },\n\n    info(title, message, options = {}) {\n        if (!this.get('embedded.isEmbedded')) {\n            return this.get('notification').info(...arguments);\n        }\n        if (title && typeof title !== 'string') {\n            title = title.toString();\n        }\n        if (message && typeof message !== 'string') {\n            message = message.toString();\n        }\n        return this.requestNotification(title, message, options, 'info');\n    },\n\n    error(title, message, options = {}) {\n        if (!this.get('embedded.isEmbedded')) {\n            return this.get('notification').error(...arguments);\n        }\n        if (title && typeof title !== 'string') {\n            title = title.toString();\n        }\n        if (message && typeof message !== 'string') {\n            message = message.toString();\n        }\n        return this.requestNotification(title, message, options, 'error');\n    },\n\n    success(title, message, options = {}) {\n        if (!this.get('embedded.isEmbedded')) {\n            return this.get('notification').success(...arguments);\n        }\n        if (title && typeof title !== 'string') {\n            title = title.toString();\n        }\n        if (message && typeof message !== 'string') {\n            message = message.toString();\n        }\n        return this.requestNotification(title, message, options, 'success');\n    },\n\n    dismiss(id) {\n        if (!this.get('embedded.isEmbedded')) {\n            this._cleanUpHandlers(id);\n            return this.get('notification').dismissNotification(id);\n        }\n        this.get('embedded').dismissNotification(id);\n    },\n\n    // TODO: we'll need to replumb defined action handlers\n    // on this legacy option for things like answering from toasts\n    show(options) {\n        if (!this.get('embedded.isEmbedded')) {\n            return this.get('notification').show(options);\n        }\n        return this.requestNotification(options.title, options.message, options, options.type);\n    }\n});\n","define(\"connections-ui/services/notification\", [\"exports\", \"ember-purecloud-components/services/notification\"], function (_exports, _notification) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _notification.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst {\n    inject: { service },\n    RSVP: { resolve }\n} = Ember;\n\nexport default Ember.Service.extend(LoggerMixin, {\n    ajax: service(),\n    application: service(),\n\n    /**\n     * Fetches organization settings from the API\n     * @returns {Promise} A promise that resolves with the updated preferences\n     */\n    fetchOrgSettings(orgSettings) {\n        const path = 'api/v2/organizations/settings';\n        const url = this.get('application').pcV2Uri(path);\n\n        return this.get('ajax')\n            .ajaxGet(url)\n            .then(response => {\n                // Create or update the orgSettings object\n                if (!orgSettings) {\n                    orgSettings = Ember.Object.create();\n                }\n\n                orgSettings.set('freeSeating', response.freeSeating);\n                orgSettings.set('popoutAuthForIframes', response.popoutAuthForIframes);\n\n                return orgSettings;\n            })\n            .catch(error => {\n                this.logger.error('Failed to fetch org settings:', { error });\n                return resolve({});\n            });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { inject, computed, Service } = Ember;\nconst WILDCARD = '*';\n\nfunction isPermissionInList(item, targetList) {\n    let inList = item === WILDCARD || targetList === WILDCARD;\n\n    if (!inList) {\n        const listItems = targetList.split(',');\n\n        inList = _.includes(listItems, item);\n    }\n\n    return inList;\n}\n\n/**\n * Compare provided permission divisions against a secific division\n *\n * @item the division to look for\n * @targetList comma-delimited string representation of permission divisions\n */\nfunction shouldAllowBasedOnDivision(item, targetList) {\n    // if the wildcard is present in permission list\n    // if no divisions are returned from PAPI\n    // if the requested division is the WILDCARD\n    // if the requested division was an empty string\n    // -- bypass the division check\n    if (targetList.length === 0 || targetList === WILDCARD || item === WILDCARD || item.length === 0) {\n        return true;\n    }\n\n    const divisions = targetList.split(',');\n    return divisions.includes(item);\n}\n\nfunction isAllowedOrgPermission(allowedOrgPermissions, targetDomain, targetEntity, targetAction) {\n    let domainPermissionMap = _.head(_.map(_.filter(allowedOrgPermissions, { domain: targetDomain }), 'permissionMap'));\n\n    domainPermissionMap = _.flatten(_.map(domainPermissionMap, value => value));\n\n    return (\n        domainPermissionMap &&\n        domainPermissionMap.length &&\n        (targetEntity === WILDCARD || _.find(domainPermissionMap, { entityType: targetEntity })) &&\n        (targetAction === WILDCARD || _.find(domainPermissionMap, { action: targetAction }))\n    );\n}\n\nexport function checkDonutPermission(permissions, permissionValue, allowedOrgPermissions, targetDivision) {\n    let isAllowed = false;\n\n    if (!permissions) {\n        permissions = [];\n    }\n\n    //change domain:* -> domain:*:*\n    if (permissionValue.match(/^[a-zA-Z0-9]+:\\*$/)) {\n        permissionValue = permissionValue.replace('*', '*:*');\n    }\n\n    const permissionsToValidate = permissionValue.split(':'),\n        targetDomain = permissionsToValidate[0],\n        targetEntity = permissionsToValidate[1],\n        targetAction = permissionsToValidate[2];\n\n    if (isAllowedOrgPermission(allowedOrgPermissions, targetDomain, targetEntity, targetAction)) {\n        permissions.forEach(function (permission) {\n            const permissions = permission.split(':'),\n                domain = permissions[0],\n                entity = permissions[1],\n                actionSet = permissions[2],\n                divisions = permissions[3] || '';\n\n            if (targetDomain === domain) {\n                const matchesEntity = isPermissionInList(targetEntity, entity);\n                const matchesAction = isPermissionInList(targetAction, actionSet);\n                const matchesDivision = shouldAllowBasedOnDivision(targetDivision, divisions);\n\n                if (matchesEntity && matchesAction && matchesDivision) {\n                    isAllowed = true;\n                }\n            }\n        });\n    }\n\n    return isAllowed;\n}\n\nexport default Service.extend(LoggerMixin, {\n    session: inject.service(),\n\n    permissions: computed.reads('session.permissions'),\n    rolePermissions: computed.reads('session.roleNames'), //Deprecated\n    allowedOrgPermissions: computed.reads('session.allowedOrgPermissions'),\n    trusteeOrg: computed.reads('session.trusteeOrg'),\n\n    hasUnifiedCommunications: computed('session.org.hasUnifiedCommunications', 'trusteeOrg', function () {\n        return !!(\n            this.get('session.org.hasUnifiedCommunications') || this.get('trusteeOrg.features.unifiedCommunications')\n        );\n    }),\n\n    directoryPermissions: computed('permissions.[]', function () {\n        const permissions = this.get('permissions');\n        return _.filter(permissions, permission => {\n            return _.includes(permission, '_');\n        });\n    }),\n\n    donutPermissions: computed('permissions.[]', function () {\n        const permissions = this.get('permissions');\n        return _.filter(permissions, permission => {\n            return _.includes(permission, ':');\n        });\n    }),\n\n    validateDonutPermission: function (permission, division = '*') {\n        const isAuthenticated = this.get('session.isAuthenticated');\n        const logger = this.get('logger');\n\n        if (!isAuthenticated) {\n            logger.debug('attempted to check a permission before authenticated', { permission });\n        }\n\n        if (typeof division !== 'string') {\n            logger.error('Division argument for permission check must be a string.');\n            return false;\n        }\n\n        return checkDonutPermission(\n            this.get('donutPermissions'),\n            permission,\n            this.get('allowedOrgPermissions'),\n            division.trim()\n        );\n    },\n\n    validateAllPermissions: function (permissionsList) {\n        return (permissionsList || []).every(permission => this.validateDonutPermission(permission));\n    },\n\n    validateAnyPermissions: function (permissionsList) {\n        const permissionsSet = permissionsList || [];\n        return permissionsSet.some(permission => this.validateDonutPermission(permission));\n    },\n\n    canCreateGroups: computed('directoryPermissions.[]', 'donutPermissions.[]', function () {\n        const permissions = this.get('directoryPermissions');\n        const hasDirectoryPermissions =\n            _.includes(permissions, 'group_creation') || _.includes(permissions, 'group_administration');\n        const hasDonutPermission = this.validateDonutPermission('directory:group:add');\n        return hasDirectoryPermissions || hasDonutPermission;\n    }),\n\n    canDeleteGroups: computed('directoryPermissions.[]', 'donutPermissions', function () {\n        const permissions = this.get('directoryPermissions');\n        const hasDirectoryPermissions = _.includes(permissions, 'group_administration');\n        const hasDonutPermission = this.validateDonutPermission('directory:group:edit');\n        return hasDirectoryPermissions || hasDonutPermission;\n    }),\n\n    canInvitePeople: computed('directoryPermissions.[]', function () {\n        const permissions = this.get('directoryPermissions');\n        return _.includes(permissions, 'person_administration');\n    }),\n\n    canViewQueue: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('routing:queue:view');\n    }),\n\n    canViewQueueObservations: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('analytics:queueObservation:view');\n    }),\n\n    canViewAcdScreenShare: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('acdscreenshare:session:view');\n    }),\n\n    canViewAcdCoBrowseForCall: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('cobrowse:session:view') &&\n            this.validateDonutPermission('cobrowse:voice:escalate')\n        );\n    }),\n\n    canViewAcdCoBrowseForChat: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('cobrowse:session:view') &&\n            this.validateDonutPermission('cobrowse:chat:escalate')\n        );\n    }),\n\n    canViewBusinessChat: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('chat:chat:access');\n    }),\n\n    canViewCollaborateVideo: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('video:video:access');\n    }),\n\n    hasVoicemailAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('voicemail:*:*');\n    }),\n\n    canViewAnAgentsSchedule: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            (this.validateDonutPermission('wfm:activityCode:administer') ||\n                this.validateDonutPermission('wfm:activityCode:view')) &&\n            (this.validateDonutPermission('wfm:schedule:administer') ||\n                this.validateDonutPermission('wfm:schedule:view')) &&\n            this.get('hasAgentSupervisorAccess')\n        );\n    }),\n\n    hasAgentSupervisorAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('ui:supervisorAgentDetails:view') && this.get('canViewUsers');\n    }),\n\n    hasRelateAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('externalContacts:*:*');\n    }),\n\n    hasExternalContactsViewContactAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('externalContacts:contact:view');\n    }),\n\n    // Checking against the donut permission: conversation:call:add or unified_communications\n    // Eventually when unified_communications is removed, we can remove the check here\n    phoneEnabled: computed(\n        'hasUnifiedCommunications',\n        'donutPermissions',\n        'directoryPermissions.[]',\n        'allowedOrgPermissions.[]',\n        function () {\n            const hasUnifiedCommunications = this.get('hasUnifiedCommunications');\n            const legacyUnifiedCommunicationsPermission = _.includes(\n                this.get('directoryPermissions'),\n                'unified_communications'\n            );\n            const canCall = this.validateDonutPermission('conversation:call:add');\n\n            const phoneEnabled = hasUnifiedCommunications && (legacyUnifiedCommunicationsPermission || canCall);\n            return phoneEnabled;\n        }\n    ),\n\n    conferenceEnabled: true,\n\n    canCallForward: computed('phoneEnabled', 'donutPermissions', 'allowedOrgPermissions.[]', function () {\n        return this.validateDonutPermission('conversation:callForwarding:edit') && this.get('phoneEnabled');\n    }),\n\n    canRecord: computed('rolePermissions', 'donutPermisions', 'allowedOrgPermissions.[]', function () {\n        const canRecord = this.validateDonutPermission('conversation:call:record');\n        const isBusinessUserOrSupervisor =\n            this.get('rolePermissions').indexOf('businessUser') > -1 ||\n            this.get('rolePermissions').indexOf('supervisor') > -1;\n        return isBusinessUserOrSupervisor || canRecord;\n    }),\n\n    hasEngageAccess: computed('session.org.enabledFeatures.{purecloud,contactCenter}', function () {\n        let hasContactCenter = this.get('session.org').getFieldValue('enabledFeatures.contactCenter');\n        return hasContactCenter && hasContactCenter.value;\n    }),\n\n    canViewUsers: computed('donutPermissions', function () {\n        return this.validateDonutPermission('directory:user:view');\n    }),\n\n    canEditProfiles: computed('donutPermissions', function () {\n        return this.validateDonutPermission('directory:user:edit');\n    }),\n\n    canReadProfiles: computed('donutPermissions', function () {\n        return this.validateDonutPermission('directory:user:view');\n    }),\n\n    canViewGroups: computed('donutPermissions', function () {\n        return this.validateDonutPermission('directory:group:view');\n    }),\n\n    canEditGroups: computed('donutPermissions', function () {\n        return this.validateDonutPermission('directory:group:edit');\n    }),\n\n    canDeleteParticipantFromGroup: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('chat:participant:delete');\n    }),\n\n    canViewZoomMeetings: computed('donutPermissions', function () {\n        return this.validateDonutPermission('integration:zoomMeetings:view');\n    }),\n\n    canViewTeamsMeetings: computed('donutPermissions', function () {\n        return this.validateDonutPermission('integration:microsoftTeamsMeetings:view');\n    }),\n\n    canTargetUserSearchOutsideOfDivision: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('conversation:communication:target');\n    }),\n\n    canTargetQueueSearchOutsideOfDivision: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('conversation:communication:target');\n    }),\n\n    canViewIntegrationPresence: computed('donutPermissions', 'allowedOrgPermissions', 'session.features', function () {\n        return this.validateDonutPermission('integration:presence:view');\n    }),\n\n    canViewSummary: computed('donutPermissions', function () {\n        return this.validateDonutPermission('conversation:summary:view');\n    }),\n\n    canEditGroupTelephonySettings: computed(\n        'donutPermissions',\n        'allowedOrgPermissions',\n        'session.features',\n        function () {\n            return this.validateDonutPermission('telephony:plugin:all');\n        }\n    )\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { addPageAction } from '../utils/newrelic';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nconst { computed, inject } = Ember;\n\nexport const DEFAULT_PHONE_INTEGRATION_KEY = 'genesys';\nexport const GENESYS_SEARCH_TAB = {\n    key: 'genesys',\n    icon: 'assets/images/svg/genesys-logo-red.svg'\n};\nconst CONFIG_PAGE_SIZE = 25;\nconst CONFIGS_API_URL_V2 = 'api/v2/integrations/unifiedcommunications/clientapps'; // New integrations config endpoint\nconst NEW_RELIC_NAMESPACE = 'ucc.ui.integration';\n\nexport default Ember.Service.extend(Ember.Evented, LoggerMixin, {\n    application: inject.service(),\n    ajax: inject.service(),\n    session: inject.service(),\n    intl: inject.service(),\n    permissions: inject.service(),\n    store: inject.service(),\n    notification: inject.service('notification-proxy'),\n    integrationsPresence: inject.service(),\n\n    newRelicNamespace: NEW_RELIC_NAMESPACE,\n\n    integrations: computed('allApps', 'permissions.donutPermissions', 'permissions.allowedOrgPermissions', function () {\n        const allApps = this.get('allApps');\n        return allApps.filter(this._isValidIntegrationTab.bind(this));\n    }),\n\n    allApps: [],\n    integrationConfigs: [],\n\n    onAuthenticated: Ember.on(\n        'init',\n        Ember.observer('session.isAuthenticated', async function () {\n            // only try to fetch configs if we're authenticated\n            if (this.get('session.isAuthenticated') && !this.get('integrationConfigsInitialized')) {\n                this.toggleProperty('integrationConfigsInitialized');\n\n                this._fetchConfigs()\n                    .then(configs => {\n                        this.set('integrationConfigs', configs);\n\n                        // configs have enough information to gate users\n                        this.set('allApps', configs);\n                    })\n                    .catch(err => {\n                        this.get('logger').error(\n                            `services/phone-integration: Phone Integration Service: error fetching integration configurations`,\n                            { err }\n                        );\n                    });\n            }\n        })\n    ),\n\n    init() {\n        this._super(...arguments);\n\n        // use this to trigger observer to fetch configs\n        this.get('session.isAuthenticated');\n    },\n    getIntegrationTabs() {\n        const integrations = this.get('integrations');\n        const tabs = [\n            GENESYS_SEARCH_TAB,\n            ...integrations.map(integration => {\n                return {\n                    key: integration.key,\n                    integrationPresenceSource: integration.integrationPresenceSource,\n                    icon: integration.icon,\n                    translation: integration.translation\n                };\n            })\n        ];\n        return integrations.length > 0 ? tabs : [];\n    },\n    getIntegration(key) {\n        const integrations = this.getIntegrationTabs();\n        return integrations.find(i => i.key === key);\n    },\n\n    canViewThirdPartyPresence(source) {\n        const integration = this.getIntegrationFromSource(source);\n        return integration && this._isValidIntegrationTab(integration);\n    },\n\n    getIntegrationFromSource(source) {\n        const allApps = this.get('allApps');\n        return allApps.find(integration => {\n            return (\n                integration.integrationPresenceSource &&\n                integration.integrationPresenceSource.toLowerCase() === source.toLowerCase()\n            );\n        });\n    },\n\n    async getIntegrationTransferTarget(person, integrationKey) {\n        if (!person || !person.integrationContactInfo || !integrationKey) {\n            return null;\n        }\n\n        let contact = person.integrationContactInfo(integrationKey);\n        if (contact) {\n            try {\n                // make users api call to get address\n                const url = this.get('application').pcV2Uri(`api/v2/users/${person.get('id')}`);\n                const user = await this.get('ajax').ajaxGet(url, { dataType: 'json' });\n                const addressObj = user.addresses.find(add => add.integration && add.integration === integrationKey);\n                if (addressObj) {\n                    return addressObj.address;\n                }\n            } catch (err) {\n                // if error, we'll fallback to how we were initially attempting with e164 data\n                this.logger.warn(\n                    'PBX Transfer: attempted to fetch user address, but failed. Falling back to e164 data.',\n                    {\n                        err\n                    }\n                );\n            }\n\n            // fallback\n            if (contact.rel && contact.rel.e164) {\n                return contact.rel.e164;\n            } else {\n                this.logger.warn('Attempted transfer to integration user, but e164 data not found:', {\n                    remoteData: {\n                        userId: person.get('id'),\n                        integration: integrationKey\n                    }\n                });\n            }\n        }\n        return null;\n    },\n\n    getFeatureToggle(toggle) {\n        return this.get('session.features') && this.get('session.features')[toggle];\n    },\n\n    _fetchConfigs() {\n        let allConfigsPromise = new Ember.RSVP.Promise((resolve, reject) => {\n            this._accumulateConfigs(\n                configs => {\n                    resolve(configs);\n                },\n                reason => {\n                    reject(reason);\n                },\n                1,\n                CONFIG_PAGE_SIZE,\n                null\n            );\n        });\n        return allConfigsPromise;\n    },\n\n    /**\n     * Recursively get integration configuration objects.\n     * @param {function} resolve resolver function to call with the configurations as the parameter\n     * @param {function} reject rejection function to call with the rejection reason as the parameter\n     * @param {number} pageNumber current page number\n     * @param {number} pageSize current page size\n     * @param {object} configs accumulated configuration objects\n     */\n    _accumulateConfigs(resolve, reject, pageNumber, pageSize, configs) {\n        if (typeof configs === 'undefined' || configs === null) {\n            configs = [];\n        }\n        let configsUrl = this.get('application').pcV2Uri(CONFIGS_API_URL_V2);\n        let queryParams = {\n            pageNumber,\n            pageSize\n        };\n        configsUrl += `?${Ember.$.param(queryParams, true)}`;\n        this.get('ajax')\n            .request(configsUrl)\n            .then(result => {\n                if (!result) {\n                    reject('Invalid integration configs return value');\n                    return;\n                }\n                if (Array.isArray(result.entities)) {\n                    let validConfigObjs = _.chain(result.entities)\n                        .filter(config => this._isValidIntegrationConfig(config))\n                        .map(config => this._mapIntegrationConfig(config))\n                        .value();\n\n                    configs.push(...validConfigObjs);\n                }\n                // continue accumulating configs if more pages exist\n                if (result.pageNumber < result.pageCount) {\n                    this._accumulateConfigs(resolve, reject, result.pageNumber + 1, pageSize, configs);\n                } else {\n                    resolve(configs);\n                }\n            })\n            .catch(reject);\n    },\n\n    _isValidIntegrationConfig(config) {\n        return (\n            config &&\n            typeof config === 'object' &&\n            Ember.typeOf(Ember.get(config, 'id')) === 'string' &&\n            Ember.typeOf(Ember.get(config, 'ucIntegrationKey.id')) === 'string'\n        );\n    },\n\n    _mapIntegrationConfig(config) {\n        const key = Ember.get(config, 'ucIntegrationKey.id');\n\n        const i10n = Ember.get(config, 'i10n');\n        const systemLocale = this.get('intl.systemLocale').toLowerCase();\n        let translation = key;\n\n        if (i10n !== undefined) {\n            if (i10n[systemLocale] && i10n[systemLocale].name) {\n                translation = i10n[systemLocale].name;\n            }\n        }\n\n        return {\n            id: Ember.get(config, 'id'),\n            key,\n            integrationPresenceSource: Ember.get(config, 'integrationPresenceSource'),\n            icon: Ember.get(config, 'icon.vector'),\n            badgeIcons: {\n                light: Ember.get(config, 'badgeIcons.light.vector'),\n                dark: Ember.get(config, 'badgeIcons.dark.vector')\n            },\n            translation,\n            pbxPermission: Ember.get(config, 'pbxPermission'),\n            pollingEnabled: Ember.get(config, 'polledPresence'),\n            pollIntervalSec: Ember.get(config, 'pollIntervalSec'),\n            includeBadge: Ember.get(config, 'includeBadge')\n        };\n    },\n\n    _isValidIntegrationTab(clientApp) {\n        const key = Ember.get(clientApp, 'key');\n        const hasUcIntegrationKey = key && key !== '';\n        const pbxPermission = Ember.get(clientApp, 'pbxPermission');\n        // gate the integration tab based on pbx permission\n        if (pbxPermission !== undefined) {\n            const permissionService = this.get('permissions');\n            const canViewPbxTab = permissionService.validateDonutPermission(pbxPermission);\n            return hasUcIntegrationKey && canViewPbxTab;\n        }\n        return hasUcIntegrationKey;\n    },\n    sendNewRelicAction(metric, value, ucIntegrationKey) {\n        //capture analytics & send to new relic for UC Integrations\n        addPageAction(this.get('newRelicNamespace'), {\n            metric,\n            value,\n            ucIntegrationKey\n        });\n    }\n});\n","/* eslint no-console: \"off\" */\n\nimport Ember from 'ember';\nimport { task, timeout } from 'ember-concurrency';\nimport _ from 'lodash';\n\n// models\nimport ConversationModel from 'connections-ui/models/conversation-legacy';\n\n// mixins\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport AcdUtilitiesMixin from 'connections-ui/mixins/acd-utilities';\nimport ConversationMixin from 'connections-ui/mixins/conversation';\nimport UriBuilderMixin from 'connections-ui/mixins/conversation-uri-builder';\nimport ActiveCallMixin from 'connections-ui/mixins/phone-service/active-call';\nimport CallControlsMixin from 'connections-ui/mixins/phone-service/call-controls';\nimport CallForwardMixin from 'connections-ui/mixins/phone-service/call-forward';\nimport ConversationManagerMixin from 'connections-ui/mixins/phone-service/conversation-manager';\nimport EventsMixin from 'connections-ui/mixins/phone-service/events';\nimport PhoneNotificationsMixin from 'connections-ui/mixins/phone-service/notifications';\nimport StationMixin from 'connections-ui/mixins/phone-service/station';\n\n// utils\nimport webrtcConversationTypes from 'ember-webrtc-components/utils/webrtc-conversation-types';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport QueuedProcessingChain from 'connections-ui/utils/queued-processing-chain';\n\nexport function isDefinedAndLengthGreaterThan(obj, n) {\n    if (obj) {\n        if (!obj.length) {\n            return false;\n        } else if (obj.length > n) {\n            return true;\n        }\n        return false;\n    }\n    return false;\n}\nconst { computed, inject, observer, Evented, Logger } = Ember;\n\nconst VOICEMAIL_URL = '@127.0.0.1;user=voicemail';\n\nconst mixins = [\n    AcdUtilitiesMixin,\n    ActiveCallMixin,\n    CallControlsMixin,\n    CallForwardMixin,\n    ConversationMixin,\n    ConversationManagerMixin,\n    EventsMixin,\n    LoggerMixin,\n    PhoneNotificationsMixin,\n    StationMixin,\n    UriBuilderMixin\n];\n\nexport default Ember.Service.extend(Evented, ...mixins, {\n    isDefinedAndLengthGreaterThan: isDefinedAndLengthGreaterThan,\n\n    // services\n    session: inject.service(),\n    application: inject.service(),\n    pigeon: inject.service(),\n    streaming: inject.service(),\n    communication: inject.service(),\n    permissions: inject.service(),\n    webrtc: inject.service(),\n    intl: inject.service(),\n    addressformat: inject.service(),\n    notification: inject.service('notification-proxy'),\n    ajax: inject.service(),\n    preferences: inject.service(),\n    externalContacts: inject.service(),\n    headset: inject.service(),\n    webrtcSdkService: inject.service('webrtcSdk'),\n\n    applicationController: null, // needed?\n\n    _processingChain: null,\n    _contactObservers: null,\n\n    init() {\n        this._super(...arguments);\n        this.set('_contactObservers', {});\n        this._initializeProcessingChain();\n        try {\n            this.get('preferences')\n                .getPreference('phone.thisBrowserIsTheOneToAnswerFrom')\n                .then(value => {\n                    if (!this.isDestroyed && !this.isDestroying) {\n                        this.set('thisBrowserIsTheOneToAnswerFrom', value);\n                    }\n                });\n\n            this.get('communication').on('callTransferred', this, this._handleCallTransferred);\n        } catch (err) {\n            if (!isTesting) throw err;\n        }\n    },\n\n    _initializeProcessingChain() {\n        const interactionProcessingChain = QueuedProcessingChain.create({\n            lifecycleContainer: this,\n            label: 'phone service: interaction processing chain'\n        });\n        this.set('_processingChain', interactionProcessingChain);\n        interactionProcessingChain.setProcessingChain([\n            {\n                label: 'Filtering and Context Acquisition',\n                process: ({ eventSource, payload }) => {\n                    if (!payload || !payload.id) return false;\n\n                    const interactionType = this.getInteractionTypeFromCP(payload);\n                    if (\n                        !interactionType.isCall ||\n                        (interactionType.isCall && interactionType.isCallback) ||\n                        interactionType.isFax\n                    ) {\n                        return false;\n                    }\n\n                    const calls = this.get('conversations');\n                    let interactionModel = calls.findBy('id', payload.id);\n                    const newInteraction = !interactionModel;\n                    const prevRaw = interactionModel && interactionModel.get('__interaction_metadata__');\n                    const currentCallState = interactionModel ? this._getCallState(interactionModel) : null;\n                    const participants = Ember.get(payload, 'participants');\n                    const isAgentCall = participants.any(party => party.purpose && party.purpose === 'agent');\n\n                    const participant = _.last(participants.filterBy('userId', this.get('personGuid')));\n                    const participantCall = this.getParticipantCall(participant);\n                    const participantOnCall = participantCall\n                        ? ['alerting', 'contacting', 'dialing', 'connected'].indexOf(\n                              participantCall.state.toLowerCase()\n                          ) > -1\n                        : false;\n                    const participantIsNotVoicemail = (participant.purpose || '').toLowerCase() !== 'voicemail';\n                    const isActiveOnCall = participantCall && participantOnCall && participantIsNotVoicemail;\n                    const newCallState = participantCall.state.toLowerCase();\n\n                    const onCall = interactionModel && interactionModel.get('onCall');\n                    const shouldUpdate = isAgentCall || isActiveOnCall || onCall || newCallState === 'terminated';\n\n                    if (newInteraction) {\n                        interactionModel = ConversationModel.create(payload, Ember.getOwner(this).ownerInjection());\n                        if (isAgentCall && Ember.get(interactionModel, 'callState.initialState') === 'connected') {\n                            // i.e. call was auto answered\n                            this.trigger('autoAnswer', Ember.get(interactionModel, 'id'));\n                        }\n                    }\n\n                    // Log a message for the webrtc timeline if the state changes\n                    if (!currentCallState || currentCallState !== newCallState) {\n                        this.logger.info('Received conversationUpdate with new call state', {\n                            remoteData: { conversationId: payload.id, participantState: newCallState }\n                        });\n                    }\n\n                    return {\n                        eventSource,\n                        payload,\n                        prevRaw,\n                        isAgentCall,\n                        isActiveOnCall,\n                        currentCallState,\n                        interactionModel,\n                        newCallState,\n                        newInteraction,\n                        participantIsNotVoicemail,\n                        shouldUpdate\n                    };\n                }\n            },\n            {\n                label: 'Answer Call',\n                process: ({ payload, currentCallState, newCallState, participantIsNotVoicemail }) => {\n                    if (\n                        currentCallState &&\n                        participantIsNotVoicemail &&\n                        currentCallState !== 'connected' &&\n                        newCallState === 'connected' &&\n                        !this.get('webrtcSdkService.useSdk')\n                    ) {\n                        this.get('headset').answerCall(payload.id, this.get('connectedConversations.length') >= 1);\n                    }\n                }\n            },\n            {\n                label: 'End Call',\n                process: ({ payload, currentCallState, newCallState }) => {\n                    if (!currentCallState) {\n                        return;\n                    }\n\n                    if (this.get('webrtcSdkService.useSdk')) {\n                        return;\n                    }\n\n                    if (currentCallState !== 'disconnected' && newCallState === 'disconnected') {\n                        this.get('headset').endCall(payload.id, this.get('connectedConversations.length') > 1);\n                    }\n                }\n            },\n            {\n                label: 'Listen for changes on External Contacts attached to customer participant',\n                process: async ({ prevRaw, payload, interactionModel }) => {\n                    const modelsToDestroy = [];\n                    const buildModel = rawData => {\n                        const conversationModel = ConversationModel.create(\n                            rawData,\n                            Ember.getOwner(this).ownerInjection()\n                        );\n                        Ember.set(conversationModel, 'type', 'call');\n                        modelsToDestroy.push(conversationModel);\n\n                        const interactionModel = Ember.Object.create({});\n                        return interactionModel;\n                    };\n                    const { id } = payload;\n                    const contactObserver = this.get(`_contactObservers.${id}`) || function () {};\n                    this.set(`_contactObservers.${id}`, contactObserver);\n                    const externalContacts = this.get('externalContacts');\n\n                    try {\n                        await externalContacts.addContactChangeListenersForInteraction(\n                            buildModel,\n                            payload,\n                            prevRaw,\n                            contactObserver\n                        );\n                    } catch (e) {\n                        this.logger.error('ACD: Failed to add external contact change listeners on phone interaction', {\n                            e,\n                            remoteData: {\n                                interactionId: id\n                            }\n                        });\n                        externalContacts.removeContactChangeListenersForInteraction(interactionModel, contactObserver);\n                        this.set(`_contactObservers.${id}`, undefined);\n                    }\n\n                    modelsToDestroy.forEach(m => m.destroy());\n                }\n            },\n            {\n                label: 'Update State Step',\n                process: ({\n                    payload,\n                    isAgentCall,\n                    currentCallState,\n                    interactionModel,\n                    newCallState,\n                    newInteraction,\n                    shouldUpdate\n                }) => {\n                    if (shouldUpdate) {\n                        if (!newInteraction) {\n                            interactionModel.setProperties(payload);\n                        }\n\n                        if (isAgentCall && currentCallState !== 'connected' && newCallState === 'alerting') {\n                            Ember.set(interactionModel, 'acceptedByClient', false);\n                        }\n                    }\n\n                    // the consultParticipantId needs to be retained even when the call is no longer\n                    // on consult because of use cases identified in SERVOPS-11175\n                    const consultParticipantId = _.last(\n                        interactionModel.participants.filterBy('purpose', 'customer').mapBy('consultParticipantId')\n                    );\n                    if (consultParticipantId) {\n                        Ember.set(interactionModel, 'consultParticipantId', consultParticipantId);\n                    }\n\n                    if (shouldUpdate) {\n                        if (newInteraction) this.get('conversations').pushObject(interactionModel);\n                        this.trigger(`conversations.${interactionModel.get('id')}`);\n                    }\n\n                    if (shouldUpdate || newCallState === 'terminated') {\n                        this.notifyPropertyChange('conversations');\n                        this.notifyPropertyChange('recentDisconnectedAgentCalls');\n                        this._logConversationDetails(interactionModel);\n                    }\n                }\n            },\n            {\n                label: 'Update Interaction Model - External Contact',\n                process: async ({ shouldUpdate, interactionModel, payload }) => {\n                    if (!shouldUpdate) {\n                        return;\n                    }\n\n                    // TechDebt:  For now, we'll maintain feature parity.  But, eventually, we should\n                    // not mix server and UI state\n                    try {\n                        await this.get('externalContacts').setExternalContactInfo(interactionModel, payload);\n                    } catch (e) {\n                        this.logger.error('ACD Phone: Failed to set External Contact Model data', {\n                            e,\n                            remoteData: {\n                                interactionId: interactionModel.get('id')\n                            }\n                        });\n                    }\n                }\n            },\n            {\n                label: 'Cleanup Step',\n                process: () => {\n                    // Ideally, we would definitively know when a conversation is inactive\n                    // and only clean up that instance.  However, isInteractionActive is not\n                    // supported on conversation models. Rather than build an interim\n                    // model, we'll just call the throttled cleanup method.\n                    this.get('_throttledRemoveDisconnectedConversations').perform();\n                }\n            }\n        ]);\n    },\n\n    _onMyConversationEvent(conversation) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) return;\n        if (!conversation || !conversation.id) return;\n        this.get('_processingChain').enqueueEvent(conversation.id, {\n            eventSource: 'realtime',\n            payload: conversation\n        });\n    },\n\n    _onPigeonConnect() {\n        if (this.get('isDestroyed') || this.get('isDestroying')) return;\n        this.fetchActiveCallConversations()\n            .then(conversations => {\n                conversations.forEach(conversation => {\n                    if (!conversation || !conversation.id) return;\n                    this.get('_processingChain').enqueueEvent(conversation.id, {\n                        eventSource: 'api',\n                        payload: conversation\n                    });\n                });\n            })\n            .catch(err => {\n                this.get('logger').error('ACD Phone Service: Failed to load active conversations', { err });\n            })\n            .finally(() => {\n                this.get('_throttledRemoveDisconnectedConversations').perform();\n            });\n    },\n\n    _getCallState(interaction) {\n        const participant = interaction.get('participants').findBy('userId', this.get('personGuid'));\n        if (!participant) {\n            Logger.error(\n                `Expected to find person {{personGuid}} on conversation {{conversationId}} but person was not found`,\n                { personGuid: this.get('personGuid'), conversationId: interaction.get('id') }\n            );\n            return;\n        }\n        const participantCall = this.getParticipantCall(participant);\n        return participantCall.state ? participantCall.state.toLowerCase() : null;\n    },\n\n    fetchActiveCallConversations() {\n        const url = this.pcUri(`api/${this.get('convAPIVersion')}/conversations`) + '?communicationType=Call';\n        return this.makeRequest(url, { type: 'get' }).then(response => response.entities);\n    },\n\n    // Returns conversation version to use\n    convAPIVersion: 'v2',\n\n    // presence and carrier pigeon stuff\n    presence: computed.reads('session.person.presence'),\n    onQueue: computed.equal('presence', 'on_queue'),\n    carrierPigeonConnected: computed.reads('pigeon.connected'),\n\n    // permissions\n    enabled: computed.reads('permissions.phoneEnabled'),\n    conferenceEnabled: computed.reads('permissions.conferenceEnabled'),\n    canRecord: computed.reads('permissions.canRecord'),\n    canCallForward: computed.reads('permissions.canCallForward'),\n\n    // user info\n    user: computed.reads('session.publicApiUser'),\n    personGuid: computed.reads('session.person.guid'),\n\n    // stations and phone permissions\n    phoneDisabled: computed('webrtc.canUseWebrtcSoftphone', 'station.isWebrtc', function () {\n        return this.get('station.isWebrtc') && !this.get('webrtc.canUseWebrtcSoftphone');\n    }),\n\n    phoneDisabledMessage: computed('phoneDisabled', 'webrtc.{hasMicrophone,audioCallCapable}', function () {\n        if (this.get('phoneDisabled') === false) {\n            return '';\n        }\n        const webrtc = this.get('webrtc');\n        const audioCallCapable = webrtc.get('audioCallCapable');\n        const hasMicrophone = webrtc.get('hasMicrophone');\n        let key = 'notification.purecloud.selectPhone.unsupportedPhone';\n        if (audioCallCapable && !hasMicrophone) {\n            key = 'notification.purecloud.selectPhone.noMicrophone';\n        }\n        return this.get('intl').lookup(key).toString();\n    }),\n    phoneAvailable: computed('noStationSelected', 'phoneDisabled', function () {\n        return !(this.get('noStationSelected') || this.get('phoneDisabled'));\n    }),\n    stationHasPersistentConnection: computed.and('station.persistentConnection', 'station.isWebrtc'),\n    persistentConnectionActive: computed(\n        'webrtc.conversations.@each._state',\n        'stationHasPersistentConnection',\n        'webrtcSdkService.{useSdk,isPersistentConnection,hasActiveSoftphoneSession}',\n        function () {\n            if (this.get('webrtcSdkService.useSdk')) {\n                return (\n                    this.get('webrtcSdkService.isPersistentConnection') &&\n                    this.get('webrtcSdkService.hasActiveSoftphoneSession')\n                );\n            }\n\n            if (!this.get('stationHasPersistentConnection')) {\n                return false;\n            }\n            const conversations = this.get('webrtc.conversations');\n            return conversations && !!conversations.findBy('conversationType', webrtcConversationTypes.SOFTPHONE);\n        }\n    ),\n\n    // Toggle to enable answering of calls from this browser session.\n    thisBrowserIsTheOneToAnswerFrom: false,\n    toggleBrowserAnswer() {\n        this.toggleProperty('thisBrowserIsTheOneToAnswerFrom');\n        this.get('preferences').setPreference(\n            'phone.thisBrowserIsTheOneToAnswerFrom',\n            this.get('thisBrowserIsTheOneToAnswerFrom')\n        );\n    },\n\n    // debounce timers and timeout values\n    timeOutToRemove: 8000,\n\n    lastConversationError: null,\n    callsWithErrors: [],\n\n    loaded: false,\n    loading: {\n        muted: false,\n        held: false\n    },\n\n    dtmf: true, // HACK: enable/disable calling pub api for sending dtmf\n\n    // utils\n    guidFromUri(uri) {\n        return uri.substring(uri.lastIndexOf('/') + 1);\n    },\n    generateConversationsUrl(callId, participantId, action, query) {\n        const origin = `api/v2/conversations/calls`;\n        let parts = [origin, callId, 'participants', participantId];\n        if (action) {\n            parts.push(action);\n        }\n        if (query) {\n            parts.push(query);\n        }\n        return this.pcUri(parts);\n    },\n    generateCommunicationUrl(conversationId, participantId, communicationId) {\n        return this.get('application').pcV2Uri(\n            `api/v2/conversations/calls/${conversationId}/participants/${participantId}/communications/${communicationId}`\n        );\n    },\n    generateConversationUrl(conversationId) {\n        return this.get('application').pcV2Uri(`api/v2/conversations/calls/${conversationId}`);\n    },\n    _findPendingSessionsByConversationId(id) {\n        if (this.get('webrtcSdkService.useSdk')) {\n            return this.get('webrtcSdkService.pendingSessions').findBy('conversationId', id);\n        } else {\n            return this.get('webrtc.pendingSessions').findBy('callInfo.conversationId', id);\n        }\n    },\n    _logConversationDetails(conversation) {\n        if (conversation != null) {\n            let logObject = {};\n            Ember.get(conversation, 'participants').forEach(party => {\n                const communication = this.getParticipantCall(party) || Ember.get(party, 'callbacks.firstObject');\n                if (communication) {\n                    const { id, userId, name, address, purpose } = party;\n                    const { state, confined, muted, held } = communication;\n                    return (logObject[id] = { userId, name, address, state, confined, muted, held, purpose });\n                }\n            });\n            if (console.table) {\n                return console.table(logObject);\n            }\n            return console.log(logObject);\n        }\n    },\n    isDisconnected(conversation) {\n        if (!conversation) {\n            return false;\n        }\n        const callState = Ember.get(conversation, 'callState');\n        if (!callState) {\n            return false;\n        }\n        return callState.state ? ['disconnected', 'terminated'].indexOf(callState.state.toLowerCase()) > -1 : false;\n    },\n    // helper to get participant.calls[0] and return false if any of it is undefined\n    getParticipantCall(participant) {\n        if (!participant) {\n            return false;\n        }\n        if (participant.calls) {\n            if (participant.calls.length) {\n                return participant.calls[0];\n            }\n        }\n        return false;\n    },\n\n    updateVolumes(deviceVolumes) {\n        this.set('callVolume', deviceVolumes.callVolume);\n        this.set('ringerVolume', deviceVolumes.ringerVolume);\n    },\n    // end utils\n\n    // UI state helpers\n    isInteractionViewOpen: false,\n    isShowCallControlsViewOpen: false,\n    showFloatingCalls: false,\n\n    showNavbarAlert: computed(\n        'activeAcdCalls.[]',\n        'activeCall',\n        'incomingNonAcdConversations.[]',\n        'isShowCallControlsViewOpen',\n        'isInteractionViewOpen',\n        function () {\n            const activeAcdCallState = this.get('activeAcdCalls.firstObject.callState.state');\n            const state = typeof activeAcdCallState === 'string' ? activeAcdCallState.toLowerCase() : null;\n            if (\n                this.get('isShowCallControlsViewOpen') ||\n                (this.get('isInteractionViewOpen') && state === 'connected')\n            ) {\n                return false;\n            }\n\n            const hasIncomingNonAcdCalls = this.get('incomingNonAcdConversations.length') > 0;\n            const alertingCall =\n                !this.get('activeCall.isIncoming') && hasIncomingNonAcdCalls\n                    ? this.get('incomingNonAcdConversations.firstObject')\n                    : this.get('activeCall');\n\n            const isAlertingCallACD =\n                alertingCall &&\n                Ember.get(alertingCall, 'isAgentCall') &&\n                !Ember.get(alertingCall, 'myselfIsMonitor') &&\n                !Ember.get(alertingCall, 'myselfIsCoach') &&\n                !Ember.get(alertingCall, 'myselfIsBarged')\n                    ? true\n                    : false;\n            return !isAlertingCallACD && hasIncomingNonAcdCalls;\n        }\n    ),\n    // end UI state helpers\n\n    activeRoom: null,\n\n    bootstrapPurecloudApiOnAuth: observer('session.isAuthenticated', 'enabled', 'canCallForward', function () {\n        if (!this.get('enabled')) {\n            return;\n        }\n        if (this.get('session.isAuthenticated')) {\n            if (this.get('canCallForward')) {\n                this.fetchCallForwarding();\n            }\n            if (!isTesting && !this.get('loaded')) {\n                this.set('loaded', true);\n                this.doLoginAssociationLogic();\n                return this.get('delayedNotification').perform();\n            }\n        } else {\n            this.set('loaded', false);\n        }\n    }),\n\n    delayedNotification: task(function* (delay = 5000) {\n        yield timeout(delay);\n\n        if (this.get('station.isWebrtc') && !this.get('webrtc.canUseWebrtcSoftphone')) {\n            const message = this.get('phoneDisabledMessage');\n            const title = this.get('intl').t('notification.purecloud.selectPhone.selectPhone');\n            return this.get('notification').error(title, message);\n        }\n    }),\n\n    refreshPublicApiUser() {\n        return this.get('session').refreshPublicApiUser();\n    },\n\n    handleMuteParticipants: observer('activeConversations.@each.isMuted', function () {\n        this.get('activeConversations').forEach(conversation => {\n            if (conversation.get('webrtcSession')) {\n                let webrtcConversation = this.get('webrtc').getConversation({\n                    conversationId: conversation.get('id'),\n                    conversationType: webrtcConversationTypes.SOFTPHONE\n                });\n                if (webrtcConversation) {\n                    if (conversation.get('isMuted')) {\n                        webrtcConversation.muteAudio();\n                    } else {\n                        webrtcConversation.unmuteAudio();\n                    }\n                }\n            }\n        });\n    }),\n\n    getNotificationOutputDeviceId() {\n        return this.get('webrtc.notificationOutputDeviceId');\n    },\n\n    transferToVoicemail(selectedUserUserId, participantId, conversationId) {\n        const voicemailPolicy = this.get('application').pcV2Uri('api/v2/voicemail/userpolicies/' + selectedUserUserId);\n        return this.makeRequest(voicemailPolicy)\n            .then(policy => {\n                if (!policy.enabled) {\n                    throw new Error('voicemail not enabled');\n                }\n                const data = {};\n                const vmAdressString = selectedUserUserId + VOICEMAIL_URL;\n                data.address = vmAdressString;\n                data.transferType = 'Unattended';\n                const options = { data };\n                const url = this.replaceUri(conversationId, participantId, null, 'calls');\n                return this.makeRequest(url, options, 'post').then(() => {\n                    this._handleCallTransferred();\n                });\n            })\n            .catch(error => {\n                const title = this.get('intl').t('purecloud.acdInteraction.voicemail.errors.error');\n                const message = this.get('intl').t('purecloud.acdInteraction.voicemail.errors.transferToVoicemail');\n                this.get('notification').error(title, message);\n                this.get('logger').error('Error while tranferring to voicemail', { error });\n            });\n    }\n});\n","import Ember from 'ember';\nimport { A } from '@ember/array';\nimport { assert } from '@ember/debug';\nimport { get, observer } from '@ember/object';\nimport { copy } from 'ember-copy';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { Service, Evented, inject, run, computed } = Ember;\n\nconst topicPriority = {\n    presence: 1,\n    routingStatus: 2,\n    conversationsummary: 3,\n    other: 4,\n    outofoffice: 5,\n    geolocation: 6\n};\n\nexport function eventFromTopic(topic) {\n    if (topic.indexOf('v2.system.no_longer_subscribed') > -1) {\n        return 'no_longer_subscribed';\n    }\n    return [].concat(topic.split('.')).pop();\n}\n\nexport default Service.extend(Evented, LoggerMixin, {\n    connected: false,\n    topics: A(),\n    priorityTopics: A(),\n    customTopicNames: {},\n    registerTopicsDebouncePeriod: 1000,\n    embedded: inject.service(),\n\n    prioritizedTopics: computed('topics.length', function () {\n        const sortedTopics = this.get('topics').slice(0);\n\n        const sortFunction = (topicA, topicB) => {\n            return this.getTopicPriority(topicA) - this.getTopicPriority(topicB);\n        };\n\n        sortedTopics.sort(sortFunction);\n\n        return sortedTopics;\n    }),\n\n    getTopicPriority(topic) {\n        const priorities = topicPriority;\n        return priorities[topic.split('.').pop()] || priorities.other;\n    },\n\n    // eslint-disable-next-line no-unused-vars\n    initialize({ features, subscribeUrl, publicApiUser, accessToken }) {\n        if (this.get('initialized')) {\n            return;\n        }\n\n        if (publicApiUser) {\n            this.logger.info('CXNUI-CP: Initializing', {\n                userId: get(publicApiUser, 'id'),\n                features\n            });\n        } else {\n            this.logger.warn('CXNUI-CP: pigeon service not provided with api user');\n        }\n\n        this.set('initialized', true);\n    },\n\n    registerPriorityTopic(topic, customName) {\n        assert('topic parameter cannot be null when registering a priority topic for subscription.', topic !== null);\n        this.get('priorityTopics').addObject(topic);\n\n        if (customName) {\n            this.get('customTopicNames')[topic] = customName;\n        }\n    },\n\n    unRegisterPriorityTopic(topic) {\n        this.get('priorityTopics').removeObject(topic);\n        const customNames = this.get('customTopicNames');\n        delete customNames[topic];\n    },\n\n    registerTopic(topic, customName) {\n        assert('topic parameter cannot be null when registering a topic for subscription.', topic !== null);\n        this.get('topics').unshiftObject(topic);\n        if (customName) {\n            this.get('customTopicNames')[topic] = customName;\n        }\n    },\n\n    unRegisterTopic(topic) {\n        this.get('topics').removeObject(topic);\n        const customNames = this.get('customTopicNames');\n        delete customNames[topic];\n    },\n\n    _observeTopics: observer('priorityTopics.[]', 'topics.[]', 'connected', 'initialized', function () {\n        if (this.get('connected') && this.get('initialized')) {\n            this.set(\n                'registerDebounce',\n                run.debounce(this, this._registerTopics, this.get('registerTopicsDebouncePeriod'))\n            );\n        }\n    }),\n\n    willDestroy() {\n        this._super(...arguments);\n        run.cancel(this.get('topicKeepAlive'));\n        run.cancel(this.get('registerDebounce'));\n    },\n\n    _registerTopics() {\n        run.cancel(this.get('topicKeepAlive'));\n        const topicKeepAlive = run.later(\n            this,\n            function () {\n                this.logger.info('CXNUI-CP: _register: topicKeepAlive triggered');\n                this._registerTopics();\n            },\n            23 * 60 * 60 * 1000 // 23h\n        );\n        this.set('topicKeepAlive', topicKeepAlive);\n\n        const prioritizedTopics = this.get('prioritizedTopics');\n        const priorityTopics = this.get('priorityTopics');\n        const topics = [...priorityTopics, ...prioritizedTopics];\n\n        if (!this.get('connected')) {\n            this.set('connected', true);\n            this.trigger('connect');\n        }\n\n        topics.forEach(topic => this.get('embedded').streamingTopicSubscribe(topic));\n        this.trigger('topicsRegistered', topics);\n    },\n\n    triggerTopicEvent(topic, eventName, eventBody, data, source) {\n        this.logger.debug('CXNUI-CP: topic triggered', {\n            source,\n            carrierPigeonTopic: eventName,\n            update: eventBody\n        });\n        this.trigger(eventName, copy(eventBody), copy(data));\n    },\n\n    onMessage(source, data) {\n        if (!data) {\n            return;\n        }\n\n        const topic = data.topicName;\n        const eventBody = data.eventBody;\n        const eventName = this.get('customTopicNames')[topic] || eventFromTopic(topic);\n\n        if (topic !== 'channel.metadata') {\n            this.triggerTopicEvent(topic, eventName, eventBody, data, source);\n        }\n\n        if (topic !== eventName) {\n            this.triggerTopicEvent(topic, topic, eventBody, data, source);\n        }\n    },\n\n    onSubscriptionError(error) {\n        this.trigger('hawkSubscriptionError', error);\n    }\n});\n","import Ember from 'ember';\nimport localforage from 'localforage';\nimport _ from 'lodash';\n\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport safeSet from 'connections-ui/utils/safeSet';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport timeoutPromise from '../utils/timeout-promise';\n\nconst { on, get, set, run, inject, computed, RSVP, Service } = Ember;\n\nconst PREFERENCE_LOAD_TIME_ALLOWANCE = 5000;\n\nexport default Service.extend(LoggerMixin, {\n    logger: inject.service('stash-logger'),\n    session: inject.service(),\n    feature: inject.service(),\n    ajax: inject.service(),\n    application: inject.service(),\n\n    namespaces: [\n        'chat',\n        'geolocation',\n        'notifications',\n        'webrtc',\n        'test',\n        'widgets',\n        'meta',\n        'meetings',\n        'phone',\n        'scripts',\n        'deviceVolumes',\n        'panelManager',\n        'panelManagerLayoutTemplateV1',\n        'agentUiMainstage',\n        'interactions',\n        'relateSparkification'\n    ],\n\n    error: false,\n\n    syncEnabled: false,\n\n    deferredPersistRequests: null,\n    settingsPath: 'api/v2/settings',\n\n    registerNamespaces: on('init', function () {\n        localforage.config({\n            name: 'orgspan',\n            version: 1.0,\n            storeName: 'preferences',\n            description: 'Storing local preferences for the web client'\n        });\n\n        //need to wrap in a run since there is a lot of non-ember asynchonicity in this code path\n        const promises = this.get('namespaces').map(namespace => {\n            return localforage.getItem(namespace).then(data => {\n                run(() => this._initializeNamespace(namespace, data));\n            });\n        });\n\n        const ready = timeoutPromise(\n            RSVP.all(promises),\n            PREFERENCE_LOAD_TIME_ALLOWANCE,\n            'preferences#registerNamespaces'\n        )\n            .then(() => this._waitForAccessToken())\n            .then(() => this._enableService())\n            .catch(error => {\n                this._disableService(error);\n            });\n\n        this.set('ready', ready);\n        this.set('deferredPersistRequests', []);\n\n        // used to resolve races in setPreference('namespace.property');\n        this.set('pendingSets', Ember.Object.create());\n    }),\n\n    getPreference(path) {\n        const ready = this.get('ready');\n        return ready.then(() => {\n            return this._getPreference(path);\n        });\n    },\n\n    setPreference(path, value, persist = true) {\n        const ready = this.get('ready');\n        return ready.then(() => this._setPreference(path, value, persist));\n    },\n\n    _getPreference(path) {\n        const namespaceDelimiter = path.indexOf('.');\n\n        if (namespaceDelimiter === -1) {\n            return localforage.getItem(path);\n        }\n\n        const namespace = path.slice(0, namespaceDelimiter);\n        const keyPath = path.slice(namespaceDelimiter + 1);\n\n        // to avoid race condition with localforage, wait for previous local save to finish.\n        const previousSet = this.get(`pendingSets.${namespace}`) || RSVP.resolve();\n        return previousSet\n            .then(() => {\n                return localforage.getItem(namespace);\n            })\n            .then(settings => {\n                if (!settings) {\n                    return;\n                }\n                let setting = get(settings, keyPath);\n                return setting;\n            })\n            .catch(err => {\n                if (!isTesting) throw err;\n                // swallow the error in tests\n                return RSVP.Promise.resolve();\n            });\n    },\n\n    _setPreference(path, value) {\n        if (this.isDestroyed) {\n            return RSVP.resolve({});\n        }\n\n        const namespaceDelimiter = path.indexOf('.');\n\n        if (namespaceDelimiter === -1) {\n            if (value && !Array.isArray(value) && typeof value === 'object') {\n                this.set(path, Ember.Object.create(value));\n            } else {\n                this.set(path, value);\n            }\n\n            return localforage.setItem(path, value);\n        }\n\n        const namespace = path.slice(0, namespaceDelimiter);\n        const keyPath = path.slice(namespaceDelimiter + 1);\n\n        let currentNamespaceObject = this.get(namespace);\n        if (!currentNamespaceObject) {\n            this.set(namespace, Ember.Object.create());\n            currentNamespaceObject = this.get(namespace);\n        }\n\n        // to avoid race condition with localforage, wait for previous local save to finish.\n        const previousSet = this.get(`pendingSets.${namespace}`) || RSVP.resolve();\n        const pendingSet = previousSet\n            .then(() => {\n                return this._getPreference(namespace);\n            })\n            .then(setting => {\n                let data = setting || {};\n                set(data, keyPath, value);\n\n                return localforage.setItem(namespace, data);\n            })\n            .finally(() => {\n                this.set(`pendingSets.${namespace}`, null);\n            });\n        this.set(`pendingSets.${namespace}`, pendingSet);\n\n        // after localforage\n        return pendingSet\n            .then(() => {\n                // get the namespace again in case there were multiple sets on the namespace\n                return this._getPreference(namespace);\n            })\n            .then(setting => {\n                let data = setting || {};\n                safeSet(data, keyPath, value);\n                currentNamespaceObject.set(keyPath, value);\n                return setting;\n            })\n            .catch(error => {\n                if (isTesting) return RSVP.resolve();\n                this.logger.warn('Error saving preferences', { path, error });\n                return RSVP.reject(error);\n            });\n    },\n\n    async _waitForAccessToken() {\n        if (this.get('session.accessToken') || isTesting) {\n            return RSVP.Promise.resolve();\n        }\n\n        return new RSVP.Promise(resolve => {\n            this.logger.info('Preferences: waiting for access token');\n\n            const handler = () => {\n                if (this.get('session.accessToken')) {\n                    this.removeObserver('session.accessToken', this, handler);\n                    resolve();\n                }\n            };\n\n            this.addObserver('session.accessToken', this, handler);\n        });\n    },\n\n    _enableService() {\n        let enableServicePromise = RSVP.resolve();\n\n        if (this._isNotDead() && this.get('session.accessToken')) {\n            this.logger.info('Enabling preference API sync');\n            return this._enableSync()\n                .then(() => {\n                    this.logger.info('Initial preferences loaded successfully');\n                })\n                .catch(error => {\n                    this.logger.info('There was an issue enabling sync:', error);\n                    this.set('profileSyncSupport', false);\n                });\n        }\n\n        return enableServicePromise;\n    },\n\n    _disableService(error) {\n        if (this._isNotDead()) {\n            this.logger.error('Error loading preferences', { error });\n            this.set('error', true);\n        }\n    },\n\n    _initializeNamespace(namespace, data) {\n        if (this._isNotDead()) {\n            if (!data) {\n                data = {};\n                localforage.setItem(namespace, data);\n            }\n            this.set(namespace, Ember.Object.create(data));\n        }\n    },\n\n    _isNotDead() {\n        return !this.get('isDestroyed') && !this.get('isDestroying');\n    },\n\n    _enableSync() {\n        const logger = this.get('logger');\n        const settingsPath = this.get('settingsPath');\n        const settingsUrl = this.get('application').pcV2Uri(settingsPath);\n        const ajax = this.get('ajax');\n\n        if (this.get('syncEnabled')) {\n            return RSVP.reject('Preference sync can only be enabled once.');\n        }\n\n        this.set('syncEnabled', true);\n        return ajax\n            .ajaxGet(settingsUrl)\n            .then(preferencesToSync => this._saveSettingsFromServer(preferencesToSync))\n            .then(() => {\n                logger.info('Loaded preferences from server');\n                return RSVP.resolve();\n            })\n            .catch(err => {\n                logger.error('Error getting preferences from server', { err });\n                return RSVP.reject(err);\n            });\n    },\n\n    _saveSettingsFromServer(settings) {\n        const promises = [];\n\n        _.forIn(settings, (data, namespace) => {\n            if (this.namespaces.includes(namespace)) {\n                promises.push(this._setPreference(namespace, data, false));\n            }\n        });\n\n        return RSVP.all(promises).then(() => {\n            return Ember.RSVP.resolve();\n        });\n    },\n\n    profileSyncSupport: computed('session.person.fieldConfig.preferences.preferences', function () {\n        const field = this.get('session.person.fieldConfig.preferences.preferences');\n        return !_.isEmpty(field);\n    }),\n\n    userPreferences: computed('session.person.preferences.preferences.[]', function () {\n        let entry = this.get('session.person').getFieldValue('preferences.preferences');\n        if (entry && typeof entry.value === 'string') {\n            return JSON.parse(entry.value);\n        } else if (entry && entry.value && typeof entry.value === 'object') {\n            return entry.value;\n        }\n        return {};\n    }),\n\n    allLocalPreferences: computed('namespaces.[]', function () {\n        return this.getProperties(this.get('namespaces'));\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport StreamingService from 'ember-purecloud-components/services/streaming';\nimport moment from '../utils/dates';\nimport { FL } from '../utils/entity-fields';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport { isConflictError } from 'ember-ajax/errors';\nimport { isPurecloudSource } from 'connections-ui/utils/presence-utils';\nimport { isPresence } from 'connections-ui/mixins/entity-presence';\n\nconst { inject, observer, run, Service } = Ember;\n\nexport default Service.extend(LoggerMixin, {\n    eventMap: {\n        presence: 'primaryPresenceEvent',\n        outofoffice: 'outOfOfficeEvent',\n        conversationsummary: 'conversationSummaryEvent',\n        routingStatus: 'routingStatusEvent',\n        geolocation: 'geolocationEvent'\n    },\n\n    trackedGuids: null,\n\n    intl: inject.service(),\n    ajax: inject.service(),\n    store: inject.service(),\n    pigeon: inject.service(),\n    session: inject.service(),\n    streaming: inject.service(),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n    batchDataRequests: inject.service(),\n    presenceService: inject.service('presence'),\n    permissions: inject.service(),\n\n    phoneIntegrations: inject.service(),\n\n    init() {\n        this._super(...arguments);\n\n        if (this.get('permissions.canViewIntegrationPresence')) {\n            this.eventMap.integrationpresence = 'integrationpresence';\n            delete this.eventMap.presence;\n            this.set('eventMap', this.eventMap);\n        }\n\n        _.forIn(this.eventMap, (value, key) => this.get('pigeon').on(key, this, this.events[value]));\n\n        this.set('trackedGuids', Ember.Object.create());\n        this.subscribeToMyself();\n        this.get('streaming').subscribeToConnection(this);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        _.forIn(this.eventMap, (value, key) => this.get('pigeon').off(key, this, this.events[value]));\n    },\n\n    _getPresenceDefinition(presence) {\n        if (typeof presence === 'string') {\n            return this.get('session').getPresence(presence);\n        } else {\n            return this.get('presenceService').getPresenceDefinition(presence);\n        }\n    },\n\n    isPresence(presence, testValue) {\n        const definition = this._getPresenceDefinition(presence);\n        return isPresence(this.get('session.presenceMap'), definition, testValue);\n    },\n\n    subscribeToMyself() {\n        const guid = this.get('session.person.guid');\n        const id = this.get('session.person.id');\n\n        if (guid && id) {\n            const pigeon = this.get('pigeon');\n            this.logger.debug('subscribing to myself');\n\n            this.set(`trackedGuids.${guid}`, true);\n            this._getTopicsForUser(guid).forEach(topic => pigeon.registerPriorityTopic(topic));\n        }\n    },\n\n    _getTopicsForUser(guid) {\n        if (!guid) {\n            return [];\n        }\n\n        return [`v2.users.${guid}?${Object.keys(this.eventMap).join('&')}`];\n    },\n\n    _guidFromTopicName(topic) {\n        const guidPattern = /([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/gi;\n        const guids = topic.match(guidPattern);\n\n        if (guids && guids.length > 0) {\n            return guids[0];\n        }\n        return '';\n    },\n\n    connect: StreamingService.streamingEvent(function () {\n        run.debounce(this, this.refreshPeopleActivityState, 1000);\n    }),\n\n    refreshPeopleActivityState() {\n        const personId = this.get('session.person.guid');\n        const ids = Object.keys(this.get('trackedGuids'));\n\n        if (personId) {\n            ids.push(personId);\n        }\n\n        if (!_.isEmpty(ids)) {\n            this.logger.debug('PRESENCE-SUBSCRIPTION: Reloading activity state for people: ', ids.length);\n            this.get('store').findMany('person', ids, FL.person);\n        }\n    },\n\n    watchAuthForSubscribe: observer('session.isAuthenticated', 'session.person.guid', function () {\n        this.subscribeToMyself();\n    }),\n\n    subscribeToPresence(person) {\n        const pigeon = this.get('pigeon');\n\n        const id = person.get('id');\n        const guid = person.get('guid');\n        const jid = person.get('jid');\n\n        this.set(`trackedGuids.${guid}`, true);\n        let callback = function () {};\n\n        if (this.get('streaming.connection') && jid && jid !== this.get('session.person.jid')) {\n            if (0 === person.get('presenceSubscriptionCounter')) {\n                this._getTopicsForUser(guid).forEach(topic => pigeon.registerTopic(topic));\n                Ember.run.once(this, this.refreshUser, id);\n            }\n\n            person.incrementProperty('presenceSubscriptionCounter');\n\n            callback = () => {\n                if (0 < person.get('presenceSubscriptionCounter')) {\n                    person.decrementProperty('presenceSubscriptionCounter');\n                }\n\n                if (0 === person.get('presenceSubscriptionCounter')) {\n                    this._getTopicsForUser(guid).forEach(topic => pigeon.unRegisterTopic(topic));\n                    this.set(`trackedGuids.${guid}`, undefined);\n                }\n            };\n        }\n\n        return callback;\n    },\n\n    refreshUser(id) {\n        this.get('batchDataRequests').refreshUser(id);\n    },\n\n    bulkSubscribeToPresence(people) {\n        let callbacks = people.map(p => this.subscribeToPresence(p));\n        return () => {\n            callbacks.forEach(cb => cb());\n        };\n    },\n\n    autoSubscribe(people, context, type = '') {\n        let callbackKey = `${type}PresenceSubscriptionCallback`;\n        let previousCallback = context.get(callbackKey);\n        let newCallback = null;\n\n        if (people) {\n            newCallback = this.bulkSubscribeToPresence(people);\n        }\n\n        if (typeof previousCallback === 'function') {\n            previousCallback();\n        }\n\n        try {\n            context.set(callbackKey, newCallback);\n        } catch (e) {\n            // sometimes we are trying to clear out subscription callbacks after an object was destroyed by ember\n            // we dont want to run the function, but we can't use `set`, so clear it out forcefully\n            if (!newCallback) {\n                context[callbackKey] = newCallback;\n            }\n        }\n    },\n\n    changePresence(presence) {\n        let promise = Ember.RSVP.resolve();\n        const session = this.get('session');\n        const isOutOfOffice = session.get('person.isOutOfOffice');\n        const currentPresence = session.get('person.primaryPresence.presenceDefinition');\n\n        if (isOutOfOffice) {\n            promise = this.toggleOutOfOffice();\n        }\n\n        presence = this._getPresenceDefinition(presence);\n\n        session.set('person.primaryPresence.presenceDefinition', presence);\n\n        return promise.then(() => {\n            if (presence && presence.id) {\n                return this.get('presenceService')\n                    .setUsersPresence(session.get('person'), presence)\n                    .catch(err => {\n                        this.logger.error('PRESENCE-SUBSCRIPTION: Failed to set presence with public api', {\n                            error: err\n                        });\n                        session.set('person.primaryPresence.presenceDefinition', currentPresence);\n\n                        if (isConflictError(err)) {\n                            this._alertDeletedPresence(presence);\n                        }\n                    });\n            }\n        });\n    },\n\n    _alertDeletedPresence(presence) {\n        const intl = this.get('intl');\n        const title = intl.t('chat.presence.errorSettingDeletedPresence.title');\n        const message = intl.t('chat.presence.errorSettingDeletedPresence.message');\n        this.get('notification').error(title, message);\n\n        this.get('presenceService').removeDeletedPresence(presence);\n    },\n\n    changeRoutingStatus(status) {\n        const id = this.get('session.person.guid');\n        const url = this.get('application').pcV2Uri(`api/v2/users/${id}/routingStatus`);\n        const data = {\n            userId: id,\n            status: status,\n            startTime: new Date(moment.now()).toISOString()\n        };\n\n        this.get('ajax')\n            .put(url, { data })\n            .catch(error => {\n                this.logger.error('PRESENCE-SUBSCRIPTION: Error when changing routing status', {\n                    error\n                });\n            });\n    },\n\n    toggleOutOfOffice() {\n        return this.setOutOfOffice(null, null, !this.get('session.person.isOutOfOffice'));\n    },\n\n    doUserPresenceStatusChanged(person, statusUpdate) {\n        const { source } = statusUpdate;\n        const phoneIntegrations = this.get('phoneIntegrations');\n\n        const isSourceOnUsableList = phoneIntegrations.canViewThirdPartyPresence(source);\n        if (isSourceOnUsableList) {\n            // set the integration presence value\n            // using Ember.set as person is an object by this point\n            Ember.set(person, 'activities.integrationPresence', statusUpdate);\n        } else {\n            let existingPresenceIndex = null;\n            let existingPresenceObj = null;\n            if (person.get('presenceList')) {\n                existingPresenceObj = person.get('presenceList').find(function (presence, index) {\n                    if (presence.source.toLowerCase() === source.toLowerCase()) {\n                        existingPresenceIndex = index;\n                        return true;\n                    }\n                });\n            }\n\n            if (existingPresenceObj && existingPresenceIndex > -1) {\n                const presenceListStored = person.get('presenceList');\n                presenceListStored[existingPresenceIndex] = Ember.Object.create(statusUpdate);\n                person.notifyPropertyChange('presenceList');\n            } else {\n                person.get('presenceList').pushObject(Ember.Object.create(statusUpdate));\n            }\n        }\n    },\n\n    doUserPrimaryPresenceSourceChanged(person, statusUpdate) {\n        let newSource = statusUpdate.source;\n        const phoneIntegrations = this.get('phoneIntegrations');\n        const isThirdPartySource = !!phoneIntegrations.getIntegrationFromSource(newSource);\n        if (!isThirdPartySource) {\n            // convert PURECLOUD -> default\n            if (isPurecloudSource(newSource)) {\n                newSource = 'default';\n            }\n            person.set('currentPresenceSource', newSource);\n        }\n    },\n\n    handleIntegrationPresenceEvent(presenceEvent) {\n        Ember.run.join(() => {\n            this.get('batchDataRequests')\n                .getUser(presenceEvent.userId)\n                .then(person => {\n                    const { eventType } = presenceEvent;\n                    if (eventType === 'UserPresenceStatusChanged') {\n                        this.doUserPresenceStatusChanged(person, presenceEvent);\n                    } else if (eventType === 'UserPrimaryPresenceSourceChanged') {\n                        this.doUserPrimaryPresenceSourceChanged(person, presenceEvent);\n                    }\n                });\n        });\n    },\n\n    setOutOfOffice(startDate, endDate, newOutOfOffice = false) {\n        const url = this.get('application').pcV2Uri(`api/v2/users/${this.get('session.person.guid')}/outofoffice`);\n        const isOutOfOffice = this.get('session.person.isOutOfOffice');\n\n        // SHIA-927: Client workaround until CORE-4132 is done; this lets the streaming service know the user is available xmpp presence while ooto.\n        if (newOutOfOffice) {\n            const availablePresence = this.get('session').getPresence('available');\n            this.get('session.person').set('activities.outOfOffice.active', true);\n            this.get('session.user').set('outOfOffice.active', true);\n            this.get('presenceService')\n                .setUsersPresence(this.get('session.person'), availablePresence)\n                .catch(err => {\n                    this.logger.error(\n                        'PRESENCE-SUBSCRIPTION: Failed to set presence to available during out of office',\n                        { err }\n                    );\n                });\n        }\n\n        const payload = { startDate: startDate, endDate: endDate };\n\n        const request = Ember.$.ajax({\n            url,\n            type: 'put',\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'json',\n            data: JSON.stringify(payload),\n            cache: false\n        });\n\n        const promise = Ember.RSVP.cast(request);\n        promise\n            .then(data => {\n                this.get('session.person').set('activities.outOfOffice', data);\n                this.get('session.user').set('outOfOffice', data);\n            })\n            .catch(error => {\n                this.logger.error('PRESENCE-SUBSCRIPTION: Failed to toggle out of office to: ', {\n                    newOutOfOffice,\n                    error\n                });\n\n                this.get('session.person').set('activities.outOfOffice.active', isOutOfOffice);\n                this.get('session.user').set('outOfOffice.active', isOutOfOffice);\n            });\n        return promise;\n    },\n\n    startOfTime: () => '1970-01-01T12:00:00.000Z',\n    endOfTime: () => '9999-12-31T00:00:00.000Z',\n    rightAboutMeow: () => moment().subtract(1, 'year').toISOString(),\n    handleRoutingStatusError(errorCode) {\n        if (typeof errorCode === 'string' && errorCode.toLowerCase() === 'user.noskills') {\n            const intl = this.get('intl');\n            const title = intl.t('notification.purecloud.errorSkillsRouting.title');\n            const message = intl.t('notification.purecloud.errorSkillsRouting.message');\n            this.get('notification').error(title, message);\n        }\n    },\n\n    events: {\n        conversationSummaryEvent(conversationSummary, { topicName }) {\n            const guid = this._guidFromTopicName(topicName);\n            Ember.run.join(() => {\n                this.get('batchDataRequests')\n                    .getUser(guid)\n                    .then(person => {\n                        person.set('activities.conversationSummary', conversationSummary);\n                    });\n            });\n        },\n\n        outOfOfficeEvent(outOfOfficeDef, { topicName }) {\n            const guid = this._guidFromTopicName(topicName);\n            Ember.run.join(() => {\n                this.get('batchDataRequests')\n                    .getUser(guid)\n                    .then(person => person.set('activities.outOfOffice', outOfOfficeDef));\n            });\n        },\n\n        routingStatusEvent({ errorInfo, id, routingStatus }) {\n            if (errorInfo && errorInfo.errorCode) {\n                this.handleRoutingStatusError(errorInfo.errorCode);\n            }\n\n            Ember.run.join(() => {\n                this.get('batchDataRequests')\n                    .getUser(id)\n                    .then(person => person.set('activities.routingStatus', routingStatus));\n            });\n        },\n\n        integrationpresence(event) {\n            if (this.get('permissions.canViewIntegrationPresence')) {\n                this.handleIntegrationPresenceEvent(event);\n            }\n        },\n\n        primaryPresenceEvent(primaryPresence, { topicName }) {\n            const guid = this._guidFromTopicName(topicName);\n            Ember.run.join(() => {\n                this.get('batchDataRequests')\n                    .getUser(guid)\n                    .then(person => {\n                        person.set('activities.presence', primaryPresence);\n                    });\n            });\n        },\n\n        geolocationEvent(geolocation, { topicName }) {\n            this.logger.debug('PRESENCE-SUBSCRIPTION: geolocationEvent', arguments);\n            const guid = this._guidFromTopicName(topicName);\n            if (geolocation && (geolocation.city || geolocation.region || geolocation.country)) {\n                this.logger.debug(\n                    'PRESENCE-SUBSCRIPTION: gelocationEvent user/self',\n                    guid,\n                    this.get('session.person.guid')\n                );\n                if (guid && guid === this.get('session.person.guid')) {\n                    this.logger.debug('PRESENCE-SUBSCRIPTION: adding geolocation to self');\n                    this.set('session.person.activities.geolocation', geolocation);\n                }\n                Ember.run.join(() => {\n                    this.get('batchDataRequests')\n                        .getUser(guid)\n                        .then(person => {\n                            person.set('activities.geolocation', geolocation);\n                        });\n                });\n            }\n        }\n    }\n});\n","define(\"connections-ui/services/presence\", [\"exports\", \"ember-purecloud-components/services/presence\"], function (_exports, _presence) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _presence.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { isSameSiteNoneCompatible } from 'should-send-same-site-none';\nimport moment from '../utils/dates';\n\nconst LOGOUT_BOUNCE_COOKIE_NAME = 'lastLogoutTimestamp';\nconst LOGOUT_BOUNCE_COOKIE_DURATION_MILLIS = 5000;\nconst LOGOUT_BOUNCE_THREASHOLD_MILLIS = 5000;\n\nconst { inject, typeOf, Logger, Service } = Ember;\n\n/**\n *  Service containing utility methods and metadata used in the PureCloud OAuth flows\n *\n *  service:purecloud-oauth - utilities and state for the oauth flow\n *  authenticator:directory - Handles direct interface with the auth endpoints\n *  service:session - holds state for the current user authentication/authorization context\n *  authorizer:directory - Handles future request authorization\n */\nexport default Service.extend({\n    cookies: inject.service(),\n    session: inject.service(),\n\n    _restoreState: null,\n\n    // Flag to indicate if we're in the logout/login bounce used to re-prime the oauth flow to Collaborate upon logout\n    inLogoutBounce: false,\n\n    init() {\n        this._super(...arguments);\n        if (this._isInLogoutBounce()) {\n            this.set('inLogoutBounce', true);\n            this._clearLogoutTime();\n        }\n    },\n\n    /**\n     * Generates a string value that can be passed via the state parameter\n     * to restore the current state post authentication\n     */\n    serializeRestoreState(baseLocation = window.location) {\n        let result = null;\n\n        const searchString = baseLocation.search;\n        const internalRoute = this.get('session.attemptedTransition.intent.url');\n\n        if (searchString && _.trim(searchString).length > 0) {\n            result = (result || '') + searchString;\n        }\n\n        if (internalRoute && _.trim(internalRoute).length > 0) {\n            result = (result || '') + `#${internalRoute}`;\n        }\n\n        // Make sure we don't redirect to login-oauth; should never be the case though\n        return result && result.indexOf('login-oauth') === -1 ? result : null;\n    },\n\n    /**\n     * Parse and store the state param for later use to restore the app to\n     * pre-auth state.\n     */\n    deserializeRestoreState(stateParamValue, baseLocation = window.location) {\n        let redirectUrl = null;\n        let prunedStateParamValue = typeOf(stateParamValue) === 'string' ? stateParamValue.trim() : undefined;\n\n        if (prunedStateParamValue) {\n            let firstChar = prunedStateParamValue.charAt(0);\n            if (firstChar === '?' || firstChar === '#') {\n                // Rebuild pre-redirect state\n                try {\n                    // ensure pathname ends with .html or / for s3 redirect\n                    let s3SafePathname = baseLocation.pathname;\n                    if (!s3SafePathname.endsWith('.html') && !s3SafePathname.endsWith('/')) {\n                        s3SafePathname += '/';\n                    }\n\n                    let parsedStateParam = new URL(prunedStateParamValue, 'https://example.com');\n                    // if no search was provided via state, use the current\n                    // FUTURE: We could merge the query params if we wanted, but not currently applicable and probably overkill\n                    let finalSearch = parsedStateParam.search || baseLocation.search;\n                    // if no hash was provided via state, use the current\n                    let finalHash = parsedStateParam.hash || baseLocation.hash;\n\n                    redirectUrl = new URL(\n                        `${s3SafePathname}${finalSearch}${finalHash}`,\n                        baseLocation.origin || `${baseLocation.protocol}//${baseLocation.host}`\n                    ).toString();\n                } catch (e) {\n                    if (baseLocation) {\n                        // prunedStateParamValue or final url is invalid\n                        Logger.error('Failed to restore URL state after authentication', { error: e });\n                    }\n\n                    redirectUrl = null;\n                }\n            }\n        }\n\n        if (redirectUrl) {\n            this.set('_restoreState', { url: redirectUrl });\n        } else {\n            this.set('_restoreState', null);\n        }\n    },\n\n    /**\n     * Pop the restore state object {url: 'url'}\n     * to restore the app to pre-auth state\n     */\n    popRestoreState() {\n        const result = this.get('_restoreState');\n        this.set('_restoreState', null);\n        return result;\n    },\n\n    /**\n     * Persist the logout time in browser storage for logout bounce detection on\n     * the next application load\n     */\n    recordLogoutTime() {\n        let now = moment();\n\n        let cookieOptions = {\n            expires: moment(now).add(LOGOUT_BOUNCE_COOKIE_DURATION_MILLIS, 'milliseconds').toDate()\n        };\n\n        if (window && window.location && window.location.protocol === 'https:') {\n            cookieOptions.secure = true;\n        }\n\n        if (navigator && navigator.userAgent && isSameSiteNoneCompatible(navigator.userAgent)) {\n            cookieOptions.sameSite = 'none';\n        }\n\n        this.get('cookies').write(LOGOUT_BOUNCE_COOKIE_NAME, '' + now.valueOf(), cookieOptions);\n    },\n\n    _clearLogoutTime() {\n        this.get('cookies').clear(LOGOUT_BOUNCE_COOKIE_NAME);\n    },\n\n    _isInLogoutBounce() {\n        let result = false;\n\n        let now = moment();\n        let lastLogout = Number(this.get('cookies').read(LOGOUT_BOUNCE_COOKIE_NAME));\n\n        if (lastLogout) {\n            result = now.diff(moment(lastLogout)) <= LOGOUT_BOUNCE_THREASHOLD_MILLIS;\n        }\n\n        return result;\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\n\nexport const RELATE_FRAME_ID = '#relateFrame';\n\nconst DEFAULT_ROUTE_MAP = {\n    'relate-engine': {\n        list: {\n            contacts: 'contacts',\n            organizations: 'organizations'\n        },\n        contact: {\n            edit: 'contacts/profile/edit',\n            show: 'contacts/profile',\n            new: 'contacts/add'\n        },\n        organization: {\n            edit: 'organizations/profile/edit',\n            show: 'organizations/profile',\n            new: 'organizations/add'\n        },\n        upload: 'csv'\n    }\n};\n\nexport const VERIFICATION_RELEVANT_DATA_MESSAGE = {\n    command: 'verificationRelevantData'\n};\n\nexport const CONTACTS_ENDPOINT = 'api/v2/externalcontacts/contacts/';\nexport const CONVERSATIONS_ENDPOINT = 'api/v2/externalcontacts/conversations/';\n\nconst STRICT = true;\nconst NO_OP = 'noop';\n\nconst PROFILE_VERIFICATION_EVENT_NAME = 'profileVerified';\nconst SHOW_PROFILE_EVENT_NAME = 'showProfile';\n\nexport const EXTERNAL_CONTACT = 'externalcontacts/contact';\n\nconst ADAPTER_CACHE_TIMEOUT = 3 * 1000;\n\nexport const CHANNEL_MODEL_TYPE = 'externalcontacts/channel-record';\n\nexport default Ember.Service.extend(Ember.Evented, LoggerMixin, RelateFeaturesMixin, {\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n    addressformat: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    store: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    names: Ember.inject.service(),\n\n    adapterCache: {},\n\n    isRelateActive: false,\n    route: NO_OP,\n    navigationRoute: null,\n    redirectRoute: null,\n    externalContactProfiles: [],\n    navTree: null,\n    helpURL: Ember.computed.alias('route'),\n    relateFrameOrigin: null,\n    profileVerificationEventName: PROFILE_VERIFICATION_EVENT_NAME,\n    showProfileEventName: SHOW_PROFILE_EVENT_NAME,\n\n    /**\n     * The list of contacts associated with an interaction\n     *\n     * Contacts with 'wasAutoverified' were automatically associated\n     * interactionId => [ externalContact1, externalContact2, ... ]\n     */\n    contactAssociationMap: {},\n\n    /**\n     * The list of contacts that have been manually disassociated with an interaction\n     *   Will remove this when conversation service keeps track of the dissassociation list\n     *   For now, users will have to manually disassociate contacts again if the app is refreshed\n     *\n     * interactionId => [ externalContact1, externalContact2, ... ]\n     */\n    contactDisassociationMap: {},\n\n    findMatchingExternalContacts(searchTerm, pageOffset, pageSize, expandField, originator) {\n        if (!searchTerm) {\n            return Ember.RSVP.resolve([]);\n        }\n\n        let url = this.get('application').pcUri(CONTACTS_ENDPOINT);\n\n        if (this.get('addressformat').isValidNumber(searchTerm, null, STRICT)) {\n            searchTerm = this.get('addressformat').formatAddress(searchTerm);\n        }\n\n        let data = {};\n        if (searchTerm) {\n            data.q = searchTerm.replace('tel:', ''); // Strip the 'tel:', if any\n        }\n        if (pageOffset) {\n            data.pageNumber = pageOffset;\n        }\n        if (pageSize) {\n            data.pageSize = pageSize;\n        }\n        if (expandField) {\n            data.expand = expandField;\n        }\n        if (originator) {\n            data.originator = originator;\n        }\n\n        return this.get('ajax').ajaxGet(url + `?${Ember.$.param(data)}`, {\n            timeout: 2000 //msec - we saw ~100 msec latency for this call in DCA testing.  This ought to cover it.\n        });\n    },\n\n    registerSidebarState() {},\n\n    getEngineHelp(currentRouteName) {\n        const contextHelpUrls = this.get('contextHelpUrls') || {};\n        const path = Ember.get(_.merge(DEFAULT_ROUTE_MAP, contextHelpUrls), currentRouteName);\n        return path ? `relate.${path}` : currentRouteName;\n    },\n\n    handleNavigation(navEvent) {\n        this.set('navigationRoute', navEvent);\n    },\n\n    handleRedirect(navEvent) {\n        this.propertyWillChange('redirectRoute');\n        this.set('redirectRoute', navEvent);\n        this.propertyDidChange('redirectRoute');\n    },\n\n    registerNavEntries(navEntries) {\n        this.set('navTree', navEntries);\n    },\n\n    /**\n     * Binds a non-agent participant to an external contact the given external contact between the conversation, communication, and the media type\n     *  Note: Currently we only support a 1:1 relationship between interaction and contact. In the future we plan to adjust this\n     *          to be a 1:n relationship between interaction and its associated contacts\n     *\n     * @param conversationId - the conversation ID to which the external contact should be bound.\n     * @param externalContactId - (optional) if the external contact ID is missing the association is removed.\n     * @param communicationId - (optional) the communication ID for the conversation.\n     * @param mediaType - (optional)  Should be one of 'call', 'email', 'chat',\n     * @returns An Ember RSVP promise\n     */\n    associateConversationWithInteraction(conversationId, communicationId, externalContactId, mediaType) {\n        const url = this.get('application').pcUri(CONVERSATIONS_ENDPOINT + conversationId);\n        const data = {\n            communicationId: communicationId,\n            mediaType: mediaType,\n            conversationId: conversationId\n        };\n        if (externalContactId) {\n            data.externalContactId = externalContactId;\n        }\n        return this.get('ajax').put(url, { data: data, dataType: 'text' });\n    },\n\n    profileVerified(verificationInteractionData, displayNotification) {\n        if (displayNotification) {\n            verificationInteractionData.shouldNotify = true;\n        }\n        this.trigger(this.get('profileVerificationEventName'), verificationInteractionData);\n        this.processFrameVerificationEvent(verificationInteractionData);\n    },\n\n    closeRelateFrame(isClosedInteraction) {\n        if (!isClosedInteraction) {\n            this.trigger(this.get('showProfileEventName'), true);\n        }\n    },\n\n    postMessage(message) {\n        try {\n            const relateIframe = $(RELATE_FRAME_ID).get(0);\n            if (!relateIframe) {\n                return;\n            }\n\n            relateIframe.contentWindow.postMessage(message, this.get('relateFrameOrigin'));\n        } catch (e) {\n            this.logger.error('Could not postMessage', { error: e, message });\n        }\n    },\n\n    postVerificationRelevantDataV2(conversationId, communicationId, mediaType, contactId) {\n        let message = Object.assign({}, VERIFICATION_RELEVANT_DATA_MESSAGE);\n\n        const contactAssociationMap = this.get('contactAssociationMap');\n        const associatedContacts = contactAssociationMap[conversationId] || [];\n        const hasActiveAssociation = associatedContacts.length;\n\n        const verified =\n            hasActiveAssociation &&\n            associatedContacts.find(contact => {\n                return contact.get('id') === contactId;\n            });\n\n        const wasAutoVerified = verified && verified.get('wasAutoverified');\n\n        message.verificationRelevantData = {\n            mediaType: mediaType,\n            contactId,\n            conversationId,\n            communicationId,\n            wasAutoVerified,\n            isVerified: !!hasActiveAssociation,\n            activeProfileIsVerified: !!verified\n        };\n        this.postMessage(message);\n    },\n\n    getCachedAdapter(queryData, context, timeout) {\n        if (!context.ajax) {\n            this.logger.error(`Relate Service: Relate Service: adapter not valid`);\n            return Ember.RSVP.reject({});\n        }\n        const { url, data, TIME_OUT } = queryData;\n        const adapterCache = this.get('adapterCache');\n\n        const q = data.lookupVal || data.q;\n        const exp = data.expand || '';\n        const num = data.pageNumber || 0;\n        const siz = data.pageSize || 0;\n        const ord = data.sortOrder || 0;\n\n        const key = `${url}_${q}_${exp}_${num}_${siz}_${ord}`;\n\n        let { promise, timer } = adapterCache[key] || {};\n\n        if (!promise) {\n            promise = context.ajax(url, 'GET', { data, timeout: TIME_OUT }).catch(error => {\n                this.clearCachedAdapter(key);\n                const errorType = data.lookupVal ? 'reverse whitePage lookup' : 'search';\n\n                this.logger.error(`Relate Service: error getting data`, {\n                    remoteData: {\n                        error,\n                        errorType,\n                        sensitive: {\n                            data\n                        }\n                    }\n                });\n                return error;\n            });\n        }\n        if (timer) {\n            Ember.run.cancel(timer);\n        }\n        timer = Ember.run.later(this, 'clearCachedAdapter', key, timeout || ADAPTER_CACHE_TIMEOUT);\n        adapterCache[key] = { promise, timer };\n        return promise;\n    },\n\n    clearCachedAdapter(key) {\n        if (!key) {\n            return this.set('adapterCache', {});\n        }\n        const adapterCache = this.get('adapterCache');\n        const { timer } = adapterCache[key] || {};\n        if (timer) {\n            Ember.run.cancel(timer);\n        }\n        delete adapterCache[key];\n    },\n\n    interactionEnded(interactionId) {\n        const clear = map => {\n            interactionId &&\n                map[interactionId] &&\n                map[interactionId].clear() &&\n                map[interactionId].length === 0 &&\n                delete map[interactionId];\n        };\n        clear(this.contactAssociationMap);\n        clear(this.contactDisassociationMap);\n    }\n});\n","define(\"connections-ui/services/resize-detector\", [\"exports\", \"ember-element-resize-detector/services/resize-detector\"], function (_exports, _resizeDetector) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _resizeDetector.default;\n    }\n  });\n});\n","import Service, { inject } from '@ember/service';\n\nexport interface IMediaMetadata {\n    trackId: string;\n    screenId: string;\n    originX: number;\n    originY: number;\n    resolutionX: number;\n    resolutionY: number;\n    primary: boolean;\n    main?: boolean;\n}\n\nexport interface IShareableScreenInfo {\n    shareid: string;\n    width: number;\n    height: number;\n    isPrimary: boolean;\n    isMain: boolean;\n    x: number;\n    y: number;\n}\n\nexport class BrowserScreenRecordingError extends Error {}\n\nexport default class ScreenMediaService extends Service {\n    application = inject('application');\n    session = inject('session');\n    logger = inject('stash-logger');\n\n    // set this through Orgpsan for testing\n    allowScreenRecordingInBrowser!: false;\n    debugScreenSelectionOpen = false;\n\n    _getHostedContext() {\n        return (this.get as any)('application.hostedContext');\n    }\n\n    _isHosted(): boolean {\n        return this._getHostedContext().isHosted();\n    }\n\n    canDoScreenRecording(): boolean {\n        return this._isHosted() || this.get('allowScreenRecordingInBrowser');\n    }\n\n    async _debugScreenRecordingInBrowser(): Promise<MediaStream> {\n        this.set('debugScreenSelectionOpen', true);\n        const stream = await navigator.mediaDevices.getDisplayMedia();\n        this.set('debugScreenSelectionOpen', false);\n\n        return stream;\n    }\n\n    async getMediaStreamWithAllMonitors(\n        conversationId: string\n    ): Promise<{ stream: MediaStream; metadatas: IMediaMetadata[] }> {\n        if (!this._isHosted()) {\n            this.get('logger').warn('screenMedia was requested in non-hosted env', { remoteData: { conversationId } });\n        }\n\n        if (this.get('allowScreenRecordingInBrowser')) {\n            const stream = await this._debugScreenRecordingInBrowser();\n            const track = stream.getTracks()[0];\n            const { height, width, deviceId } = track.getSettings();\n            const metadata: IMediaMetadata = {\n                trackId: track.id,\n                screenId: deviceId!, // some applications give you a deviceId on the track which is uniquely tied to a specific monitor\n                originX: 0,\n                originY: 0,\n                resolutionX: width!,\n                resolutionY: height!,\n                primary: true\n            };\n\n            return { stream, metadatas: [metadata] };\n        } else if (!this._isHosted()) {\n            throw new BrowserScreenRecordingError('Cannot do screen recording in browser env');\n        }\n\n        // get a list of monitors so we can gather media for each one\n        const screens = await this._getHostedContext().getShareableScreens();\n\n        const stream = this.createMediaStream();\n        const metadatas = [];\n\n        for (const screen of screens) {\n            const track = await this.getVideoTrackForScreenId(screen.shareid, conversationId);\n\n            // if we have a track, create the metadata to go with it\n            if (track) {\n                stream.addTrack(track);\n                metadatas.push(this.createTrackMetadata(screen, track));\n            }\n        }\n\n        return { stream, metadatas };\n    }\n\n    createMediaStream() {\n        return new MediaStream();\n    }\n\n    // tries 3 times to add a screen to the media stream\n    async getVideoTrackForScreenId(\n        screenId: string,\n        conversationId: string,\n        attemptsRemaining = 3\n    ): Promise<MediaStreamTrack | undefined> {\n        try {\n            const stream = await this.getHostedScreenMedia(screenId);\n\n            if (stream && stream.getVideoTracks().length) {\n                return stream.getVideoTracks()[0];\n            }\n\n            return;\n        } catch (err) {\n            if (!attemptsRemaining) {\n                this.get('logger').error(new Error('Failed to initialize screen recording for screen') as any, {\n                    remoteData: { screenId, conversationId, error: err }\n                });\n                return;\n            }\n\n            return this.getVideoTrackForScreenId(screenId, conversationId, attemptsRemaining - 1);\n        }\n    }\n\n    getHostedScreenMedia(screenId: string, maxFrameRate = 3): Promise<MediaStream> {\n        return window.navigator.mediaDevices.getUserMedia({\n            audio: false,\n            video: {\n                mandatory: {\n                    chromeMediaSource: 'desktop',\n                    chromeMediaSourceId: screenId,\n                    maxFrameRate\n                }\n            } as any\n        });\n    }\n\n    createTrackMetadata(screenInfo: IShareableScreenInfo, track: MediaStreamTrack): IMediaMetadata {\n        const isWindows = navigator.appVersion.indexOf('Win') > -1;\n        // purecloud-mac uses the bottom-left corner of the screen as its origin, with positive numbers representing higher origins\n        // purecloud-directory-window uses the top-left corner of the screen as its origin, with positive numbers representing lower origins\n        return {\n            trackId: track.id,\n            screenId: screenInfo.shareid,\n            originX: screenInfo.x,\n            originY: isWindows ? screenInfo.y : -1 * screenInfo.y,\n            resolutionX: screenInfo.width,\n            resolutionY: screenInfo.height,\n            primary: !!screenInfo.isPrimary,\n            main: !!screenInfo.isMain\n        };\n    }\n}\n\n/** DO NO REMOVE MODULE DECLARATION **/\ndeclare module '@ember/service' {\n    interface Registry {\n        screenMedia: ScreenMediaService;\n        'screen-media': ScreenMediaService;\n    }\n}\n","define(\"connections-ui/services/scroll-activity\", [\"exports\", \"ember-user-activity/services/scroll-activity\"], function (_exports, _scrollActivity) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _scrollActivity.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { isAbortError } from 'ember-ajax/errors';\nimport DS from 'ember-data';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport EsaSessionService from 'ember-simple-auth/services/session';\nimport _ from 'lodash';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport FieldConfig from '../field-config/field-config';\nimport moment from '../utils/dates';\nimport featureToggles from '../utils/feature-toggles';\nimport { addPageAction, setCustomAttribute } from '../utils/newrelic';\nimport { getLoggableRequestFailureDetails } from '../utils/request';\nimport { executeChain, isChainStepFailure } from '../utils/serial-processing-chain';\nimport { loadTheme, setThemeCookie } from '../utils/theme-loader';\nimport { buildCommonTelemetryContext } from './analytics';\n\n// TECHDEBT: Make this a proper type/error and part of the method signature when moving to TS\nexport const SESSION_BOOTSTRAP_ERROR_TYPE = 'sessionBootstrapError';\n\nexport default EsaSessionService.extend(LoggerMixin, {\n    ajax: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    clock: Ember.inject.service(),\n    pigeon: Ember.inject.service(),\n    stashLogger: Ember.inject.service('stash-logger'),\n    cookies: Ember.inject.service(),\n    application: Ember.inject.service(),\n    featureService: Ember.inject.service('feature'),\n    presence: Ember.inject.service(),\n    presenceSubscription: Ember.inject.service(),\n    // Store conflicts with ESA Session Service property\n    dataStore: Ember.inject.service('store'),\n    permissionService: Ember.inject.service('permissions'),\n    orgSettings: Ember.inject.service('orgSettings'),\n\n    accessToken: null,\n\n    person: null,\n    presenceMap: Ember.computed.reads('presence.presenceDefinitions'),\n\n    user: null, // Legacy - Directory session user - Move to permissions where possible.\n    namedPermissions: Ember.computed.reads('permissions'), // Backwards compatibility - Directory namedPermissions now point to public-api permissions\n\n    permissions: Ember.computed.reads('publicApiUser.authorization.permissions'),\n    roleNames: Ember.computed.map('publicApiUser.authorization.roles', role => role.name),\n\n    readWritePermissionsDeferred: null,\n\n    allowedOrgPermissions: null,\n    features: null,\n    enabledFeatures: [],\n\n    products: [],\n\n    authInProgress: false,\n    /**\n     * Marker boolean to indicate that the current session is being torn down\n     */\n    logoutInProgress: false,\n    /**\n     * Marker boolean to indicate that a hard logout has been requested\n     */\n    singleSignOutInProgress: false,\n\n    offset: 0,\n\n    blockers: [],\n\n    _timeAuthenticated: null,\n\n    init() {\n        this._super(...arguments);\n\n        let deferred = this.get('readWritePermissionsDeferred');\n        if (!deferred) {\n            deferred = Ember.RSVP.defer();\n            this.set('readWritePermissionsDeferred', deferred);\n        }\n    },\n\n    // isAuthenticated conflicts with ESA Session Service property\n    isAuthenticated: Ember.computed('session.isAuthenticated', 'user', 'person', function () {\n        return this.get('session.isAuthenticated') && !_.isEmpty(this.get('user'));\n    }),\n\n    hasAppAccess: Ember.computed('namedPermissions', 'user.isSuper', 'user.isTrustee', function () {\n        if (this.get('user.isSuper') || this.get('user.isTrustee')) {\n            return true;\n        }\n\n        var permissions = this.get('namedPermissions');\n\n        const hasDirectoryUserViewPermission = (permissions || []).some(perm => {\n            return perm.indexOf('directory:user:view') > -1;\n        });\n\n        return (\n            _.includes(permissions, 'employee') ||\n            _.includes(permissions, 'external') ||\n            _.includes(permissions, 'associate') ||\n            hasDirectoryUserViewPermission\n        );\n    }),\n\n    hasTrusteeAccess: Ember.computed('user.isTrustee', function () {\n        return this.get('user.isTrustee');\n    }),\n\n    // Has permission that is division aware.\n    hasPermissionAndDivision: function (permission, division) {\n        const result = {\n            hasPermission: false,\n            divisions: [],\n            hasDivision: false,\n            hasDivisions: false\n        };\n\n        if (!permission) {\n            return result;\n        }\n\n        const permissions = this.get('namedPermissions');\n        const expression = '^'.concat(permission, ':', '([0-9A-Fa-f]{8}(?:-[0-9A-Fa-f]{4}){3}-[0-9A-Fa-f]{12},|)+');\n        const regEx = new RegExp(expression);\n        let isPermission = false;\n        let isPermissionWithDivisions = false;\n        let permissionDivisions = [];\n\n        const foundPermission = _.find(permissions, p => {\n            isPermission = p === permission;\n            isPermissionWithDivisions = regEx.test(p);\n            if (isPermissionWithDivisions) {\n                permissionDivisions = _.last(p.split(':'));\n            }\n            return isPermission || isPermissionWithDivisions;\n        });\n\n        if (foundPermission) {\n            result.hasPermission = true;\n            if (isPermissionWithDivisions) {\n                result.hasDivisions = true;\n                if (permissionDivisions && permissionDivisions.length > 0) {\n                    result.divisions = permissionDivisions.split(',');\n                    if (division && _.includes(permissionDivisions, division)) {\n                        result.hasDivision = true;\n                    }\n                }\n            }\n            return result;\n        }\n        return result;\n    },\n\n    readWritePermissions: Ember.computed(function () {\n        const deferred = this.get('readWritePermissionsDeferred');\n        if (!deferred) {\n            // return dummy on the off chance that the laws of physics no longer apply\n            if (this.logger) {\n                this.logger.warn('readWritePermissionsDeferred never instantiated in Session `init` call');\n            }\n            return Ember.RSVP.defer().promise;\n        }\n        return deferred.promise;\n    }),\n\n    useEmailDraftEvent: true,\n\n    popoutAuthForIframes: Ember.computed('org.orgSettings.popoutAuthForIframes', function () {\n        return !!this.get('org.orgSettings.popoutAuthForIframes');\n    }),\n\n    /**\n     * Determines if the app should try to detect API requests to the UI hosting domain and\n     * rewrite them to our API domain. This is to help with the transition to our new\n     * hosting where API calls are not available on the same domain.\n     */\n    rewriteRootAPIRequests: Ember.computed('features.comui-disable-legacy-api-url', function () {\n        // Only do this we are on the new hosting and the feature toggle is enabled.\n        return window.location.hostname.startsWith('app.') && this.get('features.comui-disable-legacy-api-url');\n    }),\n\n    createFieldConfigs: function (fieldConfigs) {\n        for (const value of Object.values(fieldConfigs)) {\n            this.createFieldConfig(value);\n        }\n    },\n\n    createFieldConfig: function (fieldConfig) {\n        FieldConfig.createFieldConfig(fieldConfig, Ember.getOwner(this));\n    },\n\n    createPresences: function () {\n        return this.get('presence').loadPresences();\n    },\n\n    loadAllowedOrgPermissions: function () {\n        const url = this.get('application').pcV2Uri('api/v2/authorization/permissions?pageSize=99999');\n        return this.get('ajax')\n            .request(url)\n            .then(data => {\n                this.set('allowedOrgPermissions', data.entities);\n            })\n            .catch(error => {\n                this.set('allowedOrgPermissions', null);\n                this.logger.error('Could not get org permissions:', { error });\n                return Ember.RSVP.reject('orgPermissionsFetchFailure');\n            });\n    },\n\n    loadOrgProducts: function () {\n        const url = this.get('application').pcV2Uri('api/v2/authorization/products');\n        return this.get('ajax')\n            .request(url)\n            .then(data => {\n                this.set('products', data.entities);\n            })\n            .catch(error => {\n                this.set('products', []);\n                this.logger.error('Could not get org products:', { error });\n                return Ember.RSVP.reject('orgProductsFetchFailure');\n            });\n    },\n\n    async getOrganizationTranscriptSettings() {\n        const ajax = this.get('ajax');\n        const application = this.get('application');\n        const hasPermission = (this.get('permissions') || []).includes('routing:transcriptionSettings:view');\n\n        if (!hasPermission) {\n            return {};\n        }\n\n        let transcriptSettings = {};\n\n        try {\n            const settingsUri = application.pcV2Uri('api/v2/routing/settings/transcription');\n            const response = await ajax.request(settingsUri);\n\n            transcriptSettings = response || {};\n        } catch (error) {\n            this.logger.error('directory failed to retrieve org transcript settings', { error });\n        }\n\n        this.set('transcriptSettings', transcriptSettings);\n        return transcriptSettings;\n    },\n\n    getPresence(presence) {\n        return this.get('presence').getPresence(presence);\n    },\n\n    authenticateWithSession(forceDirectory = false) {\n        if (this.get('isAuthenticated')) {\n            return Ember.RSVP.resolve();\n        }\n\n        this.set('authInProgress', true);\n\n        const bootstrapStartTime = performance.now();\n\n        return executeChain(\n            [\n                {\n                    stepDesc: 'loadFeatureToggles',\n                    process: () => this.getFeatures()\n                },\n                {\n                    stepDesc: 'loadOrgPermissions',\n                    process: () => this.loadAllowedOrgPermissions()\n                },\n                {\n                    stepDesc: 'setupTheme',\n                    processSync: () => setThemeCookie(loadTheme(this))\n                },\n                {\n                    stepDesc: 'setupUserAndTrustee',\n                    process: () => {\n                        if (!forceDirectory) {\n                            return this.trusteeBootstrap();\n                        }\n\n                        return Ember.RSVP.resolve();\n                    }\n                },\n                {\n                    stepDesc: 'establishDirectorySession',\n                    process: () => {\n                        // Don't call directory session for login when we have trustee features on\n                        if (this.get('user.isTrustee')) {\n                            return Ember.RSVP.resolve();\n                        }\n\n                        const path = 'api/v2/apps/legacy/session';\n                        const url = this.get('application').pcV2Uri(path);\n                        const data = { lang: this.get('intl.isoLocale') };\n                        return this.get('ajax')\n                            .post(url, { data })\n                            .then(data => this.establishSession(data));\n                    }\n                },\n                {\n                    stepDesc: 'initServerTranslations',\n                    process: () => this.get('intl').setupServerTranslations()\n                },\n                {\n                    stepDesc: 'loadPresences',\n                    process: () => this.createPresences()\n                },\n                {\n                    stepDesc: 'loadUserDetails',\n                    process: () => {\n                        if (this.get('user.isSuper') || this.get('user.isTrustee')) {\n                            return Ember.RSVP.resolve([]);\n                        }\n                        return this.refreshPublicApiUser();\n                    }\n                },\n                {\n                    stepDesc: 'loadUserFavorites',\n                    processSync: () => {\n                        if (this.get('user.isSuper') || this.get('user.isTrustee')) {\n                            return;\n                        }\n\n                        return this.get('person.favorites');\n                    }\n                },\n                {\n                    stepDesc: 'setupCarrierPigeon',\n                    process: () => this.setupCarrierPigeon()\n                },\n                {\n                    stepDesc: 'initAppSession',\n                    process: () => this.updateAppSession()\n                },\n                {\n                    stepDesc: 'loadOrgProducts',\n                    process: () => {\n                        const hasAssistantsQueueViewPermission = (this.get('namedPermissions') || []).some(perm => {\n                            return perm.indexOf('assistants:queue:view') > -1;\n                        });\n                        if (hasAssistantsQueueViewPermission) {\n                            return this.loadOrgProducts();\n                        }\n                    }\n                },\n                {\n                    stepDesc: 'loadOrgTranscriptSettings',\n                    process: () => this.getOrganizationTranscriptSettings()\n                },\n                {\n                    stepDesc: 'loadPerson',\n                    processSync: () => this.get('person')\n                }\n                // DO NOT add additional processing blocks here unless it is REQUIRED for app bootstrap\n            ],\n            {\n                loggingConfig: {\n                    logger: this.get('stashLogger'),\n                    logMsgPrefix: 'Session Bootstrap Chain: '\n                }\n            }\n        )\n            .then(() => {\n                this.set('authInProgress', false);\n                const bootstrapDuration = performance.now() - bootstrapStartTime;\n                addPageAction('sessionBootstrapSuccess', {\n                    duration: bootstrapDuration\n                });\n            })\n            .catch(reason => {\n                this.set('authInProgress', false);\n\n                let error = reason;\n                let failedStep;\n\n                // Theoretically, reason should always be a ChainStepFailure, but .. promise rejection typings\n                if (isChainStepFailure(reason)) {\n                    error = reason.origReason;\n                    failedStep = reason.stepDesc;\n                }\n\n                /* Legacy Checks */\n                let legacyInvalidSessionToken = false;\n                let legacyErrorCode = null;\n                if (error && error.status === 200) {\n                    legacyErrorCode = 'directorySessionParseFailure';\n                }\n\n                if (error && error.status === 403) {\n                    legacyInvalidSessionToken = true;\n                    legacyErrorCode = 'invalidSessionToken';\n                }\n                /* End Legacy Checks */\n\n                const telemetryContext = buildCommonTelemetryContext({\n                    applicationService: this.get('application'),\n                    sessionService: this,\n                    intlService: this.get('intl')\n                });\n                const loggableRequestFailureDetails = getLoggableRequestFailureDetails(error);\n\n                this.get('stashLogger').error('Session bootstrap failed', {\n                    error,\n                    remoteData: Object.assign(\n                        {\n                            failedStep,\n                            legacyErrorCode,\n                            requestFailureDetails: loggableRequestFailureDetails\n                        },\n                        telemetryContext\n                    )\n                });\n\n                addPageAction(\n                    'sessionBootstrapFailure',\n                    Object.assign(\n                        {\n                            failedStep,\n                            legacyErrorCode\n                        },\n                        loggableRequestFailureDetails,\n                        telemetryContext\n                    )\n                );\n\n                return Ember.RSVP.reject({\n                    type: SESSION_BOOTSTRAP_ERROR_TYPE,\n                    failedStep,\n                    status: loggableRequestFailureDetails ? loggableRequestFailureDetails.status : undefined,\n                    legacyInvalidSessionToken\n                });\n            });\n    },\n\n    trusteeBootstrap() {\n        const expands = ['fieldconfigs', 'organization'];\n\n        return new Ember.RSVP.Promise((resolve, reject) => {\n            this.refreshPublicApiUser(expands)\n                .then(data => {\n                    this.setServerTimeOffset();\n                    moment.now = () => {\n                        const offset = this.get('offset');\n                        return +new Date() + offset;\n                    };\n\n                    this.set('_timeAuthenticated', moment.now());\n\n                    this.createFieldConfigs(data.fieldConfigs);\n\n                    const user = this.setupStoreData('public-api-user', data);\n                    this.set('user', user);\n                    this.set('trusteeOrg', data.organization);\n\n                    // See if the person exists, if not, trustee user.\n                    // This will be changed to an directory session call when they support\n                    // trustees...soon...\n                    this.get('dataStore')\n                        .find('person', user.get('id'))\n                        .then(person => {\n                            this.set('person', person);\n\n                            // the profile load was triggerred by refreshPublicApiUser(expands) above\n\n                            resolve(person);\n                        })\n                        .catch(error => {\n                            const serverError = Ember.get(error, 'errors.0');\n                            if (serverError && serverError.status === 404) {\n                                this.set('user.isTrustee', true);\n\n                                const person = this.get('dataStore').createRecord('person', {\n                                    id: 'trustee',\n                                    general: {\n                                        name: [{ value: user.get('name') }],\n                                        department: [{ value: user.get('department') }],\n                                        title: [{ value: user.get('title') }]\n                                    }\n                                });\n                                this.set('person', person);\n\n                                resolve();\n                            } else {\n                                reject(error);\n                            }\n                        });\n                })\n                .catch(error => {\n                    if (error.status === 404 || _.includes(error.message, 'not found')) {\n                        resolve(this.authenticateWithSession(true));\n                    } else {\n                        this.get('logger').error('trusteeBootstrap failed', {\n                            error,\n                            remoteData: {\n                                error: error\n                            }\n                        });\n                        reject(error);\n                    }\n                });\n        });\n    },\n\n    /**\n     * Initiates logout if the user is deleted outside of a logout request\n     */\n    onLegacySessionInvalidation: Ember.observer('user', function () {\n        if (_.isEmpty(this.get('user')) && !this.get('logoutInProgress')) {\n            this.invalidate();\n        }\n    }),\n\n    /**\n     * If no critical work is in progress, invalidates the session with both ESA\n     * and any local cleanup triggering the 'invalidationSucceeded' event when complete.\n     * This method should be used to invalidate the current session as opposed to\n     * logging out of PureCloud.  For a full, single-sign-out logout, call logout.\n     *\n     * This method triggers 'invalidatingAuthSession' to allow any listeners to\n     * register critical functionality that cannot be currently aborted.\n     *\n     * Note: This method is multi-call, burst tolerant to handle multiple\n     * 401 responses from the ajaxError handler and bubbling logout events.\n     *\n     * @returns A rejected promise if any listeners have registered critical functionality\n     * in progress; Otherwise, a logout promise that will be the same instance for the duration\n     * of the logout attempt.  It will only be reattempted if the logout attempt\n     * fails.\n     */\n    invalidate(options) {\n        options = options || {};\n        const LOGOUT_PROMISE_PROP_NAME = '_logoutPromise';\n        let logoutPromise = this.get(LOGOUT_PROMISE_PROP_NAME);\n\n        //workaround for an odd bug that is causing the call to super below to hit the wrong super class.\n        //the context of `this` does not change, but _super does.\n        let _super = this._super.bind(this);\n\n        // notify services that we're attempting to logout.\n        this.trigger('invalidatingAuthSession', this.addRemoveBlockers.bind(this));\n\n        if (this.get('blockers.length') > 0) {\n            this.set('shouldPreventLogout', true);\n            const unauthorized = !!(options.unauthorized || options.notified);\n            // Force a boolean value\n            this.set('logoutSinceUnauthorized', unauthorized);\n            return Ember.RSVP.reject('prevent this logout');\n\n            // if we got blocked due to webrtc sessions, we want to bypass this because it means they've already seen a notification\n        } else if (!this.get('logoutSinceUnauthorized')) {\n            this.set('shouldPreventLogout', false);\n            this.set('logoutSinceUnauthorized', false);\n        }\n        if (!logoutPromise) {\n            logoutPromise = new Ember.RSVP.Promise((resolve, reject) => {\n                this.set('logoutInProgress', true);\n\n                Ember.RSVP.resolve().finally(() => {\n                    if (this.get('session.isAuthenticated')) {\n                        _super(...arguments)\n                            .then(resolve)\n                            .catch(() => {\n                                // Currently, this will only happen if ESA fails to remove the auth creds\n\n                                this.set('logoutInProgress', false);\n\n                                // kill user to force isAuthenticated computed to false\n                                // Note: user observer fires immediately and gets same rejected promise; no duplicate call risk\n                                this.set('user', null);\n\n                                // Reset the promise so they can attempt to logout again\n                                this.set(LOGOUT_PROMISE_PROP_NAME, null);\n\n                                // ESA will fire a failure event\n                                reject();\n                            });\n                    } else {\n                        /* ESA is already unauth'd (Ex: no-access route).\n                         * Simply do some local cleanup and redirect to the login screen\n                         * Note: This op could have no effect and result in the user landing back on the same page.\n                         * For Example: The no-access page\n                         */\n\n                        const authenticator = Ember.getOwner(this).lookup('authenticator:directory');\n                        if (authenticator) {\n                            authenticator.cleanCustomBrowserStorage();\n                        }\n                        this.trigger('invalidationSucceeded');\n\n                        resolve();\n                    }\n                });\n            }); // end logoutPromise\n\n            this.set(LOGOUT_PROMISE_PROP_NAME, logoutPromise);\n        } // end if (!logoutPromise)\n\n        return logoutPromise;\n    },\n\n    addRemoveBlockers(action, blocker) {\n        let arr = this.get('blockers');\n        if (action === 'add') {\n            arr.pushObject(blocker);\n        }\n        if (action === 'remove') {\n            arr.removeObject(blocker);\n        }\n        this.get('blockers').setObjects(arr.uniq());\n    },\n\n    proxyLogin(orgId, hash) {\n        this.set('proxyLoginInfo', { org: orgId, hash: hash });\n        return this.invalidate({ notified: true }).catch(() => {\n            this.set('proxyLoginInfo', null);\n        });\n    },\n\n    retrieveProxyLoginInfo() {\n        return this.get('proxyLoginInfo');\n    },\n\n    /**\n     * If no critical work is in progress, log out of entire PureCloud suite.\n     *\n     * Kills currently issued auth token and all other tokens issued within the\n     * current auth session.  Also kills RememberMe context (if applicable).\n     *\n     * @returns A rejected promise if critical work is in progress; otherwise, a\n     * \"singleton\" promise that will reject or resolve on eventual completion. The\n     * promise allows burst calls of logout to be debounced until the promise\n     * resolves.\n     *\n     * @see #invalidate() for burst and critical work details\n     */\n    logout() {\n        this.set('singleSignOutInProgress', true);\n        return this.invalidate({ notified: true }).catch(reason => {\n            // Invalidate failed due to active call, interal issue, etc.\n\n            // Clear the SSO boolean for recoverable failure cases\n            this.set('singleSignOutInProgress', false);\n            return Ember.RSVP.reject(reason);\n        });\n    },\n\n    setupStoreData(type, data) {\n        let store = this.get('dataStore');\n        let model = store.modelFor(type);\n        let serializer = store.serializerFor(type);\n        data = serializer.normalizeSingleResponse(store, model, data, data.guid);\n        return store.push(data);\n    },\n\n    /**\n     * Safely checks if a feature flag is enabled, ensuring features are loaded first\n     * @param {string} featureName - The name of the feature flag to check\n     * @returns {boolean} - Whether the feature is enabled\n     */\n    isFeatureEnabled(featureName) {\n        if (!this.get('features')) {\n            return false;\n        }\n        return !!this.get(`features.${featureName}`);\n    },\n\n    establishSession(data, redirect) {\n        let response = data.res;\n\n        if (!_.isEmpty(redirect)) {\n            Ember.run.later(\n                this,\n                function () {\n                    window.location = redirect;\n                },\n                100\n            );\n\n            return;\n        }\n\n        this.setServerTimeOffset();\n        moment.now = () => {\n            const offset = this.get('offset');\n            return +new Date() + offset;\n        };\n\n        this.createFieldConfigs(response.fieldConfigs);\n\n        let person = null;\n        if (response.person && response.person.guid) {\n            person = this.setupStoreData('person', response.person);\n            this.set('person', person);\n        }\n\n        let user = this.setupStoreData('user', response.user);\n\n        this.set('app', response.app);\n        this.set('_rawResponse', response);\n\n        if (response.org && response.org._id) {\n            let org = this.setupStoreData('org', response.org);\n            this.set('org', org);\n            this.get('orgSettings')\n                .fetchOrgSettings(this.get('org.orgSettings'))\n                .then(orgSettings => {\n                    this.set('org.orgSettings', orgSettings);\n                })\n                .catch(error => {\n                    this.logger.error('Error fetching org settings:', error);\n                });\n        }\n\n        const cookieProxyPerson = this.get('cookies').read('proxyPerson');\n        const personId = cookieProxyPerson || user.get('personGuid');\n\n        if (personId && !person) {\n            let store = this.get('dataStore');\n            let shouldReload = store.hasRecordForId('person', personId);\n            let promise = store\n                .find('person', personId)\n                .then(person => {\n                    if (shouldReload) {\n                        person.reload();\n                    }\n\n                    this.set('user', user);\n                    this.set('person', person);\n\n                    // Notify read-write perm handlers\n                    const deferred = this.get('readWritePermissionsDeferred');\n                    if (deferred) {\n                        deferred.resolve(person.get('readWritePermissions'));\n                    }\n\n                    return person;\n                })\n                .finally(() => {\n                    this.set('authInProgress', false);\n                });\n\n            return DS.PromiseObject.create({\n                promise: promise\n            });\n        }\n\n        return new Ember.RSVP.Promise(resolve => {\n            this.set('authInProgress', false);\n            if (!Ember.get(user, 'isSuper')) {\n                return resolve(person);\n            }\n            let superPerson = this.get('dataStore').createRecord('person', { id: 'super' });\n\n            this.set('user', user);\n            this.set('person', superPerson);\n\n            return resolve(person);\n        });\n    },\n\n    _reloadApplication: function () {\n        this.get('cookies').clear(this.get('application.cookies.session'));\n\n        var href = window.location.href;\n        var hashIndex = href.indexOf('#');\n        if (hashIndex > -1) {\n            href = href.substring(0, hashIndex);\n        }\n        window.location.replace(href);\n    },\n\n    getFeatures: function (forceUpdate = false) {\n        const featureService = this.get('featureService');\n\n        const localFeatures = [];\n        // filters out the feature toggles that are locally set to `false`\n        Object.entries(featureToggles).forEach(([key, value]) => (value ? localFeatures.push(key) : null));\n\n        return featureService\n            .getFeatureToggles(...localFeatures, forceUpdate)\n            .then(features => {\n                // Sometimes it's nicer to just have a list of all of the enabled features\n                this.set('features', features);\n\n                this.set(\n                    'enabledFeatures',\n                    Object.keys(features).filter(feature => {\n                        return features[feature];\n                    })\n                );\n            })\n            .catch(error => {\n                if (!isAbortError(error)) {\n                    this.logger.error('Could not fetch feature toggles:', {\n                        error,\n                        remoteData: {\n                            error: error\n                        }\n                    });\n                }\n                return Ember.RSVP.reject(error);\n            });\n    },\n\n    setServerTimeOffset: Ember.observer('isAuthenticated', 'clock.day', function () {\n        const BASE_URI = 'api/v2/date';\n        const CLIENT_REQUEST_TIME_DIFF = 30000; //30 sec in milliseconds; Represents the acceptable time gap on the client between t3 and t0\n\n        this.get('clock.day'); //force consumption\n\n        if (this.get('isAuthenticated')) {\n            const t0 = moment(new Date());\n            const url = this.get('application').pcV2Uri(BASE_URI);\n            this.get('ajax')\n                .raw(url)\n                .then(response => {\n                    const serverDate = response.response;\n                    const t1 = moment(serverDate.currentDate);\n                    let correlationId = null;\n                    if (response.jqXHR) {\n                        correlationId = response.jqXHR.getResponseHeader('ININ-Correlation-id');\n                    }\n                    // TODO: Pull DATE header from response to get better measure of when the\n                    // response was sent.\n                    const t2 = t1;\n                    const t3 = moment(new Date());\n                    const clientSystemTimeSuspect = t3.diff(t0) >= CLIENT_REQUEST_TIME_DIFF;\n\n                    if (clientSystemTimeSuspect) {\n                        this.set('offset', t2.diff(t3));\n                    } else {\n                        this.set('offset', (t1.diff(t0) + t2.diff(t3)) / 2); //Offset algorithm:  http://en.wikipedia.org/wiki/Network_Time_Protocol#Clock_synchronization_algorithm\n                    }\n\n                    this.logger.debug(\n                        `Session timer offset: Server time offset is ${this.get('offset') / 1000} seconds`\n                    );\n                    this.set('sessionTimers', {\n                        serverTimet1: t1.format(),\n                        clientTimet3: t3.format(),\n                        clientTimet0: t0.format(),\n                        offsetCalculated: this.get('offset'),\n                        clientSystemTimeSuspect,\n                        correlationId\n                    });\n                })\n                .catch(err => {\n                    this.logger.debug(\n                        'Session timer offset: An error occured when getting the server time to calculate offset. Using offset 0.',\n                        err\n                    );\n                    this.set('offset', 0);\n                });\n        } else {\n            this.set('offset', 0);\n        }\n    }),\n\n    setupCarrierPigeon() {\n        const subscription = this.get('presenceSubscription');\n        const pigeon = this.get('pigeon');\n        const channelId = this.get('accessToken');\n        const subscribeUrl = this.get('application').pcUri(`api/v2/notifications/channels/${channelId}/subscriptions`);\n        pigeon.initialize({\n            // Use public-api v2 and the access token as the channel id until realtime can use real channels\n            subscribeUrl,\n            features: this.get('features'),\n            publicApiUser: this.get('publicApiUser'),\n            accessToken: channelId\n        });\n\n        // application service will tell pigeon to register topics after streaming service is connected\n\n        if (isTesting) return Ember.RSVP.resolve();\n        subscription.subscribeToMyself();\n    },\n\n    /**\n     * Updates the session with public api used for things such as Download.\n     * A valid session establishment will set a cookie used for auth on certain routes.\n     */\n    updateAppSession() {\n        const url = this.get('application').pcV2Uri(['api/v2/apps/session']);\n        return this.get('ajax')\n            .post(url, {\n                xhrFields: {\n                    withCredentials: true\n                },\n                headers: {\n                    Authorization: `bearer ${this.get('accessToken')}`\n                }\n            })\n            .catch(reason => {\n                this.logger.error('Failed to obtain Apps Session', { error: reason });\n\n                // This request is allowed to fail since its only required for embeds\n                // We shouldnt break the app for that...\n                return Ember.RSVP.resolve();\n            });\n    },\n\n    refreshPublicApiUser(expand) {\n        const url = this.get('application').pcV2Uri('api/v2/users/me');\n        const options = {};\n\n        let baseExpands = [\n            'authorization',\n            'conversationSummary',\n            //'date'\n            'fieldconfigs',\n            'geolocation',\n            //'geolocationsettings'\n            //'locations'\n            'dateLastLogin',\n            'organization',\n            'outOfOffice',\n            'presence',\n            //'presencedefinitions'\n            //'profileSkills'\n            'routingStatus',\n            'station',\n            'token'\n        ];\n\n        //make a unique request during session initialization\n        if (!this.get('isAuthenticated')) {\n            if (this.get('publicApiUser')) {\n                return this.get('publicApiUser');\n            } else {\n                options.data = {\n                    expand: baseExpands.join(',')\n                };\n            }\n        } else {\n            if (expand) {\n                options.data = {\n                    expand: _.uniq(baseExpands.concat(expand)).join(',')\n                };\n            } else {\n                options.data = {\n                    expand: baseExpands.join(',')\n                };\n            }\n        }\n\n        return this.get('ajax')\n            .request(url, options)\n            .then(data => {\n                this.set('publicApiUser', data);\n                return data;\n            })\n            .catch(error => {\n                if (!isAbortError(error)) {\n                    Ember.Logger.warn('Failed to fetch purecloud user in session:', { error });\n                }\n                return Ember.RSVP.reject(error);\n            });\n    },\n\n    resetPassword(type, email, newPassword, resetToken, currentPassword) {\n        Ember.assert('Please specify `set` or `change` as reset type', type);\n\n        if (type === 'set') {\n            Ember.assert('Please specify reset token to set password', resetToken);\n        }\n\n        let url;\n        let data;\n\n        if (type === 'change') {\n            Ember.assert('Please provide the current password', currentPassword);\n\n            url = this.get('application').pcV2Uri('api/v2/users/me/password');\n            data = {\n                oldPassword: currentPassword,\n                newPassword: newPassword\n            };\n        } else if (type === 'set') {\n            url = this.get('application').uri('api/v1/setPassword');\n            data = {\n                email: email,\n                password: newPassword,\n                verifyPassword: newPassword,\n                resetToken: resetToken\n            };\n        }\n\n        return this.get('ajax').post(url, { data });\n    },\n\n    publicApiUserObserver: Ember.observer('publicApiUser', function () {\n        const user = this.get('publicApiUser');\n        const version = this.get('application.semver');\n\n        if (user && user.id) {\n            setCustomAttribute('User Id', user.id);\n        }\n        if (user && user.organization && user.organization.id) {\n            setCustomAttribute('Organization Id', user.organization.id);\n        }\n        if (user && user.organization && user.organization.name) {\n            setCustomAttribute('Organization', user.organization.name);\n        }\n        if (version) {\n            setCustomAttribute('App Version', version);\n        }\n    }),\n\n    // Forward ESA Events from internal session to this session service\n    _setupSessionInvalidationFailed: Ember.on('init', function () {\n        const session = this.get('session');\n        if (session) {\n            session.on('sessionInvalidationFailed', this, this._forwardSessionInvalidationFailedEvent);\n        }\n    }),\n\n    _forwardSessionInvalidationFailedEvent() {\n        this.trigger('sessionInvalidationFailed', ...arguments);\n    },\n\n    _teardownSessionInvalidationFailed: Ember.on('willDestroy', function () {\n        const session = this.get('session');\n        if (session) {\n            session.off('sessionInvalidationFailed', this, this._forwardSessionInvalidationFailedEvent);\n        }\n    })\n});\n","import Ember from 'ember';\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport { getThemeList } from '../utils/theme-loader';\n\nconst { computed, inject, run, Service, Evented } = Ember;\n\nexport default Service.extend(Evented, LoggerMixin, {\n    intl: inject.service(),\n    phone: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n    permissions: inject.service(),\n    ajax: inject.service(),\n\n    _isDesktop: computed('application.hostedContext', function () {\n        const context = this.get('application.hostedContext');\n        return context && context.isHosted();\n    }),\n\n    _isDesktopUnifiedPreferences: computed('application.hostedContext', function () {\n        const context = this.get('application.hostedContext');\n        if (context) {\n            return context.isHosted() && context.supportsUnifiedPreferences();\n        }\n\n        return false;\n    }),\n\n    canShowChatPreference: computed.not('session.user.isTrustee'),\n    canShowAgentGreeting: computed.bool('session.features.ACT-1205'),\n    canShowGeneralPreference: computed.alias('_isDesktop'),\n    canShowPasswordPreference: computed('session.isAuthenticated', 'session.user.isTrustee', function () {\n        if (this.get('session.user.isTrustee')) {\n            return false;\n        }\n\n        return this.get('session.isAuthenticated');\n    }),\n\n    canShowNotificationsPreference: computed('_isDesktop', '_isDesktopUnifiedPreferences', function () {\n        if (BrowserUtils.isIE) {\n            return false;\n        }\n\n        const isDesktop = this.get('_isDesktop');\n        const isUnified = this.get('_isDesktopUnifiedPreferences');\n        return !(isDesktop && !isUnified);\n    }),\n\n    canShowVoiceMailPinPreference: computed.and('permissions.hasVoicemailAccess', 'permissions.phoneEnabled'),\n\n    canShowDirectRoutingPreference: computed.alias('directRouting.canViewOwnSettings'),\n\n    _commonPreferenceComponents: computed('_isDesktopUnifiedPreferences', function () {\n        const isUnified = this.get('_isDesktopUnifiedPreferences');\n\n        return {\n            chat: 'preferences-chat',\n            general: 'preferences-general',\n            language: 'preferences-language',\n            notifications: isUnified ? 'preferences-notifications-desktop' : 'preferences-notifications',\n            password: 'change-password',\n            pin: 'change-pin',\n            sound: 'application-preferences/preferences-sound',\n            theme: 'application-preferences/theme-picker',\n            video: 'preferences-video',\n            direct_routing: 'preferences-direct-routing',\n            agent_greeting: 'agent-greeting'\n        };\n    }),\n\n    commonPreferences: computed(\n        'intl.isoLocale',\n        'canShowChatPreference',\n        'canShowGeneralPreference',\n        'canShowNotificationsPreference',\n        'canShowPasswordPreference',\n        'canShowSoundPreference',\n        'canShowVoiceMailPinPreference',\n        '_commonPreferenceComponents',\n        'session.features.webUiDarkTheme',\n        'canShowAgentGreeting',\n        function () {\n            const intl = this.get('intl');\n            const components = this.get('_commonPreferenceComponents');\n            return [\n                {\n                    key: 'chat',\n                    name: intl.lookup('preferences.tabs.chat'),\n                    canShow: this.get('canShowChatPreference'),\n                    component: components.chat\n                },\n                {\n                    key: 'general',\n                    name: intl.lookup('preferences.tabs.general'),\n                    canShow: this.get('canShowGeneralPreference'),\n                    component: components.general\n                },\n                {\n                    key: 'language',\n                    name: intl.lookup('preferences.tabs.language'),\n                    canShow: true,\n                    component: components.language\n                },\n                {\n                    key: 'notifications',\n                    name: intl.lookup('preferences.tabs.notifications'),\n                    canShow: this.get('canShowNotificationsPreference'),\n                    component: components.notifications\n                },\n                {\n                    key: 'password',\n                    name: intl.lookup('preferences.tabs.password'),\n                    canShow: this.get('canShowPasswordPreference'),\n                    component: components.password\n                },\n                {\n                    key: 'pin',\n                    name: intl.lookup('preferences.tabs.pin'),\n                    canShow: this.get('canShowVoiceMailPinPreference'),\n                    component: components.pin\n                },\n                {\n                    key: 'sound',\n                    name: intl.lookup('preferences.tabs.sound'),\n                    canShow: true,\n                    component: components.sound\n                },\n                {\n                    key: 'theme',\n                    name: intl.lookup('preferences.tabs.theme'),\n                    canShow: getThemeList(this.get('session')).length > 1,\n                    component: components.theme\n                },\n                {\n                    key: 'video',\n                    name: intl.lookup('preferences.tabs.video'),\n                    canShow: true,\n                    component: components.video\n                },\n                {\n                    key: 'direct_routing',\n                    name: intl.lookup('preferences.tabs.direct-routing'),\n                    canShow: this.get('canShowDirectRoutingPreference'),\n                    component: components.direct_routing\n                },\n                {\n                    key: 'agent_greeting',\n                    name: intl.lookup('preferences.tabs.agent-greeting'),\n                    canShow: this.get('canShowAgentGreeting'),\n                    component: components.agent_greeting\n                }\n            ];\n        }\n    ),\n\n    commonPreferencesSortOrder: computed(function () {\n        return [\n            'notifications',\n            'general',\n            'theme',\n            'chat',\n            'password',\n            'pin',\n            'language',\n            'sound',\n            'video',\n            'direct_routing',\n            'agent_greeting'\n        ];\n    }),\n\n    customPreferences: [],\n\n    preferences: computed('commonPreferences', 'customPreferences', function () {\n        const commonPreferences = this.get('commonPreferences');\n        const customPreferences = this.get('customPreferences');\n        return [...commonPreferences, ...customPreferences];\n    }),\n\n    // <Custom Preference API>\n    addPreference(key, options) {\n        const { name, component } = options;\n        if (!(key && name && component)) {\n            throw new Error('Custom preferences require a key, name, and component name');\n        }\n        const existingPreference = this.get('preferences').find(preference => preference.key === key);\n        if (existingPreference) {\n            throw new Error(`Preference with key \"${key}\" already exists`);\n        }\n        const canShow = true; // otherwise remove the preference\n        const newPreference = { key, name, component, canShow };\n        this.set('customPreferences', this.get('customPreferences').concat(newPreference));\n    },\n\n    removePreference(key) {\n        const customPreferences = this.get('customPreferences');\n        const otherPreferences = customPreferences.filter(preference => preference.key !== key);\n        this.set('customPreferences', otherPreferences);\n    },\n    // </Custom Preference API>\n\n    // <Global Preferences API>\n    isOpen: false,\n\n    open() {\n        this.set('isOpen', true);\n    },\n\n    close() {\n        this.set('isOpen', false);\n    },\n\n    canOpenPreference(preferenceKey) {\n        const preferences = this.get('preferences');\n        const preference = preferences.find(preference => preference.key === preferenceKey);\n        return preference && preference.canShow;\n    },\n\n    openPreference(preferenceKey) {\n        return new Ember.RSVP.Promise(resolve => {\n            const preferences = this.get('preferences');\n            const preference = preferences.find(preference => preference.key === preferenceKey);\n            if (!preference) {\n                throw new Error(`\"${preference}\" is not a valid preference name`);\n            }\n            if (!preference.canShow) {\n                throw new Error(`Preference \"${preference}\" cannot be shown`);\n            }\n            this.open();\n            run.later(() => {\n                // this delay lets the listening components open first\n                this.trigger('openPreference', preferenceKey);\n                resolve();\n            }, 100);\n        });\n    },\n\n    // common preferences access\n    openChatPreference() {\n        this.openPreference('chat');\n    },\n\n    openGeneralPreference() {\n        this.openPreference('general');\n    },\n\n    openLanguagePreference() {\n        this.openPreference('language');\n    },\n\n    openNotificationsPreference() {\n        this.openPreference('notifications');\n    },\n\n    openPasswordPreference() {\n        this.openPreference('password');\n    },\n\n    openSoundPreference() {\n        this.openPreference('sound');\n    },\n    openVideoPreference() {\n        this.openPreference('video');\n    },\n\n    openVoiceMailPinPreference() {\n        this.openPreference('pin');\n    },\n    // </Global Preferences API>\n\n    /**\n     * Gets the current value for the user's send email notifications\n     * @returns sendEmailNotifications @boolean\n     */\n    async getUserVoicemailEmailNotification() {\n        const url = this.get('application').pcV2Uri(`api/v2/voicemail/me/policy`);\n        try {\n            const { sendEmailNotifications } = await this.get('ajax').ajaxGet(url, { dataType: 'json' });\n            return sendEmailNotifications;\n        } catch (err) {\n            this.get('logger').error(`services/settings: error fetching user's voicemail policy`, {\n                err\n            });\n        }\n        return false;\n    },\n    /**\n     * Sets the user's send email notification value in the voicemail policy.\n     * @param {boolean} sendEmailNotifications\n     * @returns Promise\n     */\n    async setUserVoicemailEmailNotification(sendEmailNotifications) {\n        const url = this.get('application').pcV2Uri(`api/v2/voicemail/me/policy`);\n        return this.get('ajax').patch(url, {\n            data: {\n                sendEmailNotifications\n            },\n            timeout: 5000\n        });\n    }\n});\n","define(\"connections-ui/services/sound\", [\"exports\", \"ember-purecloud-components/services/sound\"], function (_exports, _sound) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sound.default;\n    }\n  });\n});\n","/* eslint no-console: \"off\" */\n\n/**\n * Welcome to the stash-logger service. This service is responsible for logging data locally to your console as well\n * as gathering logs to send to Sumo. There are a couple rules, though.\n *\n * In order to ensure that customer data does not flow into Sumo, all logging that is intended to leave\n * a customer's machine is opt-in. We will not send any object information up to Sumo unless you wrap it\n * in a specific key.\n *\n * If you tend to log data in the usual manner:\n * [\n *  \"Bunch of descriptive information\",\n *  { ... some data in an object ... }\n * ]\n * What will be sent to Sumo will only be: \"Bunch of descriptive information\"\n *\n * If you wish to send an object of information, you need to use a specific key, \"remoteData\":\n * [\n *  \"Bunch of description information\",\n *  {\n *   remoteData: {\n *     data: \"Data\"\n *   }\n *  }\n * ]\n * The data that will be sent will be the string AND everything in the remoteData object.\n *\n * Do you need to send customer data? Really? If so, PLEASE mark it as sensitive. You do this by including that data\n * under the \"sensitive\" key. For example:\n * [\n *  \"Bunch of description information\",\n *  {\n *   remoteData: {\n *    data: \"Data\",\n *    sensitive: {\n *     data: \"Data\"\n *    }\n *   }\n *  }\n * ]\n * The sensitive data will be wrapped with GCPII[] in order to be hashed by Sumo hashing rules. Any questions? Reach\n * out to the Web UI team.\n */\n\nimport Ember from 'ember';\nimport { isAbortError, isAjaxError } from 'ember-ajax/errors';\nimport { task, timeout } from 'ember-concurrency';\nimport { LOG_LEVELS } from 'ember-purecloud-components/utils/logger';\nimport uuid from 'uuid';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport config from '../config/environment';\nimport moment from '../utils/dates';\nimport ExponentialIntervalGenerator from '../utils/exponential-interval-generator';\nimport { extractRawData } from '../utils/objects';\n\nconst DEBUG = true;\n\nconst TRUNCATED_TRACE_MESSAGE = 'TRUNCATED LOG: ';\nexport const APP_NAME = 'connections-ui-webui';\nconst LOG_INTERVAL = 2000;\nconst MAX_LOG_INTERVAL = 30000;\nconst MAX_LOG_SIZE = 14500;\nconst SERVER_LOG_LEVEL = 'warn';\nconst GLOBAL_ERROR = /Global Error Caught/;\n// strings equality regex by item (string), item.message (item is object) or JSON.stringify(item) (item is object)\n// or by matcher function\n// i.e.,\n// 'someLog' will filter 'someLog' or { message: 'someLog' }. Will not filter 'someLog with more info'.\n// /someLog.*/ will filter 'someLog', 'someLog with more info', or { message: 'someLog with info' }\n// (item) => item && item.status === 0 && item.statusText === 'error' will filter { status: \"0\", statusText: 'error' } regardless of property order\n// DO NOT USE STATEFUL REGEXES - no /g flag\nconst SILENCED_ERRORS = [\n    /TransitionAborted/,\n    /Request Cancelled/,\n    /Request cancelled/, // PCUI-132\n    /Undefined intl key/,\n    /Error encountered while ensuring trace data is clean/, // PCM-1574\n    /ResizeObserver loop limit exceeded/,\n\n    /safeScroll/,\n    /_scrollToBottom called before DOM insertion/,\n    /The ajax operation was aborted/, // PCUI-131\n    /SEARCHPANE: Search Failed:/, // PCUI-132\n    /Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node./, // https://github.com/yapplabs/ember-tether/issues/35\n    /Uncaught Error: only one instance of babel-polyfill is allowed/,\n    /Error getting timeOffRequests/, // PCUI-135\n    /Failed to fetch time off requests:/, // PCUI-135\n    /Script error\\./, // PCUI-138\n    /^TimeoutPromise.*/, // PCUI-133\n    /You do not belong to any management unit/,\n    /supervisorassistance/, // PCUI-134\n    /Request was rejected because user is not permitted to perform/, // PCUI-137\n    item => item && item.status === '0' && (item.statusText === 'error' || item.statusText === 'abort'), // PCUI-136\n    item => isAbortError(item), // PCUI-136\n    (item, all, isLocal) => all.length > 1 && all[0] === 'Failed to obtain Apps Session' && isLocal\n];\n\n// http://stackoverflow.com/questions/5515869/string-length-in-bytes-in-javascript\nconst lengthInUtf8Bytes = function (str) {\n    // Matches only the 10.. bytes that are non-initial characters in a multi-byte sequence.\n    const m = encodeURIComponent(str).match(/%[89ABab]/g);\n    return str.length + (m ? m.length : 0);\n};\n\nexport default Ember.Service.extend({\n    MAX_INTERNAL_LOG_ITEMS: 1000,\n    internalLogs: [],\n\n    logCounts: null,\n    failureCount: 0,\n\n    _originalLogger: Ember.Logger,\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n    conversation: Ember.inject.service(),\n\n    init() {\n        this._super(...arguments);\n        this.set('exponentialBackoff', new ExponentialIntervalGenerator(LOG_INTERVAL, MAX_LOG_INTERVAL));\n        this.set('logs', []);\n        this.set('logCounts', {});\n        this.set('clientSessionId', uuid.v4());\n        LOG_LEVELS.forEach(level => this.set(`logCounts.${level}`, 0));\n        this.bindLogMethods();\n        this.resetLogLimit();\n    },\n\n    loggingOptions: Ember.computed('session.org.orgPreferences.loggerOptions', function () {\n        let items = [\n            {\n                topic: 'service:webrtc',\n                serverLevel: 'info',\n                localLevel: 'debug'\n            },\n            {\n                topic: 'webrtc',\n                serverLevel: 'info',\n                localLevel: 'debug'\n            },\n            {\n                regex: 'RtcSession Log', // OPTIONAL if topic is provided.\n                propertyToMatch: 'kind', // OPTIONAL. ignored if no regex. if excluded, it will match on the logged string or the message property of the logged object(s)\n                localLevel: 'debug'\n            },\n            {\n                regex: 'webrtc',\n                localLevel: 'debug'\n            },\n            {\n                regex: /^Running\\sin\\smedia\\shelper\\smode$/,\n                serverLevel: 'info',\n                localLevel: 'info'\n            },\n            {\n                regex: /^SERVOPS-33410/,\n                serverLevel: 'debug',\n                localLevel: 'debug'\n            }\n\n            // EXAMPLE:\n            // {\n            //     topic: 'service:webrtc',    // OPTIONAL\n            //     regex: 'RECORDINGS',   // OPTIONAL if topic is provided. If adding through orgPrefs, use a simple string without the surrounding slashes.\n            //     propertyToMatch: 'message', // OPTIONAL. ignored if no regex. if excluded, it will match on the logged string or the message property of the logged object(s)\n            //     serverLevel: 'info',\n            //     localLevel: 'debug'\n            // }\n        ];\n\n        const options = this.get('session.org.orgPreferences.loggerOptions');\n        if (options && options.length) {\n            items = items.concat(options);\n        }\n\n        items.forEach(item => {\n            if (typeof item.regex === 'string') {\n                item.regex = new RegExp(item.regex);\n            }\n        });\n\n        return items;\n    }),\n\n    bindLogMethods() {\n        LOG_LEVELS.forEach(level => {\n            this[level] = this.bufferLog.bind(this, level, 'logger:general');\n        });\n    },\n\n    getOriginalLogger() {\n        return this._originalLogger;\n    },\n\n    // Scope is the object that JSON.stringify is turning into a string.\n    restrictedTypeConverter(key, item) {\n        if (item == null) {\n            return item;\n        }\n\n        if (isAjaxError(item)) {\n            const application = this.get('application');\n            return {\n                name: item.name,\n                message: item.message,\n                stack: item.stack,\n                currentRoute: application.get('currentRouteName'),\n                timeSinceLogin: moment().diff(application.get('session._timeAuthenticated'))\n            };\n        } else if (item instanceof Error) {\n            const application = this.get('application');\n            return {\n                name: item.name,\n                stack: item.stack,\n                currentRoute: application.get('currentRouteName'),\n                timeSinceLogin: moment().diff(application.get('session._timeAuthenticated'))\n            };\n        } else {\n            return item;\n        }\n    },\n\n    fullTypeConverter(key, item) {\n        if (item == null) {\n            return item;\n        }\n\n        if (item instanceof Error) {\n            const application = this.get('application');\n            return {\n                name: item.name,\n                message: item.message,\n                stack: item.stack,\n                errors: item.errors,\n                payload: item.payload,\n                currentRoute: application.get('currentRouteName'),\n                timeSinceLogin: moment().diff(application.get('session._timeAuthenticated'))\n            };\n        } else {\n            return item;\n        }\n    },\n\n    createTrace(level, topic, logItem) {\n        if (logItem === null || logItem === undefined) {\n            throw new Error('You must log a value and/or context; attempted to log null or undefined');\n        }\n\n        // try default json stringify, if it fails, log the error\n        let itemToLog = logItem;\n        try {\n            JSON.stringify(logItem);\n        } catch (err) {\n            itemToLog = err;\n        }\n\n        const type = typeof itemToLog;\n        const isError = type === 'object' && itemToLog instanceof Error;\n        if (!isError && (type === 'array' || type === 'object')) {\n            try {\n                itemToLog = this._restrictTraceData(itemToLog);\n\n                // After stripped, we want readable client logs so when they are exported\n                // by the customer, we can accurately read them\n                this._originalLogger[level].call(\n                    this._originalLogger,\n                    JSON.stringify(logItem, this.fullTypeConverter.bind(this))\n                );\n            } catch (error) {\n                this._originalLogger[level].call(this._originalLogger, 'Error parsing log item', {\n                    error,\n                    itemToLog\n                });\n                itemToLog = ['Error encountered while ensuring trace data is clean', error.message];\n            }\n        } else if (!isError) {\n            this._originalLogger[level].call(this._originalLogger, 'Log item in bad format', {\n                itemToLog\n            });\n            itemToLog = ['Log item was not in the expected data format'];\n        } else {\n            // Errors should be parsed out by the typeConverter later\n            itemToLog = { error: logItem };\n        }\n\n        const clientTime = moment().toISOString();\n        let message;\n        try {\n            message = JSON.stringify(\n                {\n                    clientTime,\n                    log: itemToLog,\n                    clientSessionId: this.get('clientSessionId')\n                },\n                this.restrictedTypeConverter.bind(this)\n            );\n        } catch (err) {\n            message = `Error serializing log data: ${err.message}`;\n            level = 'error';\n        }\n\n        return {\n            topic: `${APP_NAME}.${topic}`,\n            level: level.toUpperCase(),\n            time: clientTime,\n            message\n        };\n    },\n\n    /**\n     * Restrict log data to format that will ensure customer data is only sent when the\n     * consumer has opted-in\n     * @param {Array} itemToLog - an array with a string description as the first element and an object of data as the second\n     * @throws\n     * @returns a restricted version of itemToLog array\n     */\n    _restrictTraceData(itemToLog) {\n        const remoteDataKey = 'remoteData';\n        if (\n            typeof itemToLog === 'string' ||\n            typeof itemToLog === 'number' ||\n            (Array.isArray(itemToLog) && itemToLog.length === 0)\n        ) {\n            return itemToLog;\n        }\n        if (!Array.isArray(itemToLog) || typeof itemToLog[0] !== 'string') {\n            throw new Error('Log data was in an unexpected format');\n        }\n        try {\n            // First we remove everything except for our blessed data\n            let allowedKeys = [remoteDataKey, 'activeConversations'];\n            let [message, data, conversationIds] = itemToLog;\n\n            // Just a plain message, e.g. logger.error(\"Got an error\")\n            if (!data) {\n                return [message];\n            }\n\n            // The usual message, e.g. logger.error(\"Got an error\", { ... data ... })\n            // Filter out everything that is not under the remoteDataKey\n            let keyFilter = (path, key) => {\n                return allowedKeys.includes(key) || allowedKeys.includes(path[0]);\n            };\n\n            data = extractRawData(data, {\n                maxDepth: 5,\n                keyFilter\n            });\n\n            if (typeof conversationIds !== 'object' || Array.isArray(conversationIds)) {\n                conversationIds = {};\n            }\n\n            // Check the rest of the data, it might contain conversation ids\n            // but we filter out EVERYTHING else\n            conversationIds = extractRawData(conversationIds, {\n                maxDepth: 2,\n                keyFilter\n            });\n\n            if (data[remoteDataKey]) {\n                data[remoteDataKey] = this._augmentSensitiveData(data[remoteDataKey]);\n            }\n\n            let finalLogItem = [message, data, conversationIds].filter(elem => {\n                // Strings, arrays\n                if (Object.prototype.hasOwnProperty.call(elem, 'length')) {\n                    return elem.length > 0;\n                }\n                return Object.keys(elem).length > 0;\n            });\n\n            return finalLogItem;\n        } catch (error) {\n            throw error;\n        }\n    },\n\n    _augmentSensitiveData(remoteData) {\n        if (!remoteData) {\n            return;\n        }\n        if (!remoteData.sensitive) {\n            return remoteData;\n        }\n        let sensitive = remoteData.sensitive;\n        let wrappedSensitive;\n        if (typeof sensitive !== 'object') {\n            wrappedSensitive = `GCPII[${sensitive.toString()}]`;\n        } else {\n            wrappedSensitive = Object.keys(sensitive).reduce((data, key) => {\n                let value = { [key]: `GCPII[${sensitive[key]}]` };\n                return Object.assign(data, value);\n            }, {});\n        }\n        return Object.assign({}, remoteData, {\n            sensitive: wrappedSensitive\n        });\n    },\n\n    checkItemsAgainstOptions(logOption, level, topic, itemsToLog) {\n        const defaultAnswer = {\n            server: false,\n            local: false\n        };\n\n        if (logOption.topic && topic && logOption.topic !== topic) {\n            return defaultAnswer;\n        }\n\n        if (logOption.regex) {\n            let matches;\n            if (logOption.propertyToMatch) {\n                matches = (itemsToLog || []).some(\n                    item =>\n                        item &&\n                        typeof item[logOption.propertyToMatch] === 'string' &&\n                        item[logOption.propertyToMatch].match(logOption.regex)\n                );\n            } else {\n                matches = (itemsToLog || []).some(\n                    item =>\n                        item &&\n                        ((typeof item === 'string' && item.match(logOption.regex)) ||\n                            (typeof item.message === 'string' && item.message.match(logOption.regex)))\n                );\n            }\n\n            if (!matches) {\n                return defaultAnswer;\n            }\n        }\n\n        const itemLogIndex = LOG_LEVELS.indexOf(level.toLowerCase());\n\n        return {\n            server: logOption.serverLevel && itemLogIndex >= LOG_LEVELS.indexOf(logOption.serverLevel.toLowerCase()),\n            local: logOption.localLevel && itemLogIndex >= LOG_LEVELS.indexOf(logOption.localLevel.toLowerCase())\n        };\n    },\n\n    bufferLog(level, topic, ...itemsToLog) {\n        let logResult = { server: false, local: false };\n        const isLocal = this.get('application.runtime.local');\n\n        if (itemsToLog && itemsToLog.length > 0) {\n            for (let j = 0; j < itemsToLog.length; j++) {\n                const item = itemsToLog[j];\n                if (typeof item === 'undefined' || item === null || item === '') {\n                    if (isLocal && DEBUG) {\n                        console.debug(\n                            new Error('Local Only Error: Undefined error reported to stash logger'),\n                            itemsToLog\n                        );\n                    }\n                    return;\n                }\n\n                let checkForSilence;\n                if (typeof item === 'string') {\n                    checkForSilence = item;\n                }\n                if (!checkForSilence) {\n                    try {\n                        checkForSilence = JSON.stringify(item);\n                    } catch (err) {\n                        checkForSilence = `Error serializing log data: ${err.message}`;\n                    }\n                }\n\n                // expose global errors\n                if (GLOBAL_ERROR.test(checkForSilence)) {\n                    console.error(item);\n                    return;\n                }\n\n                if (!DEBUG && (level === 'debug' || level === 'info')) {\n                    return;\n                }\n\n                for (let i = 0; i < SILENCED_ERRORS.length; i++) {\n                    const SILENCED = SILENCED_ERRORS[i];\n                    const silencedByStringMatch = typeof SILENCED === 'string' && checkForSilence === SILENCED;\n                    const silencedByRegex = typeof SILENCED.test === 'function' && SILENCED.test(checkForSilence);\n                    let silencedByMatcher;\n                    try {\n                        silencedByMatcher = typeof SILENCED === 'function' && SILENCED(item, itemsToLog, isLocal);\n                    } catch (e) {\n                        silencedByMatcher = false;\n                    }\n                    if (silencedByStringMatch || silencedByRegex || silencedByMatcher) {\n                        if (isLocal && DEBUG) {\n                            console.debug('local-only error', itemsToLog[j]);\n                        }\n                        return logResult;\n                    }\n                }\n            }\n        }\n        const serverLogLevelIndex = LOG_LEVELS.indexOf(SERVER_LOG_LEVEL.toLowerCase());\n        const itemLogIndex = LOG_LEVELS.indexOf(level.toLowerCase());\n\n        const options = this.get('loggingOptions');\n        let logServer = itemLogIndex >= serverLogLevelIndex;\n        let logLocal = false;\n        for (let i = 0; i < options.length; i++) {\n            logResult = this.checkItemsAgainstOptions(options[i], level, topic, itemsToLog);\n\n            logServer = logServer || logResult.server;\n            logLocal = logLocal || logResult.local;\n\n            if (logServer && logLocal) {\n                break;\n            }\n        }\n\n        let skipSumoSend;\n\n        if (level === 'error') {\n            skipSumoSend = false;\n            const activeConversations = this.get('conversation.activeConversations') || [];\n            itemsToLog.push({ activeConversations: activeConversations.map(c => c.get('id')) });\n        }\n\n        if (logServer && !skipSumoSend) {\n            const trace = this.createTrace.call(this, level, topic, itemsToLog);\n            this.get('logs').pushObject(trace);\n        }\n\n        if (logLocal || level.toLowerCase() === 'error') {\n            this.get('internalLogs').pushObject({ topic, level, itemsToLog: itemsToLog, time: moment().toISOString() });\n\n            if (this.get('internalLogs.length') > this.MAX_INTERNAL_LOG_ITEMS) {\n                this.get('internalLogs').shiftObject();\n            }\n        }\n\n        this.get('logCounts')[level]++;\n        this._originalLogger[level].apply(this._originalLogger, itemsToLog);\n\n        return { local: logLocal, server: logServer };\n    },\n\n    decreaseLogLimit(currentLimit) {\n        this.maxTracesByteLength = currentLimit - 500;\n    },\n\n    resetLogLimit() {\n        this.maxTracesByteLength = MAX_LOG_SIZE;\n    },\n\n    getTracesToLog(logs) {\n        let toLog = [];\n        let totalLogSize = 0;\n        for (let i = 0; i < logs.length; i++) {\n            const log = logs[i];\n            let logSize = lengthInUtf8Bytes(JSON.stringify(log));\n            if (toLog.length === 0 && logSize > this.maxTracesByteLength) {\n                // single log is too big to log\n                // slice it to 90% of the max (allow room for json chars)\n                log.message = (TRUNCATED_TRACE_MESSAGE + log.message).slice(\n                    0,\n                    Math.floor(0.9 * (this.maxTracesByteLength - TRUNCATED_TRACE_MESSAGE.length))\n                );\n                logSize = lengthInUtf8Bytes(JSON.stringify(log));\n            }\n            if (totalLogSize + logSize < this.maxTracesByteLength) {\n                toLog.push(log);\n                totalLogSize += logSize;\n            } else {\n                break; // break out, log the rest on next run\n            }\n        }\n        return toLog;\n    },\n\n    saveLogs: Ember.observer('logs.[]', 'backOffTask.isRunning', 'session.isAuthenticated', function () {\n        this.get('_saveLogsTask').perform();\n    }),\n\n    _saveLogsTask: task(function* () {\n        const logs = this.get('logs');\n        if (logs.length <= 0 || this.get('backOffTask.isRunning') || !this.get('session.isAuthenticated')) {\n            return;\n        }\n        const toSend = this.getTracesToLog.call(this, logs);\n        logs.removeObjects(toSend);\n        yield timeout(LOG_INTERVAL);\n        this.sendLogTraces(toSend)\n            .then(() => {\n                this._resetLogsOnSuccessfulSave();\n            })\n            .catch(error => {\n                logs.addObjects(toSend);\n                if (error.status === 413) {\n                    this.decreaseLogLimit(toSend.length);\n                    this._originalLogger.error(\n                        `# of logs to send limited due to server size limit. Last sent size of <= ${this.maxTracesByteLength}.`\n                    );\n                } else if (error.status === 400) {\n                    this._originalLogger.error('Failed to log traces', error);\n                    if (this.get('failureCount') === 0) {\n                        logs.removeObjects(toSend);\n                        this.incrementProperty('failureCount');\n                    } else {\n                        logs.clear();\n                    }\n                } else {\n                    this._originalLogger.error('Failed to log traces', error);\n                    this.get('exponentialBackoff').fail();\n\n                    // ACE-1903: Dump logs if we fail to send on expo. backup to avoid them\n                    // potentially backing up continuously.\n                    logs.clear();\n                }\n            })\n            .finally(() => {\n                this.get('backOffTask').perform();\n            });\n    })\n        .keepLatest()\n        .maxConcurrency(1), // comment below\n    // if this gets called more than once while its currently executing,\n    // it will cancel earlier calls that haven't started yet and just keep the latest\n\n    backOffTask: task(function* () {\n        yield timeout(this.get('exponentialBackoff').getInterval());\n    }),\n\n    immediateSaveLogs() {\n        const logs = this.get('logs');\n        const toSend = this.getTracesToLog.call(this, logs);\n        return this.sendLogTraces(toSend)\n            .then(() => {\n                logs.removeObjects(toSend);\n\n                this._resetLogsOnSuccessfulSave();\n            })\n            .catch(error => {\n                // If the immediate send doesn't work, we do not remove the logs and they will\n                // be processed by the usual task\n                this._originalLogger.warn('STASH-LOGGER: immediateSaveLogs error', {\n                    error\n                });\n            });\n    },\n\n    sendLogTraces(traces) {\n        if (isTesting) return Ember.RSVP.resolve();\n\n        // this._originalLogger.log('STASH-LOGGER: sendLogTraces', traces, this);\n        const data = JSON.stringify({\n            app: {\n                appId: 'connections-ui-webui',\n                appVersion: config.APP.semver\n            },\n            traces: traces\n        });\n\n        //Do not log traces when running locally\n        if (this.get('application.runtime.local')) {\n            return Ember.RSVP.resolve();\n        }\n\n        const request = {\n            url: this.get('session.application').pcV2Uri('api/v2/diagnostics/trace'),\n            type: 'post',\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'text',\n            data,\n            cache: false,\n            context: this\n        };\n        return Ember.RSVP.cast($.ajax(request), 'applicationService#sendLogTraces');\n    },\n\n    _resetLogsOnSuccessfulSave() {\n        this.set('failureCount', 0);\n        this.resetLogLimit();\n        this.get('exponentialBackoff').reset();\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport ApplicationAdapter from '../adapters/application';\nimport PromiseArray from '../utils/promise-array';\n\nimport GroupStoreMixin from '../group/store-mixin';\nimport SearchStoreMixin from '../search/store-mixin';\n\nimport { FL } from '../utils/entity-fields';\n\n/* Batch entity ids into lists of 50. */\nexport function batchEntityIds(ids, size = 50) {\n    ids = _.clone(ids);\n\n    const guids = ids.filter(id => id.indexOf('@') === -1);\n    const jids = ids.filter(id => id.indexOf('@') > -1);\n\n    var batches = [];\n\n    while (guids.length > 0) {\n        batches.push(guids.splice(0, size));\n    }\n    while (jids.length > 0) {\n        batches.push(jids.splice(0, size));\n    }\n\n    return batches;\n}\n\nfunction updateGroup(group, data) {\n    const updateKeys = ['contactInfo', 'general', 'privacy'];\n    if (data.attributes) {\n        updateKeys.forEach(key => {\n            if (data.attributes[key] !== undefined) {\n                group.set(key, data.attributes[key], { overwrite: true });\n            }\n        });\n    }\n}\n\nvar ApplicationStore = DS.Store.extend(GroupStoreMixin, SearchStoreMixin, {\n    session: Ember.inject.service(),\n\n    adapter: ApplicationAdapter,\n\n    applicationAdapter() {\n        return Ember.getOwner(this).lookup('adapter:application');\n    },\n\n    findQuery(type, query) {\n        var store = this;\n        var promiseLabel = 'ApplicationStore#_findQuery for: ' + type;\n        var adapter = this.adapterFor(type);\n\n        Ember.assert('You tried to load a query but you have no adapter (for ' + type + ')', adapter);\n        Ember.assert(\n            'You tried to load a query but your adapter does not implement `findQuery`',\n            typeof adapter.findQuery === 'function'\n        );\n\n        var result = adapter.query(store, type, query);\n\n        var promise = Ember.RSVP.Promise.cast(result, promiseLabel).then(\n            function (payload) {\n                var collection = [];\n                if (payload.res) {\n                    _.forEach(payload.res, function (entity) {\n                        const id = entity.guid || entity._id;\n                        if (id) {\n                            entity.id = id;\n                            collection.push(store.push(type, entity, true));\n                        }\n                    });\n                } else {\n                    // if no payload.res then we are not dealing with the application adapter,\n                    // but we still want to keep the result in case we are using a fixture adapter\n                    _.forEach(payload, function (item) {\n                        collection.push(store.push(type, item, true));\n                    });\n                }\n                return {\n                    collection: collection,\n                    payload: payload\n                };\n            },\n            null,\n            'ApplicationStore#_findQuery: Extract payload from findQuery'\n        );\n\n        return PromiseArray.create({\n            promise: promise\n        });\n    },\n\n    findMultiEntity(params, requestType) {\n        let store = this;\n        let promiseLabel = 'ApplicationStore#findMultiEntity';\n        let adapter = this.applicationAdapter();\n        let serializer = this.serializerFor('application');\n\n        let result = adapter.findMultiEntity(store, params, requestType);\n\n        let promise = Ember.RSVP.Promise.cast(result, promiseLabel).then(\n            payload => {\n                payload = serializer.normalizeArrayResponse(store, null, payload, null, requestType || 'query');\n                if (!payload.data && payload.included) {\n                    payload.data = payload.included;\n                    payload.included = [];\n                }\n\n                let records = store.push(payload);\n                Ember.set(records, 'meta', payload.meta);\n                return records;\n            },\n            null,\n            'ApplicationStore#findMultiEntity: Extract payload from multi-entity search'\n        );\n\n        return DS.PromiseArray.create({\n            promise: promise,\n            meta: Ember.computed.reads('content.meta')\n        });\n    },\n\n    findFavorites() {\n        return this.findFavoritesPublicApiV2();\n    },\n\n    findFavoritesPublicApiV2() {\n        const promiseLabel = 'Store: Application#findFavoritesPublicApiV2';\n        const adapter = this.adapterFor('application');\n        const result = adapter.findFavorites(this);\n        const promise = Ember.RSVP.Promise.resolve(result, promiseLabel).then(res => {\n            const promises = [];\n            const personResult = res.filter(item => item.entityType === 'person');\n            if (personResult.length) {\n                promises.push(this.findMany('person', Ember.A(personResult).mapBy('entityId'), FL['person']));\n            }\n            const groupResult = res.filter(item => item.entityType === 'group');\n            if (groupResult.length) {\n                promises.push(this.findMany('group', Ember.A(groupResult).mapBy('entityId'), FL['group']));\n            }\n            if (promises.length) {\n                return Ember.RSVP.Promise.all(promises).then(function (favorites) {\n                    return {\n                        payload: res,\n                        collection: favorites.flat()\n                    };\n                });\n            } else {\n                return {\n                    payload: res,\n                    collection: []\n                };\n            }\n        });\n\n        return PromiseArray.create({\n            promise: promise\n        });\n    },\n\n    forwardVoicemail(voicemail, recipient, type) {\n        const adapter = this.adapterFor(voicemail.type);\n        return adapter.forwardVoicemail(voicemail.id, recipient.get('guid'), type);\n    },\n\n    findSuperiors(type, id, params) {\n        const store = this;\n        const modelClass = this.modelFor(type);\n        const adapter = this.adapterFor(type);\n        const serializer = this.serializerFor(type);\n        const promise = Ember.RSVP.cast(adapter.findSuperiors(type, id, params)).then(payload => {\n            payload = serializer.normalizeArrayResponse(store, modelClass, payload, null, 'findMany');\n            const records = store.push(payload);\n            return records || [];\n        });\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    },\n\n    findDirectReports(type, id, params) {\n        const store = this;\n        const modelClass = this.modelFor(type);\n        const adapter = this.adapterFor(type);\n        const serializer = this.serializerFor(type);\n        return new Ember.RSVP.Promise(resolve => {\n            adapter.findDirectReports(type, id, params).then(payload => {\n                payload = serializer.normalizeArrayResponse(store, modelClass, payload, null, 'findMany');\n                const records = store.push(payload);\n                resolve(records);\n            });\n        });\n    },\n\n    findLatestCalls(type, ids) {\n        return this.query(type, {\n            latestCalls: true,\n            ids: ids\n        });\n    },\n\n    findMany(type, ids, params) {\n        if (Array.isArray(type)) {\n            return this._super(...arguments);\n        }\n\n        const store = this;\n        const adapter = this.adapterFor(type);\n        const serializer = this.serializerFor(type);\n        const modelClass = this.modelFor(type);\n        const batches = batchEntityIds(ids, 25);\n        const batchLimit = 3;\n\n        if (type === 'person' && this.get('session.features.enableUIAjaxRetryHeader')) {\n            return new Ember.RSVP.Promise((resolve, reject) => {\n                let promises = batches.map(batch => {\n                    return adapter.findMany(store, modelClass, batch, params).then(payload => {\n                        payload = serializer.normalizeArrayResponse(store, modelClass, payload, null, 'findMany');\n                        const records = store.push(payload);\n                        return records;\n                    });\n                });\n                Ember.RSVP.allSettled(promises).then(results => {\n                    let successfulRequests = results.filter(r => r.state === 'fulfilled').map(r => r.value);\n                    let failedRequests = results.filter(r => r.state === 'rejected').map(r => r.value);\n                    if (failedRequests.length > 0) {\n                        reject('store:application#findMany request failed:', {\n                            failedRequests\n                        });\n                        return;\n                    }\n                    resolve(_.flatten(successfulRequests));\n                });\n            });\n        }\n        return new Ember.RSVP.Promise((resolve, reject) => {\n            window.async.mapLimit(\n                batches,\n                batchLimit,\n                function (batch, callback) {\n                    Ember.run.join(() => {\n                        adapter\n                            .findMany(store, modelClass, batch, params)\n                            .then(function (payload) {\n                                payload = serializer.normalizeArrayResponse(\n                                    store,\n                                    modelClass,\n                                    payload,\n                                    null,\n                                    'findMany'\n                                );\n                                const records = store.push(payload);\n                                callback(null, records);\n                            })\n                            .catch(function (err) {\n                                callback(err);\n                            });\n                    });\n                },\n                function (err, bulkResults) {\n                    Ember.run.join(() => {\n                        if (err) {\n                            return reject('store:application#findMany(): async.mapLimit failed' + err);\n                        }\n                        resolve(_.flatten(bulkResults));\n                    });\n                }\n            );\n        }, 'store:application#findMany(): async.mapLimit');\n    },\n\n    /**\n     * Overrides adapterFor to support type being passed into 'find' as a string.\n     */\n    adapterFor(type) {\n        if (type.modelName) {\n            return this._super(type.modelName);\n        }\n        return this._super(type);\n    },\n\n    didSaveRecord(internalModel, data) {\n        // The api returns data instead of an empty object, so we do not want to update\n        // our deleted record, otherwise an error is thrown\n        let recordInfo = data;\n        if (data && data.data) {\n            recordInfo = data.data;\n        }\n\n        if (!internalModel.currentState.isDeleted && recordInfo && recordInfo.id) {\n            if (internalModel.currentState.isSaving && recordInfo.attributes.version) {\n                const record = internalModel.record || internalModel.getRecord();\n\n                if (record) {\n                    record.set('version', recordInfo.attributes.version);\n\n                    if (record.get('type') === 'group') {\n                        updateGroup(record, recordInfo);\n                    }\n                }\n            }\n        }\n\n        return this._super(internalModel, data);\n    }\n});\n\nexport default ApplicationStore;\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { Service } = Ember;\n\nconst StreamingService = Service.extend(LoggerMixin, {\n    connection: {},\n    connected: false,\n    connectedV2: false,\n\n    connect() {\n        return this.get('connectionPromise') || Ember.RSVP.resolve();\n    },\n\n    subscribeToConnection() {},\n\n    setStatus() {\n        return Ember.RSVP.reject(new Error('Entity is required'));\n    },\n\n    setRoomInactive() {},\n\n    inviteToRoom() {},\n\n    setupConnection() {\n        if (this.get('connectionPromise')) {\n            return this.get('connectionPromise');\n        }\n\n        const connectionPromise = Ember.RSVP.resolve();\n        this.set('connectionPromise', connectionPromise);\n        return connectionPromise;\n    }\n});\n\nexport default StreamingService;\n","define(\"connections-ui/services/text-measurer\", [\"exports\", \"ember-text-measurer/services/text-measurer\"], function (_exports, _textMeasurer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _textMeasurer.default;\n    }\n  });\n});\n","define(\"connections-ui/services/user-activity\", [\"exports\", \"ember-user-activity/services/user-activity\"], function (_exports, _userActivity) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _userActivity.default;\n    }\n  });\n});\n","define(\"connections-ui/services/user-idle\", [\"exports\", \"ember-user-activity/services/user-idle\"], function (_exports, _userIdle) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _userIdle.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nvar set = Ember.set;\n\nexport default Ember.Service.extend({\n  init: function() {\n    set(this, 'cache', {});\n  }\n});\n","define(\"connections-ui/services/vendor-implementations/jabra-chrome\", [\"exports\", \"ember-softphone-integration/services/vendor-implementations/jabra-chrome\"], function (_exports, _jabraChrome) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _jabraChrome.default;\n    }\n  });\n});\n","define(\"connections-ui/services/vendor-implementations/jabra-native\", [\"exports\", \"ember-softphone-integration/services/vendor-implementations/jabra-native\"], function (_exports, _jabraNative) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _jabraNative.default;\n    }\n  });\n});\n","define(\"connections-ui/services/vendor-implementations/plantronics\", [\"exports\", \"ember-softphone-integration/services/vendor-implementations/plantronics\"], function (_exports, _plantronics) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _plantronics.default;\n    }\n  });\n});\n","define(\"connections-ui/services/vendor-implementations/sennheiser\", [\"exports\", \"ember-softphone-integration/services/vendor-implementations/sennheiser\"], function (_exports, _sennheiser) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sennheiser.default;\n    }\n  });\n  Object.defineProperty(_exports, \"eventTypes\", {\n    enumerable: true,\n    get: function get() {\n      return _sennheiser.eventTypes;\n    }\n  });\n  Object.defineProperty(_exports, \"events\", {\n    enumerable: true,\n    get: function get() {\n      return _sennheiser.events;\n    }\n  });\n});\n","import UserIdleService from 'ember-user-activity/services/user-activity';\n\nexport default UserIdleService.extend({\n    IDLE_TIMEOUT: 3000, // 3 seconds\n    activeEvents: [] // no listeners by default\n});\n","// app/services/user-idle.js\nimport UserIdleService from 'ember-user-activity/services/user-idle';\nimport Ember from 'ember';\n\nexport default UserIdleService.extend({\n    IDLE_TIMEOUT: 3000, // 3 second\n\n    userActivity: Ember.inject.service('videoActivity'),\n\n    setListening(value) {\n        if (value) {\n            this.get('userActivity').enableEvent('mousemove');\n        } else {\n            this.get('userActivity').disableEvent('mousemove');\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst { computed, observer } = Ember;\n\nimport { Promise } from 'rsvp';\nimport LoggerMixin from '../mixins/logger';\nimport Evented from '@ember/object/evented';\n\nimport Service, { inject } from '@ember/service';\nimport {\n    ApplicationService,\n    IntlService,\n    PhoneService,\n    SessionService,\n    StashLoggerService\n} from '@connections-ui/services';\nimport { AjaxServiceClass } from 'ember-ajax/services/ajax';\nimport { WebrtcSettingsService } from './webrtc-settings';\nimport {\n    IExtendedMediaSession,\n    ISdkMediaState,\n    IPendingSession,\n    IStation,\n    ISdkConversationUpdateEvent,\n    IStartSoftphoneSessionParams,\n    SessionTypes,\n    IEndSessionRequest,\n    ISessionMuteRequest,\n    IConversationHeldRequest,\n    GenesysCloudWebrtcSdk,\n    IPendingSessionActionParams\n} from 'genesys-cloud-webrtc-sdk';\nimport { ExpandedDeviceConnectionStatus } from 'genesys-cloud-webrtc-sdk/dist/es/headsets/headset-types';\nimport { IWebrtcSettings } from '../types/webrtc-settings.type';\nimport { APP_NAME } from './stash-logger';\nimport config from '../config/environment';\nimport ComputedProperty from '@ember/object/computed';\nimport EmberObject from '@ember/object';\nimport { addPageAction } from '../utils/newrelic';\n\nexport interface MediaDevices {\n    camera?: { deviceId: string };\n    microphone?: { deviceId: string };\n    outputDevice?: { deviceId: string };\n}\n\nexport type WebrtcEvents = {\n    deviceAnsweredCall: undefined;\n    deviceEndedCall: undefined;\n    deviceMuteStatusChanged: boolean;\n    deviceRejectedCall: string; // conversationId\n    autoAnswer: string; // conversationId\n    mediaStateChange: ISdkMediaState;\n};\n\nexport interface BasicConversationLegacy extends EmberObject {\n    id: string;\n    shouldAutoProceedWebrtc: boolean;\n    acceptedByClient: boolean;\n    isOutbound: boolean;\n    participants: [\n        {\n            bargedParticipantId?: string;\n            monitoredParticipantId?: string;\n            coachedParticipantId?: string;\n            userId: string;\n        }\n    ];\n}\n\nexport interface IPendingSessionEmber extends IPendingSession, EmberObject {}\n\nexport interface WebrtcSdkService extends EmberObject {\n    // mimicks ember evented stuff, but with types\n    on<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    on(name: string, method: (...args: any[]) => void): this;\n    one<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    one(name: string, method: (...args: any[]) => void): this;\n    trigger<K extends keyof WebrtcEvents>(name: K, args: WebrtcEvents[K]): any;\n    off<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    off(name: string, method: (...args: any[]) => void): this;\n\n    session: SessionService;\n    application: ApplicationService;\n    phone: PhoneService;\n    webrtcSettings: WebrtcSettingsService;\n    //    screenMedia: ScreenMediaService;\n    ajax: AjaxServiceClass;\n    intl: IntlService;\n\n    logger: StashLoggerService;\n    sdk: GenesysCloudWebrtcSdk;\n\n    initSdk(): Promise<void>;\n    initService(): Promise<void>;\n\n    pendingSessions: Ember.MutableArray<IPendingSessionEmber>;\n    station: IStation;\n    headsetState: ExpandedDeviceConnectionStatus;\n    mediaState: ISdkMediaState;\n    showPermissionsModal: boolean;\n    previousAutoAnswerProps: {\n        pendingSessions: { id: string; sessionType: SessionTypes }[];\n        conversationsToAutoAnswer: { id: string }[];\n    };\n    lastConversationUpdate: ISdkConversationUpdateEvent;\n    userId: ComputedProperty<string>;\n    hasActiveSoftphoneConversation: boolean;\n    hasActiveSoftphoneSession: boolean;\n    _initializingSdk: boolean;\n    _instrumentSdkUsage(sdkFunction: string): void;\n    isPersistentConnection: ComputedProperty<boolean>;\n    useSdk: ComputedProperty<boolean>;\n    useHeadsets: ComputedProperty<boolean>;\n    settingsPromise: ComputedProperty<IWebrtcSettings>;\n\n    /**\n     *\n     * PUBLIC FUNCTIONS\n     *\n     */\n    startSoftphoneSession(startParams: IStartSoftphoneSessionParams): Promise<{ id: string; selfUri: string }>;\n    setDevices(devices: MediaDevices): void;\n    setCallVolume(volume: number): void;\n    ensureVideoPermissions(): Promise<void>;\n    ensureAudioPermissions(): Promise<void>;\n    acceptPendingSession(params: { conversationId: string; sessionType: SessionTypes }): Promise<void>;\n    rejectPendingSession(params: { conversationId: string; sessionType: SessionTypes }): Promise<void>;\n    findRemainingSessionsBasedOnParams(\n        conversationId: string,\n        sessionType?: SessionTypes\n    ): Ember.MutableArray<IPendingSessionEmber>;\n    endSession(endSessionParams: IEndSessionRequest): Promise<void>;\n    setMute(muteOptions: ISessionMuteRequest): Promise<void>;\n    setHold(heldOptions: IConversationHeldRequest): Promise<void>;\n    endAllSoftphoneSessions(): void;\n    getAllActiveSessions(): IExtendedMediaSession[];\n    _shouldIgnoreSoftphone(): boolean;\n}\n\nexport default Service.extend(LoggerMixin, Evented, {\n    session: inject('session'),\n    application: inject('application'),\n    phone: inject('phone'),\n    webrtcSettings: inject('webrtcSettings'),\n    screenMedia: inject('screenMedia'),\n    ajax: inject('ajax'),\n    intl: inject('intl'),\n\n    init(this: WebrtcSdkService) {\n        (this as any)._super(...arguments);\n\n        this.set('pendingSessions', Ember.A());\n        this.set('headsetState', 'noVendor');\n        this.set('showPermissionsModal', false);\n        this.initService();\n    },\n\n    userId: computed.reads('session.person.id'),\n\n    isPersistentConnection: computed.reads('station.webRtcPersistentEnabled'),\n\n    useSdk: computed('sdk', function (this: WebrtcSdkService) {\n        return !this._shouldIgnoreSoftphone();\n    }),\n\n    phoneIncomingConversations: computed.reads('phone.incomingConversations'),\n    settingsPromise: computed.readOnly('webrtcSettings.userSettingsPromise'),\n\n    // I know I said no observables, but I'm making an exception here\n    initService: observer(\n        'session.accessToken',\n        'session.features.AGORA-319_webrtc-sdk-dependency-removal',\n        function (this: WebrtcSdkService) {\n            const isWebRtcSdkDisabled = this.get('session.features.AGORA-319_webrtc-sdk-dependency-removal' as any);\n            const isWebRtcSdkDisabledDFetched =\n                isWebRtcSdkDisabled !== null && typeof isWebRtcSdkDisabled !== 'undefined';\n            if (\n                this.get('session.accessToken' as any) &&\n                !this.get('_initializingSdk') &&\n                !this.get('sdk') &&\n                isWebRtcSdkDisabledDFetched\n            ) {\n                if (isWebRtcSdkDisabled) {\n                    this.logger.debug('webrtc sdk is disabled');\n                    return;\n                }\n                this.set('_initializingSdk', true);\n                this.logger.debug('initializing the webrtc sdk');\n                this.initSdk();\n            }\n        }\n    ),\n\n    _shouldIgnoreSoftphone() {\n        const disableSoftphone = 'disableSoftphone=true';\n        const urlSearch = window.location.search;\n        const urlHash = window.location.hash;\n        const disableParam = urlHash.includes(disableSoftphone) || urlSearch.includes(disableSoftphone);\n        // If embedded (disableSoftphone=true), we want to disable softphone and log.\n        if (disableParam) {\n            this._instrumentSdkUsage('_shouldIgnoreSoftphone_true');\n            this.logger.debug('disableSoftphone=true, ignoring softphone event.');\n            return true;\n        }\n\n        return false;\n    },\n\n    _instrumentSdkUsage(sdkFunction: string) {\n        const pageActionName = `used-webrtc-sdk-${sdkFunction}`;\n        addPageAction(pageActionName);\n    },\n\n    async initSdk(this: WebrtcSdkService) {\n        let allowedSessionTypes: SessionTypes[] = [];\n        let jidResource: string | undefined;\n        const sdk = new GenesysCloudWebrtcSdk({\n            accessToken: this.get('session.accessToken' as any),\n            environment: this.get('application').get('runtime').publicDomainName,\n            allowedSessionTypes,\n            jidResource,\n            useHeadsets: false,\n            originAppName: APP_NAME + '-sdk',\n            originAppVersion: config.APP.semver as string,\n            originAppId: this.get('stashLogger.clientSessionId' as any),\n            disableHeadsetControlsOrchestration: true,\n            customHeaders: {\n                'Genesys-App': 'connections-ui-webui'\n            }\n        });\n        await sdk.initialize();\n\n        this.set('sdk', sdk);\n    },\n\n    /**\n     *\n     * PUBLIC FUNCTIONS\n     *\n     */\n    startSoftphoneSession(this: WebrtcSdkService, startParams: IStartSoftphoneSessionParams) {\n        this._instrumentSdkUsage('startSoftphoneSession');\n        return this.get('sdk').startSoftphoneSession(startParams);\n    },\n\n    setDevices(this: WebrtcSdkService, devices: MediaDevices) {\n        this._instrumentSdkUsage('setDevices');\n        const sdk = this.get('sdk');\n        sdk.updateDefaultDevices({\n            videoDeviceId: devices.camera && devices.camera.deviceId,\n            audioDeviceId: devices.microphone && devices.microphone.deviceId,\n            outputDeviceId: devices.outputDevice && devices.outputDevice.deviceId,\n            updateActiveSessions: true\n        });\n    },\n\n    setCallVolume(this: WebrtcSdkService, volume: number) {\n        this._instrumentSdkUsage('setCallVolume');\n        const sdk = this.get('sdk');\n        // Only allow call volume updates after we're sure the SDK is initialized.\n        if (!sdk) {\n            return;\n        }\n        sdk.updateAudioVolume(volume);\n    },\n\n    ensureVideoPermissions(this: WebrtcSdkService) {\n        this._instrumentSdkUsage('ensureVideoPermissions');\n        if (this.get('mediaState.hasCameraPermissions' as any)) {\n            return Ember.RSVP.resolve();\n        }\n\n        return this.get('sdk').media.requestMediaPermissions('video');\n    },\n\n    ensureAudioPermissions(this: WebrtcSdkService) {\n        this._instrumentSdkUsage('ensureAudioPermissions');\n        if (this.get('mediaState.hasMicPermissions' as any)) {\n            return Ember.RSVP.resolve();\n        }\n\n        return this.get('sdk').media.requestMediaPermissions('audio');\n    },\n\n    acceptPendingSession(this: WebrtcSdkService, params: IPendingSessionActionParams) {\n        this._instrumentSdkUsage('acceptPendingSession');\n        if (!params.conversationId) {\n            this.logger.error(new Error('Must use conversationId to accept session'));\n            return;\n        }\n\n        this.set('pendingSessions', this.findRemainingSessionsBasedOnParams(params.conversationId, params.sessionType));\n        this.logger.info('telling sdk to accept pending session', {\n            conversationId: params.conversationId,\n            sessionType: params.sessionType\n        });\n        return this.get('sdk').acceptPendingSession(params);\n    },\n\n    rejectPendingSession(this: WebrtcSdkService, params: IPendingSessionActionParams) {\n        this._instrumentSdkUsage('rejectPendingSession');\n        if (!params.conversationId) {\n            this.logger.error(new Error('Must use conversationId to reject session'), {});\n            return;\n        }\n\n        this.set('pendingSessions', this.findRemainingSessionsBasedOnParams(params.conversationId, params.sessionType));\n\n        return this.get('sdk').rejectPendingSession(params);\n    },\n\n    findRemainingSessionsBasedOnParams(this: WebrtcSdkService, conversationId: string, sessionType?: SessionTypes) {\n        this._instrumentSdkUsage('findRemainingSessionsBasedOnParams');\n        return this.get('pendingSessions').filter(session => {\n            let matchesRequestedSessionType = true;\n            if (sessionType) {\n                matchesRequestedSessionType = sessionType === session.sessionType;\n            }\n\n            return matchesRequestedSessionType && session.conversationId !== conversationId;\n        }) as unknown as Ember.MutableArray<IPendingSessionEmber>;\n    },\n\n    endSession(this: WebrtcSdkService, endSessionParams: IEndSessionRequest) {\n        this._instrumentSdkUsage('endSession');\n        return this.get('sdk').endSession(endSessionParams);\n    },\n\n    setMute(this: WebrtcSdkService, muteOptions: ISessionMuteRequest) {\n        this._instrumentSdkUsage('setMute');\n        return this.get('sdk').setAudioMute(muteOptions);\n    },\n\n    setHold(this: WebrtcSdkService, heldOptions: IConversationHeldRequest) {\n        this._instrumentSdkUsage('setHold');\n        return this.get('sdk').setConversationHeld(heldOptions);\n    },\n\n    endAllSoftphoneSessions(this: WebrtcSdkService) {\n        this._instrumentSdkUsage('endAllSoftphoneSessions');\n        const sdk = this.get('sdk');\n        const sessions = sdk.sessionManager\n            .getAllActiveSessions()\n            .filter(session => session.sessionType === SessionTypes.softphone);\n        sessions.forEach(session => sdk.forceTerminateSession(session.id));\n    },\n\n    getAllActiveSessions(this: WebrtcSdkService) {\n        this._instrumentSdkUsage('getAllActiveSessions');\n        if (this.get('useSdk')) {\n            return this.get('sdk.sessionManager' as any).getAllActiveSessions();\n        }\n\n        return [];\n    }\n});\n\ndeclare module '@ember/service' {\n    interface Registry {\n        webrtcSdk: WebrtcSdkService;\n        'webrtc-sdk': WebrtcSdkService;\n    }\n}\n","import Ember from 'ember';\n\nimport Evented from '@ember/object/evented';\nimport { Promise, resolve } from 'rsvp';\nimport LoggerMixin from '../mixins/logger';\n\nimport { computed } from '@ember/object';\nimport Service, { inject } from '@ember/service';\nimport {\n    IntlService,\n    NotificationService,\n    PreferencesService,\n    SessionService,\n    StashLoggerService,\n    ApplicationService\n} from '@connections-ui/services';\nimport { AjaxServiceClass } from 'ember-ajax/services/ajax';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport { IDirectorySettings, IGeneralSettings, IWebrtcSettings } from '../types/webrtc-settings.type';\n\nconst SETTINGS_PATH = 'api/v2/settings/webrtc/users';\n\nexport type SettingsEvents = {\n    sdkSettingsUpdate: IWebrtcSettings;\n};\n\nexport const defaultGeneralSettings: IGeneralSettings = {\n    ringtoneSelection: 'phone',\n    advancedMicSettings: {\n        autoGain: true,\n        echoCancellation: true,\n        noiseSuppression: true\n    }\n};\n\nexport const defaultDirectorySettings: IDirectorySettings = {\n    alwaysPopoutVideo: false,\n    selectedProfile: '',\n    profiles: [],\n    defaultProfileId: ''\n};\n\nexport interface WebrtcSettingsService {\n    // mimicks ember evented stuff, but with types\n    on<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    on(name: string, method: (...args: any[]) => void): this;\n    one<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    one(name: string, method: (...args: any[]) => void): this;\n    trigger<K extends keyof SettingsEvents>(name: K, args: SettingsEvents[K]): any;\n    off<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    off(name: string, method: (...args: any[]) => void): this;\n\n    get<K extends keyof WebrtcSettingsService>(name: K | string): WebrtcSettingsService[K];\n    set<K extends keyof WebrtcSettingsService>(\n        name: K | string,\n        value: WebrtcSettingsService[K]\n    ): WebrtcSettingsService[K];\n    removeObserver(depName: string, target: any, handler: Function): void;\n    addObserver(depName: string, target: any, handler: Function): void;\n\n    ajax: AjaxServiceClass;\n    preferences: PreferencesService;\n    session: SessionService;\n    logger: StashLoggerService;\n    notification: NotificationService;\n    intl: IntlService;\n    application: ApplicationService;\n\n    _ready: Promise<any>;\n    settings: IWebrtcSettings | null;\n    failedSettingsFetch: boolean;\n    reallyWaitForToken?: boolean;\n    _fetchSettingsPromise: Promise<IWebrtcSettings> | null;\n    _updatePromise: Promise<any> | null;\n\n    _super(...args: any[]): void;\n    _handleSettingsChanged(settings: IWebrtcSettings): void;\n    _waitForAccessToken(): Promise<any>;\n    _fetchSettings(): Promise<IWebrtcSettings>;\n    _checkAndFixSettings(settings: IWebrtcSettings): boolean;\n    _updateSettings(settings: IWebrtcSettings): void;\n\n    getSettings(forceRefresh?: boolean, retryOnFail?: boolean): Promise<IWebrtcSettings>;\n    updateSettings(settings: IWebrtcSettings): Promise<void>;\n    updateSetting<K extends keyof IWebrtcSettings>(settingPath: K | string, value: IWebrtcSettings[K]): Promise<void>;\n}\n\nexport default Service.extend(Evented, LoggerMixin, {\n    preferences: inject('preferences'),\n    session: inject('session'),\n    ajax: inject('ajax'),\n    notification: inject('notification'),\n    intl: inject('intl'),\n    application: inject('application'),\n\n    error: false,\n    syncEnabled: false,\n    deferredPersistRequests: null,\n\n    settings: null,\n    // Wait for the service to be initialized and have settings.\n    userSettingsPromise: computed('_ready', 'settings', async function () {\n        try {\n            await this.get('_ready');\n            return this.get('settings');\n        } catch (err) {\n            this.logger.error('Failed to fetch settings - userSettingsPromise', err);\n            // Even if we get an error, we will still set some non-persisting defaults and should return those.\n            return this.get('settings');\n        }\n    }),\n    failedSettingsFetch: false,\n    _fetchSettingsPromise: null,\n    _updatePromise: null,\n\n    init(this: WebrtcSettingsService) {\n        this._super(...arguments);\n        // Wait until we have a token to grab settings and only resolve ready once we have/set settings.\n        const ready = this._waitForAccessToken()\n            .then(async () => {\n                this.logger.debug('Ready to fetch WebRTC settings');\n                const settings = (await this._fetchSettings()) || {};\n                // Check if we are missing some/all settings.\n                if (this._checkAndFixSettings(settings)) {\n                    // Persist adjusted settings.\n                    await this._updateSettings(settings);\n                }\n            })\n            .catch(err => {\n                this.set('failedSettingsFetch', true);\n                this._checkAndFixSettings({});\n                return Promise.reject(err);\n            });\n        this.set('_ready', ready);\n    },\n\n    async _waitForAccessToken(this: WebrtcSettingsService) {\n        if (this.get('session.accessToken') || (isTesting && !this.reallyWaitForToken)) {\n            return;\n        }\n\n        return new Promise(resolve => {\n            const handler = () => {\n                if (this.get('session.accessToken')) {\n                    this.removeObserver('session.accessToken', this, handler);\n                    resolve();\n                }\n            };\n\n            this.addObserver('session.accessToken', this, handler);\n        });\n    },\n\n    async getSettings(this: WebrtcSettingsService, forceRefresh?: boolean, retryOnFail = true) {\n        if (!forceRefresh && this.get('settings')) {\n            return this.get('settings');\n        }\n\n        try {\n            await this.get('_ready');\n            const settings = await this._fetchSettings();\n            this.set('settings', settings);\n            this.set('failedSettingsFetch', false);\n            return settings;\n        } catch (err) {\n            this.logger.error('Failed to fetch settings:', { err });\n            this.set('failedSettingsFetch', true);\n            // If we fail to fetch settings, retry one time.\n            if (retryOnFail) {\n                return this.getSettings(forceRefresh, false);\n            }\n            this._checkAndFixSettings({});\n            return Promise.reject(err);\n        }\n    },\n\n    _fetchSettings(this: WebrtcSettingsService) {\n        if (this.get('_fetchSettingsPromise')) {\n            return this.get('_fetchSettingsPromise');\n        }\n\n        const settingsUrl = this.get('application').pcV2Uri(SETTINGS_PATH);\n        const promise = this.get('ajax')\n            .request(settingsUrl)\n            .then(settings => Ember.Object.create(settings))\n            .catch(e => this.logger.error('Failed to fetch webrtc settings', { err: e }))\n            .finally(() => this.set('_fetchSettingsPromise', null));\n\n        this.set('_fetchSettingsPromise', promise as Promise<IWebrtcSettings>);\n        return promise;\n    },\n\n    // Trigger PATCH request on webrtc user settings. Used only internally in this service.\n    async _updateSettings(this: WebrtcSettingsService, settings: IWebrtcSettings) {\n        // Always make settings changes immediate\n        const cached = Object.assign({}, this.get('settings') || {}, settings);\n        this.set('settings', cached);\n\n        const existingPromise = this.get('_updatePromise') || resolve();\n        const settingsUrl = this.get('application').pcV2Uri(SETTINGS_PATH);\n\n        const promise = existingPromise\n            .then(() => {\n                this.get('ajax').request(settingsUrl, {\n                    method: 'PATCH',\n                    dataType: 'text',\n                    data: settings\n                });\n            })\n            .catch(e => this.logger.error('Failed to update webrtc settings', { err: e }))\n            .finally(() => {\n                this.trigger('sdkSettingsUpdate', this.get('settings') ?? {});\n                if (this.get('_updatePromise') === promise) {\n                    this.set('_updatePromise', null);\n                }\n            });\n\n        this.set('_updatePromise', promise);\n    },\n\n    _checkAndFixSettings(this: WebrtcSettingsService, settings: IWebrtcSettings) {\n        // If some important settings are missing, set some defaults.\n        if (!settings.directorySettings || !settings.generalSettings || !settings.generalSettings.advancedMicSettings) {\n            if (!settings.directorySettings) {\n                settings.directorySettings = defaultDirectorySettings;\n            }\n            if (!settings.generalSettings) {\n                settings.generalSettings = defaultGeneralSettings;\n            }\n            if (!settings.generalSettings.advancedMicSettings) {\n                settings.generalSettings.advancedMicSettings = defaultGeneralSettings.advancedMicSettings;\n            }\n            this.logger.warn('Some WebRTC settings were missing, setting defaults.', settings);\n            // Set the settings locally if fixes were applied and return true.\n            // These do NOT persist automatically.\n            this.set('settings', settings);\n            return true;\n        }\n        this.set('settings', settings);\n        return false;\n    },\n\n    async updateSettings(this: WebrtcSettingsService, settings: IWebrtcSettings) {\n        try {\n            // If we have no access token, we don't want to try updating settings.\n            await this.get('_ready');\n        } catch (error) {\n            this.logger.error('Failed to fetch WebRTC settings, cannot update WebRTC settings.');\n            this.get('notification').error(\n                this.get('intl').t('purecloud.station.fetchFailureTitle'),\n                this.get('intl').t('purecloud.station.fetchFailureMsg')\n            );\n            return;\n        }\n\n        // If we failed to fetch settings, we don't want a user to update them because they could override their saved settings.\n        if (this.get('failedSettingsFetch')) {\n            this.logger.warn('Cannot update settings because they failed to fetch.');\n            this.get('notification').error(\n                this.get('intl').t('purecloud.station.fetchFailureTitle'),\n                this.get('intl').t('purecloud.station.fetchFailureMsg')\n            );\n            return;\n        }\n\n        await this._updateSettings(settings);\n    },\n\n    /**\n     * This fn can take a dot-delimited path and update that single setting\n     */\n    async updateSetting<K extends keyof IWebrtcSettings>(settingPath: K | string, value: IWebrtcSettings[K]) {\n        const pieces = settingPath.split('.');\n        const settings = Object.assign({}, this.get('settings'));\n\n        let ref = settings;\n\n        pieces.forEach((piece, index) => {\n            if (index === pieces.length - 1) {\n                Ember.set(ref, piece, value);\n            } else {\n                Ember.set(ref, piece, ref[piece] || {});\n            }\n\n            ref = ref[piece];\n        });\n\n        // only update the top-level object\n        const topLevelKey = pieces[0];\n        return this.updateSettings({ [topLevelKey]: settings[topLevelKey] });\n    },\n\n    // If we get an update from another client, sync settings to latest update.\n    _handleSettingsChanged(this: WebrtcSettingsService, settings: IWebrtcSettings) {\n        const updatedSettings = Object.assign({}, this.get('settings'), settings);\n        // Immediately set new webrtc settings\n        this.set('settings', updatedSettings);\n        // Trigger settings event so SDK can update if being used.\n        this.trigger('sdkSettingsUpdate', updatedSettings);\n    }\n});\n\n/** DO NO REMOVE MODULE DECLARATION **/\ndeclare module '@ember/service' {\n    interface Registry {\n        webrtcSettings: WebrtcSettingsService;\n        'webrtc-settings': WebrtcSettingsService;\n    }\n}\n","define(\"connections-ui/services/webrtc\", [\"exports\", \"ember-webrtc-components/services/webrtc\"], function (_exports, _webrtc) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _webrtc.default;\n    }\n  });\n});\n","import config from '../config/environment';\nimport LocalStorageStore from 'ember-simple-auth/session-stores/local-storage';\nimport netUtils from '../utils/net';\n\nconst DEFAULT_STORAGE_KEY = 'connections_ui_auth';\n\nconst CURRENT_PROP = 'authenticated';\n\nlet BaseStore = LocalStorageStore;\nlet storageKey = DEFAULT_STORAGE_KEY;\n\nif (config.environment === 'development') {\n    try {\n        let currEnvDetails = netUtils.getEnvDetails();\n        if (currEnvDetails && currEnvDetails.local) {\n            storageKey = `${DEFAULT_STORAGE_KEY}-localhost-${currEnvDetails.env}`;\n        }\n    } catch (e) {\n        // Unknown env, prob testing ... just use base storage key\n    }\n}\n\nexport default BaseStore.extend({\n    init() {\n        let storeProps = {\n            key: storageKey\n        };\n        this.setProperties(storeProps);\n        this._super(...arguments);\n    },\n\n    restore() {\n        return this._super(...arguments).then(data => {\n            let payload = data[CURRENT_PROP] || {};\n            // Force our ESA authenticator to get a token from the host.\n            payload.authenticator = 'authenticator:directory';\n            return {\n                [CURRENT_PROP]: payload\n            };\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"kKl62LJd\",\"block\":\"{\\\"statements\\\":[],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/agent-ui.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"y+Bia1zY\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"canSelectDevices\\\"]],[33,[\\\"not\\\"],[[28,[\\\"webrtc\\\",\\\"canUseWebrtcSoftphone\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[26,[\\\"webrtc-issues\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"callForwardingActive\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showEnableCallForwarding\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"forward-calls \\\",[33,[\\\"if\\\"],[[28,[\\\"webrtcStation\\\"]],\\\"webrtc-station\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"btn btn-link btn-sm btn-link-bordered btn-block begin-forwarding\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"callForwarding\\\"],[[\\\"bubbles\\\"],[false]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.enableCallForwarding\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"call-forwarding-v2\\\"],null,[[\\\"configuringCallForwarding\\\"],[[28,[\\\"configuringCallForwarding\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/call-forwarding-partial.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"59cslhog\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"card-detail\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"banner\\\"],[15,\\\"role\\\",\\\"banner\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"h3\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"components.navMenu.cardView\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"banner-nav\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"card.tree\\\",[28,[\\\"currentPerson\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"tooltip.person.treeView\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-tree-view\\\"],[15,\\\"id\\\",\\\"tree-view-icon\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[15,\\\"for\\\",\\\"tree-view-icon\\\"],[15,\\\"placement\\\",\\\"bottom\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"tooltip.person.treeView\\\"],null],false]]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"card-view-icon-container\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-card-view\\\"],[15,\\\"id\\\",\\\"card-view-icon\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[15,\\\"for\\\",\\\"card-view-icon\\\"],[15,\\\"placement\\\",\\\"bottom\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"tooltip.person.cardView\\\"],null],false]]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"role\\\",\\\"main\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"card-view\\\"],null,[[\\\"entity\\\",\\\"setCurrentPerson\\\"],[[28,[\\\"model\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setCurrentPerson\\\"],null]]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/card/detail.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"aFUOXhwO\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"card-tree\\\"],null,[[\\\"model\\\"],[[28,[\\\"model\\\"]]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/card/tree.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"jBs6fTqh\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"permissions\\\",\\\"canViewBusinessChat\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"no-access\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"strong\\\",[]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"chat.permissions.accessErrorTitle\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text text-center\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"chat.permissions.accessError\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/chat-room.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"0kkMWKWy\",\"block\":\"{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"hidden\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showSeparatorBefore\\\"]]],null,{\\\"statements\\\":[[1,[28,[\\\"previous\\\",\\\"separator\\\"]],false]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"template\\\"]]],null,{\\\"statements\\\":[[18,\\\"default\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[1,[26,[\\\"title\\\"]],false]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[28,[\\\"showSeparatorAfter\\\"]]],null,{\\\"statements\\\":[[1,[26,[\\\"separator\\\"]],false]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/components/document-title.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"FHUG/v5v\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"media-item webhooks collapsible \\\",[33,[\\\"unless\\\"],[[28,[\\\"expanded\\\"]],\\\"collapsed\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"collapse-toggle btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleExpanded\\\"]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"webhooks-header\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"html-safe\\\"],[[28,[\\\"webhooksHeader\\\"]]],null],false],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-arrow-down-b\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"expanded\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"webhooks-body\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"html-safe\\\"],[[28,[\\\"webhooksTitle\\\"]]],null],false],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"webhooks-details\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[13],[0,\\\" \\\"],[1,[33,[\\\"html-safe\\\"],[[28,[\\\"webhooksDetails\\\"]]],null],false],[0,\\\" \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/components/webhooks-collapsible.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"iy8S2P5P\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"media-item webhooks collapsed\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"webhooks-header\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"status \\\",[26,[\\\"webhooksStatus\\\"]]]]],[13],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"html-safe\\\"],[[28,[\\\"webhooksHeader\\\"]]],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/components/webhooks.hbs\"}});","define(\"connections-ui/templates/components/x-select\", [\"exports\", \"emberx-select/templates/components/x-select\"], function (_exports, _xSelect) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _xSelect.default;\n    }\n  });\n});\n","export default Ember.HTMLBars.template({\"id\":\"KKBGetCl\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"group-profile\\\"],null,[[\\\"model\\\",\\\"isEditing\\\"],[[28,[\\\"model\\\"]],[28,[\\\"isEditing\\\"]]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/group/detail.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"55yjh1Xz\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"index\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[\\\"auth.index\\\"],null],false],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/index.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"Bgiz6Huu\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"login-oauth\\\"],null,[[\\\"offerMobileApp\\\",\\\"mobileOfferDeclined\\\",\\\"authenticate\\\"],[[28,[\\\"model\\\",\\\"offerMobileApp\\\"]],[33,[\\\"route-action\\\"],[\\\"mobileOfferDeclined\\\"],null],[33,[\\\"route-action\\\"],[\\\"authenticate\\\"],null]]]],false],[0,\\\"\\\\n\\\"],[1,[26,[\\\"icon-bootstrap\\\"]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/login-oauth.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"09fWonJq\",\"block\":\"{\\\"statements\\\":[[11,\\\"h3\\\",[]],[15,\\\"class\\\",\\\"title text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[[33,[\\\"get\\\"],[[28,[\\\"messageKeys\\\"]],\\\"titleKey\\\"],null]],null],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasDesc\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"desc text-center\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[[33,[\\\"get\\\"],[[28,[\\\"messageKeys\\\"]],\\\"descKey\\\"],null]],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"action-container text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"p\\\",[]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[[33,[\\\"get\\\"],[[28,[\\\"messageKeys\\\"]],\\\"actionKey\\\"],null]],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"btn btn-default\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"reloadApp\\\"]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"unrecoverableAppFailure.reloadApp\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"brand-footer text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"genesys-logo-container\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"brand-footer-text\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"about.copyright\\\"],[[\\\"currentYear\\\"],[[28,[\\\"applicationService\\\",\\\"currentYear\\\"]]]]],false],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/maintenance.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"nv+hrZq0\",\"block\":\"{\\\"statements\\\":[[11,\\\"h3\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[\\\"auth.noPermissionsHeader\\\"],null],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[\\\"auth.noPermissions\\\"],null],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"btn btn-default\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"logout\\\"]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"components.navMenu.logout\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"brand-footer\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"genesys-logo-container\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"brand-footer-text\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"about.copyright\\\"],[[\\\"currentYear\\\"],[[28,[\\\"applicationService\\\",\\\"currentYear\\\"]]]]],false],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/no-access.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"t3+KfQhb\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"no-station-notification\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-phone-off\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"no-phone\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"no-phone-text\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.noPhoneSelected\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-link action-open-station-picker-v2\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"openStationPicker\\\"]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"select-text\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.station.change\\\"],null],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-angle-right\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/partials/-no-station-notification.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"XmYZvT94\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"entity-profile\\\"],null,[[\\\"entity\\\",\\\"user\\\",\\\"editing\\\",\\\"editEmergencyLocation\\\",\\\"setEditingSection\\\"],[[28,[\\\"model\\\",\\\"person\\\"]],[28,[\\\"model\\\",\\\"user\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"editEmergencyLocation\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setEditingSection\\\"],null]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/person/detail.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"moJeOwBU\",\"block\":\"{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"dialpadShouldSendDtmf\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"dtmf\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"show-dtmf-dialpad\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"openDtmfDialPad\\\"]],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.openDialpad\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canRecord\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"record\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"record\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isRecording\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.recording.stopRecording\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.recording.startRecording\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"conferenceEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"add-participant\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showAddParticipants\\\"]],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.addParticipant\\\"],null],false],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[33,[\\\"or\\\"],[[28,[\\\"conversation\\\",\\\"onConference\\\"]],[28,[\\\"isMonitoring\\\"]],[28,[\\\"isCoaching\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"conversation\\\",\\\"onConsult\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"transfer\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"transfer\\\"]],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.transfer.default\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"conferenceEnabled\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"eligibleCallsToMerge\\\"]],[28,[\\\"isConnected\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"merge\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"merge\\\"]],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.merge\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"flag-action\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"flagInteraction\\\",\\\"isRunning\\\"]],[28,[\\\"unflagInteraction\\\",\\\"isRunning\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.voiceQualityIssue\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isFlagged\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"unflag\\\"]],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"unflag-icon\\\"],[15,\\\"icon-name\\\",\\\"flag\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"purecloud.unflagInteraction\\\"],null],null],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.voiceQualityIssue\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"flag\\\"]],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"flag\\\"],[15,\\\"class\\\",\\\"flag-icon\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"purecloud.flagInteraction\\\"],null],null],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.voiceQualityIssue\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/purecloud/partials/conversation-controls-menu.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"Wq9VakQB\",\"block\":\"{\\\"statements\\\":[[19,\\\"partials/signup-reset\\\"]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":true}\",\"meta\":{\"moduleName\":\"connections-ui/templates/reset-password.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"HGIIpodG\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"search-page\\\"],null,[[\\\"entity\\\",\\\"query\\\",\\\"queryFacets\\\",\\\"saveHistory\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"query\\\"]],[28,[\\\"queryFacets\\\"]],[28,[\\\"saveHistory\\\"]]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/search.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"NjP1jyRV\",\"block\":\"{\\\"statements\\\":[],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/third-party/app-embed.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"z5f7z+A1\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"time-machine-confirmation\\\"],null,[[\\\"buildTag\\\",\\\"confirm\\\",\\\"cancel\\\"],[[28,[\\\"model\\\",\\\"buildTag\\\"]],[33,[\\\"route-action\\\"],[\\\"confirm\\\"],null],[33,[\\\"route-action\\\"],[\\\"cancel\\\"],null]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/time-machine.hbs\"}});","import Transform from 'ember-data/transform';\n\nexport default Transform.extend({\n    deserialize(serialized) {\n        return new Date(serialized);\n    },\n\n    serialize(deserialized) {\n        return deserialized.toISOString();\n    }\n});\n","define(\"connections-ui/transforms/json\", [\"exports\", \"ember-data-change-tracker/transforms/json\"], function (_exports, _json) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _json.default;\n    }\n  });\n});\n","define(\"connections-ui/transforms/object\", [\"exports\", \"ember-data-change-tracker/transforms/object\"], function (_exports, _object) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _object.default;\n    }\n  });\n});\n","define(\"connections-ui/types/agent-assist.type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","define(\"connections-ui/types/conversation.type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","export * from './maybe.type';\nexport * from './conversation.type';\nexport * from './pigeon.type';\n","define(\"connections-ui/types/maybe.type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","define(\"connections-ui/types/pigeon.type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","define(\"connections-ui/types/webrtc-settings.type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","import { CommunicationType } from '@genesys/genesys-cloud-conversation-utils';\nimport { UnionFromTuple, assertNever } from 'connections-ui/utils/types';\nimport { AppContext } from './apps';\n\nexport const COMMUNICATION_TYPE_SINGULAR = ['call', 'email', 'message', 'chat', 'callback'] as const;\ntype CommunicationTypeSingular = UnionFromTuple<typeof COMMUNICATION_TYPE_SINGULAR>;\n\n/**\n * Issue warning that closure action was not provided to component.\n * @param {string} actionName The name of closure function that was not provided\n */\nexport function warnClosureAction(actionName: string, args: any = {}): any {\n    const message = `ACD: ${actionName} closure action has not been set up for this component.`;\n    console.warn(message, { arguments: args });\n}\n\nexport function singularizeMediaType(type: CommunicationType): CommunicationTypeSingular {\n    return type.substring(0, type.length - 1) as CommunicationTypeSingular;\n}\n\n/**\n * Retrieves the queue ID from the given app context.\n *\n * This function extracts the queue ID based on the type of the app context.\n * For 'conversation' type, it attempts to retrieve the queue ID from the participant payload.\n * For 'workitem' type, it retrieves the queue ID directly from the workitem payload.\n * If the type is not recognized, it asserts an error.\n */\nexport function getQueueIdFromAppContext({ type, payload }: AppContext): string | undefined {\n    switch (type) {\n        case 'conversation': {\n            return payload.get('participantForCurrentUser.queueId') || payload.get('participantForQueue.queueId');\n        }\n        default: {\n            assertNever(type);\n        }\n    }\n}\n","export const replaceHtmlSpecialChars = (str: string): string =>\n    str\n        ?.replace(/&quot;/g, '\"')\n        .replace(/&#39;/g, \"'\")\n        .replace(/&lt;/g, '<')\n        .replace(/&gt;/g, '>')\n        .replace(/&amp;/g, '&')\n        .replace(/&#8217;/g, \"'\");\n","import _ from 'lodash';\nimport Ember from 'ember';\nimport { pluralize } from 'ember-inflector';\nimport moment from 'connections-ui/utils/dates';\n\nconst { typeOf, get } = Ember;\n\nconst MEDIA_TYPES = ['callbacks', 'calls', 'chats', 'emails', 'messages'];\n\nfunction participantHasMedia(participants, media) {\n    return !!participants.find(participant => !!participant[media]);\n}\n\n// Assigns the interaction data sent from carrier pigeon or REST API response\n// to a property on the model that can be used to retrieve an interaction's \"raw\" data\nexport function setInteractionModelMetadata(model, interactionMetadata) {\n    try {\n        let metadataClone = _.cloneDeep(interactionMetadata);\n\n        if (typeOf(model) === 'instance') {\n            model.set('__interaction_metadata__', metadataClone);\n        } else {\n            model.__interaction_metadata__ = metadataClone;\n        }\n    } catch (err) {\n        Ember.Logger.error('Unable to clone and set the interaction metadata for interaction', {\n            err,\n            remoteData: {\n                interactionId: Ember.get(model, 'id')\n            }\n        });\n    }\n}\n\nexport function getCommunicationType(interactionModel) {\n    if (!interactionModel) return null;\n    return interactionModel.get('subMessageType') || interactionModel.get('type');\n}\n\nexport function getInteractionTypeFromCP(interaction, myGuid) {\n    if (!interaction || !myGuid || !interaction.participants) {\n        return {};\n    }\n\n    const myParticipants = interaction.participants.filter(participant => {\n        return participant.userId === myGuid;\n    });\n\n    const active = {};\n    MEDIA_TYPES.forEach(type => {\n        active[type] = participantHasMedia(myParticipants, type);\n    });\n\n    return active;\n}\n\nexport function interactionHasSipErrors(interaction) {\n    if (!interaction) {\n        return false;\n    }\n\n    let callsError = false;\n    const calls = interaction.get('participantForCurrentUser.calls');\n\n    if (calls) {\n        callsError = Ember.A(calls).some(call => {\n            const code = Ember.get(call, 'disconnectReasons.firstObject.code');\n\n            // 487 is Voicemail Not Available, which is not treated as an error\n            // 410 is a queue call that gets transfered to an agent for some reason\n            return code && code >= 300 && code !== 487 && code !== 410;\n        });\n    }\n\n    return callsError;\n}\n\n/**\n * Gets the true customer participant - whether it is the consultParticipant true customer or the last connected customer\n * @param interaction\n * @returns {*}\n */\nexport function getTrueCustomerIfMultipleCustomersExist(interaction) {\n    if (interaction) {\n        const participants = get(interaction, 'participants') || [];\n        const type = get(interaction, 'type');\n        const customerParticipants =\n            participants.filter(({ purpose }) => purpose === 'customer' || purpose === 'external') || Ember.A([]);\n\n        const hasMultipleCustomers = customerParticipants.length > 1;\n\n        if (hasMultipleCustomers) {\n            const consultParticipantId =\n                get(interaction, 'consultParticipantId') || customerParticipants.mapBy('consultParticipantId').pop();\n            const isCallOrCallback = interaction.get('isCall') || interaction.get('isCallback');\n\n            if (isCallOrCallback) {\n                if (consultParticipantId) {\n                    return customerParticipants.findBy('id', consultParticipantId);\n                } else {\n                    // SERVOPS-13490  when there are multiple customers on a blind transfer call from a previous consult\n                    // call there can be more than one customer participant in the list so deriving the correct communication\n                    // ID for the true customer can be wrong.  Since the blind transfer happened - there is no longer information\n                    // about what user is the consultParticipant so we will take the most recently connected\n                    // customer as the inferred true customer\n                    let participant;\n                    for (let i = 0; i < customerParticipants.length; i++) {\n                        let customer = customerParticipants[i];\n\n                        const communicationType = pluralize(type).camelize();\n                        const communications = customer[communicationType] || [];\n                        const { state } = communications[0] || {};\n                        if (!get(customer, 'endTime') || state === 'connected') {\n                            return customer;\n                        }\n                        const customerEndTime = moment(get(customer, 'endTime'));\n                        const lastParticipantEndTime = participant ? moment(get(participant, 'endTime')) : null;\n\n                        if (!participant || customerEndTime.isAfter(lastParticipantEndTime)) {\n                            participant = customer;\n                        }\n                    }\n                    return participant;\n                }\n            }\n        }\n    }\n}\n\nexport function isOutboundEmailInteraction(interactionModel) {\n    const agent = (get(interactionModel, 'participants') || []).findBy('purpose', 'agent') || {};\n    return get(agent, 'emails.firstObject.direction') === 'outbound';\n}\n\nexport function isOutboundMessagingInteraction(interactionModel) {\n    const agent = (get(interactionModel, 'participants') || []).findBy('purpose', 'agent') || {};\n    return get(agent, 'messages.firstObject.direction') === 'outbound';\n}\n\n/**\n * Util for creating an immutable pojo for a given contact\n * @param contact\n * @returns {*}\n */\nexport function createContactPojo(contact) {\n    if (!contact) return;\n    const derivedProperties = ['name', 'canonicalId', 'isCanonical'];\n    const contactJSON = typeof contact.toJSON === 'function' ? contact.toJSON({ includeId: true }) : {};\n    const derived = derivedProperties.reduce((accumulator, property) => {\n        const value = get(contact, property);\n        if (value) {\n            accumulator[property] = value;\n        }\n        return accumulator;\n    }, {});\n    return Object.assign(contactJSON, derived);\n}\n\n/**\n * Issue warning that closure action was not provided to component.\n * @param {string} actionName The name of closure function that was not provided\n */\nexport function warnClosureAction(actionName, args) {\n    const message = `ACD: ${actionName} closure action has not been set up for this component.`;\n    Ember.Logger.warn(message, { arguments: args });\n}\n","const participantStatuses = {\n    ALERTING: 'ALERTING',\n    CONNECTING: 'CONNECTING',\n    CONNECTED: 'CONNECTED',\n    CONTACTING: 'CONTACTING',\n    DIALING: 'DIALING',\n    DISCONNECTED: 'DISCONNECTED',\n    PARKED: 'PARKED',\n    OFFERING: 'OFFERING',\n    TERMINATED: 'TERMINATED',\n    TRANSMITTING: 'TRANSMITTING'\n};\n\nexport default participantStatuses;\n","export const MEDIA_TYPES = {\n    CHAT: 'chat',\n    EMAIL: 'email',\n    VOICE: 'voice'\n};\n\nexport const STAT_KEYS = {\n    ABANDONED: 'tAbandon',\n    ACW: 'tAcw',\n    ANSWERED: 'tAnswered',\n    CUSTOMERS_WAITING: 'oWaiting',\n    HANDLE: 'tHandle',\n    HELD: 'tHeld',\n    INTERACTING: 'oInteracting',\n    IVR: 'tIvr',\n    OFFERED: 'nOffered',\n    OVERSLA: 'nOverSla',\n    SERVICE_LEVEL: 'serviceLevel',\n    SERVICE_TARGET: 'serviceTarget',\n    TALK: 'tTalk',\n    TIME_IN_STATUS: 'tIS', // tIS.<Status ID> ms  The time in status for the given status id. At status change time.\n    TRANSFERRED: 'nTransferred',\n    WAIT_TIME: 'tWait',\n    ACTIVE_MEMBERS: 'nActive', // Number of active members\n    MEMBERS: 'nMembers' // Active members\n};\n","/**\n * Params from the URL in the router. Pattern could be any of the following.\n *   - engage/admin/interactions/:interactionId/\n *   - engage/admin/interactions/:interactionId/*interactionDetailPath\n *   - engage/agent/interactions/:interactionId/\n *   - engage/agent/interactions/:interactionId/*interactionDetailPath\n */\ninterface InteractionDetailRedirectUrlParams {\n    /** GUID for the interaction. */\n    interactionId: string;\n\n    /** Sub-path within the interaction detail view like /details or /transcript. May not be present if the path ends with the interaction ID like engage/agent/interactions/:interactionId/ */\n    interactionDetailPath?: string;\n}\n\nexport interface InteractionDetailRedirectArgs {\n    /** Params from the URL in the router. */\n    urlParams: InteractionDetailRedirectUrlParams;\n\n    /** Query params from the URL. */\n    queryParams?: Record<string, string | undefined>;\n\n    /** URL segment for routing to either the admin or agent interaction detail path. */\n    adminAgentSegment: 'admin' | 'agent';\n}\n\n/** Builds a path to the analytics-ui iframe coordinator route for the interaction detail view given parameters from the old /engage/admin/interactions/ path. */\nexport function buildInteractionDetailRedirectPath(args: InteractionDetailRedirectArgs): string {\n    const queryParams = args.queryParams || {};\n    const queryParamSegments: Array<string> = [];\n\n    Object.entries(queryParams).forEach(keyValuePair => queryParamSegments.push(keyValuePair.join('=')));\n\n    const queryParamString = queryParamSegments.join('&');\n    const interactionId = args.urlParams.interactionId;\n    const interactionDetailPath = args.urlParams.interactionDetailPath;\n    const adminAgentSegment = args.adminAgentSegment;\n\n    let url = `/analytics/interactions/${interactionId}/${adminAgentSegment}/`;\n\n    if (interactionDetailPath) {\n        url += interactionDetailPath;\n    }\n\n    if (queryParamString) {\n        url += `?${queryParamString}`;\n    }\n\n    return url;\n}\n","import { getEvaluator, parse } from 'boon-js';\nimport { buildSymbolMap } from 'connections-ui/utils/boolean-expressions';\nimport { computed } from '@ember/object';\nimport { getOwner } from '@ember/application';\n\nexport const _buildAppProviderComputed = function (providerConfig) {\n    let dependencies = ['permissions.donutPermissions.[]', 'session.features'];\n    let keys = Object.keys(providerConfig);\n    keys.forEach(currKey => {\n        if (providerConfig[currKey].dependencies) {\n            dependencies = [...dependencies, ...providerConfig[currKey].dependencies];\n        }\n    });\n    dependencies = [...new Set(dependencies)];\n    let evaluateProviderExpression = function (expr, features, permissions) {\n        return buildSymbolMap(expr, {\n            ft: keyName => {\n                return features[keyName];\n            },\n            perm: keyName => {\n                return permissions.validateDonutPermission(keyName);\n            },\n            bool: keyName => {\n                return keyName === 'true';\n            }\n        });\n    };\n    return computed(...dependencies, function () {\n        let validProviders = [];\n        const permissions = this.get('permissions');\n        const features = this.get('session.features');\n        keys.forEach(currKey => {\n            const boolExpr = providerConfig[currKey].boolExpr;\n            const oldProvider = providerConfig[currKey].providerInstance;\n            let validProvider;\n            if (boolExpr) {\n                try {\n                    validProvider = providerConfig[currKey].evaluator(\n                        evaluateProviderExpression(boolExpr, features, permissions)\n                    );\n                } catch (error) {\n                    validProvider = false;\n                }\n            } else {\n                validProvider = true;\n                this.logger.warn('There are no feature toggle or permission restrictions for provider: ', {\n                    key: currKey\n                });\n            }\n            if (validProvider) {\n                if (!oldProvider) {\n                    providerConfig[currKey].providerInstance = getOwner(this).lookup('app-provider:' + currKey);\n                }\n                validProviders.push(providerConfig[currKey].providerInstance);\n            } else {\n                if (oldProvider) {\n                    oldProvider.destroy();\n                    providerConfig[currKey].providerInstance = null;\n                }\n            }\n        });\n        return validProviders;\n    });\n};\n\nexport const _buildProviderConfig = function (providerConfigMap, logger) {\n    if (!providerConfigMap) {\n        return {};\n    }\n    let keys = Object.keys(providerConfigMap);\n    let providerConfig = {};\n    keys.forEach(currKey => {\n        const boolExpr = providerConfigMap[currKey];\n        providerConfig[currKey] = { providerInstance: null, boolExpr };\n        try {\n            if (boolExpr) {\n                providerConfig[currKey].evaluator = getEvaluator(boolExpr);\n\n                let currDependencies = parse(boolExpr)\n                    .filter(curr => {\n                        return curr.name === 'IDENTIFIER';\n                    })\n                    .map(curr => {\n                        const [valueTag, value] = curr.value.split(':');\n                        if (!value || value === '') {\n                            throw new Error('Invalid element in boolean expression');\n                        }\n                        if (valueTag === 'ft') {\n                            return 'session.features.' + value;\n                        } else if (\n                            valueTag === 'perm' ||\n                            (valueTag === 'bool' && (value === 'true' || value === 'false'))\n                        ) {\n                            return '';\n                        } else {\n                            throw new Error('Invalid element in boolean expression');\n                        }\n                    })\n                    .filter(curr => {\n                        return curr !== '';\n                    });\n                providerConfig[currKey].dependencies = currDependencies;\n            }\n        } catch (err) {\n            delete providerConfig[currKey];\n            logger.warn('Invalid feature toggle and permission restrictions expression for provider: ', {\n                key: currKey\n            });\n        }\n    });\n    return providerConfig;\n};\n\nexport const validatePortNumber = function (portToValidate, defaultPort) {\n    const portInt = +portToValidate;\n    if (isNaN(portInt) || portInt <= 0 || portInt >= 65535) {\n        return defaultPort;\n    }\n    return portInt;\n};\n\nexport default { _buildProviderConfig, _buildAppProviderComputed };\n","import { assertNever } from 'connections-ui/utils/types';\nimport { RenderedInstanceState } from '@genesys/apps-v2-host';\nimport { isKnown } from '@genesys/service-discovery-web-internal';\n\nexport const isTrusted = (renderedInstance: RenderedInstanceState): boolean => {\n    const { appDef } = renderedInstance;\n    const { type: appType } = appDef;\n\n    switch (appType) {\n        case 'dynaWebComp':\n        case 'elementFactoryAppDef':\n        case 'elementSingletonAppDef':\n            // all internal types are trusted and allowed\n            break;\n        case 'iframe':\n            if (!appDef.trustedDataPassing) {\n                return false;\n            }\n            break;\n        default:\n            assertNever(appType);\n    }\n\n    return true;\n};\n\nexport const isActive = (renderedInstance: RenderedInstanceState): boolean => {\n    return renderedInstance.appState !== 'STOPPING';\n};\n\nexport const isVisible = (renderedInstance: RenderedInstanceState): boolean => {\n    return renderedInstance.appState !== 'STOPPING' && renderedInstance.userVisible;\n};\n\nexport const isInternallyHosted = (renderedInstance: RenderedInstanceState): boolean => {\n    const { appDef } = renderedInstance;\n    const { type: appType } = appDef;\n\n    switch (appType) {\n        case 'dynaWebComp':\n        case 'elementFactoryAppDef':\n        case 'elementSingletonAppDef':\n            // all internallyHosted types are trusted and allowed\n            break;\n        case 'iframe':\n            // isKnown throws is the url is invalid, so we catch it and return false\n            try {\n                if (!isKnown(appDef.src.href, {})) {\n                    return false;\n                }\n            } catch (error) {\n                return false;\n            }\n            break;\n        default:\n            assertNever(appType);\n    }\n\n    return true;\n};\n\n//exported for testing\nexport const validationChecks = {\n    isTrusted: {\n        check: isTrusted,\n        invalidReason: 'appDefNotTrusted'\n    },\n    isActive: {\n        check: isActive,\n        invalidReason: 'instanceNotActive'\n    },\n    isVisible: {\n        check: isVisible,\n        invalidReason: 'instanceNotVisible'\n    }\n};\n\nexport type ValidationKey = keyof typeof validationChecks;\ntype InvalidReason = (typeof validationChecks)[ValidationKey]['invalidReason'];\n\ntype ValidateRenderedInstanceResult =\n    | {\n          type: 'valid';\n      }\n    | { type: 'invalid'; reasons: InvalidReason[] };\n\nexport const validateRenderedInstance = (\n    renderedInstance: RenderedInstanceState,\n    ...validations: ValidationKey[]\n): ValidateRenderedInstanceResult => {\n    const invalidReasons: InvalidReason[] = [];\n\n    for (const validation of validations) {\n        const validationConfig = validationChecks[validation];\n        const result = validationConfig.check(renderedInstance);\n        if (!result) invalidReasons.push(validationConfig.invalidReason);\n    }\n    if (invalidReasons.length > 0) {\n        return { type: 'invalid', reasons: invalidReasons };\n    }\n    return { type: 'valid' };\n};\n","import { typeOf, isPresent } from '@ember/utils';\nimport { assertNever, hasKey } from './types';\nimport { AppDef, AppLogDetails, Asset } from '@genesys/apps-v2-host';\nimport { StashLoggerLogPayload } from '@connections-ui/services';\n\n// General Constants\nexport const SDK_REPO_URL = 'https://github.com/MyPureCloud/client-app-sdk';\n\n// Namespaces for logging, metrics, etc\nexport const LOG_ROOT_NAMESPACE = 'PureCloud Client Apps';\nexport const LOG_STANDALONE_APP_NAMESPACE = 'Standalone App';\nexport const LOG_API_NAMESPACE = 'API';\nexport const LOG_INTERAPPTIONS_NAMESPACE = 'Interapptions';\nconst LOG_SEPARATOR = ' - ';\n\nexport * as AppsV2 from '@genesys/apps-v2-host';\n\ntype ConversationAppContext = {\n    type: 'conversation';\n    // TODO: The actual type is an ember model, InteractionModel; use when this type is available.\n    payload: any;\n    id: string;\n};\n\nexport type AppContext = ConversationAppContext;\n\ntype AppDefV1VectorAsset = { vector: string };\ntype AppDefV1GuxAsset = { guxIcon: { name: string; decorative: boolean } };\ntype AppDefV1AssetSrcSet = { raster: Record<`x${number}`, string> };\nexport type AppDefV1Asset = Partial<AppDefV1GuxAsset & AppDefV1VectorAsset & AppDefV1AssetSrcSet>;\n\ntype AppLogDetailsObject = ReturnType<AppLogDetails['getLogs']>;\n\nexport default {\n    SDK_REPO_URL,\n    LOG_ROOT_NAMESPACE,\n    LOG_STANDALONE_APP_NAMESPACE,\n    LOG_API_NAMESPACE,\n    LOG_INTERAPPTIONS_NAMESPACE,\n\n    buildLogMsg(msg: string, ...subNamespaces: string[]) {\n        let tokens = [LOG_ROOT_NAMESPACE];\n\n        if (subNamespaces.length > 0) {\n            subNamespaces.forEach(currNamespace => {\n                if (typeOf(currNamespace) !== 'string' || !isPresent(currNamespace)) {\n                    throw new Error('invalidNamespaceValue');\n                } else {\n                    tokens.push(currNamespace);\n                }\n            });\n        }\n\n        if (typeOf(msg) !== 'string' || !isPresent(msg)) {\n            throw new Error('invalidMessage');\n        } else {\n            tokens.push(msg);\n        }\n\n        return tokens.join(LOG_SEPARATOR);\n    },\n\n    buildApiLogMsg(msg: string) {\n        return this.buildLogMsg(msg, LOG_API_NAMESPACE);\n    },\n\n    buildStandaloneAppLogMsg(msg: string, ...subNamespaces: string[]) {\n        return this.buildLogMsg(msg, LOG_STANDALONE_APP_NAMESPACE, ...subNamespaces);\n    },\n\n    buildInterapptionsLogMsg(msg: string, ...subNamespaces: string[]) {\n        return this.buildLogMsg(msg, LOG_INTERAPPTIONS_NAMESPACE, ...subNamespaces);\n    },\n\n    buildStashLoggerDetails(logDetails: Partial<AppLogDetailsObject> = {}): StashLoggerLogPayload {\n        const details: StashLoggerLogPayload = { ...logDetails.data };\n        details.remoteData = { ...logDetails.remote };\n        if (logDetails.mask) {\n            details.remoteData.sensitive = { ...logDetails.mask };\n        }\n        return details;\n    },\n\n    buildViewId(id: string) {\n        return `app_${id.replaceAll('&', '_')}`;\n    },\n\n    isAppDefV2(toCheck: unknown): toCheck is AppDef {\n        if (!toCheck || typeof toCheck !== 'object' || !hasKey(toCheck, 'type') || typeof toCheck.type !== 'string') {\n            return false;\n        }\n        return (\n            ['iframe', 'elementSingletonAppDef', 'elementFactoryAppDef', 'dynaWebComp'] as ReadonlyArray<string>\n        ).includes(toCheck.type);\n    },\n\n    isAppContext(toCheck: unknown): toCheck is AppContext {\n        if (!toCheck || typeof toCheck !== 'object') {\n            return false;\n        }\n\n        if (\n            !hasKey(toCheck, 'type') ||\n            typeof toCheck.type !== 'string' ||\n            !['conversation'].includes(toCheck.type)\n        ) {\n            return false;\n        }\n\n        if (!hasKey(toCheck, 'id') || typeof toCheck.id !== 'string') {\n            return false;\n        }\n\n        if (!hasKey(toCheck, 'payload') || typeof toCheck.payload !== 'object' || !toCheck.payload) {\n            return false;\n        }\n\n        return true;\n    },\n\n    buildV1IconAsset(asset: Asset): AppDefV1Asset {\n        const { type } = asset;\n        switch (type) {\n            case 'remoteVectorImage':\n                return {\n                    vector: asset.url.href\n                };\n            case 'remoteRasterImage':\n                if (asset.width !== asset.height) {\n                    return {};\n                }\n                return {\n                    raster: {\n                        [`x${asset.width}`]: asset.url.href\n                    }\n                };\n            case 'remoteRasterImageSet':\n                const raster = Object.fromEntries(\n                    asset.images\n                        .filter(curr => curr.width === curr.height)\n                        .map<[string, string]>(curr => {\n                            return [`x${curr.width}`, curr.url.href];\n                        })\n                );\n\n                if (Object.keys(raster).length === 0) {\n                    return {};\n                }\n\n                return {\n                    raster\n                };\n            case 'sparkV3SvgSprite':\n                return {\n                    guxIcon: {\n                        name: asset.classNames.join(' '),\n                        decorative: true\n                    }\n                };\n            default:\n                assertNever(type);\n        }\n    },\n\n    buildV2IconAsset(asset: AppDefV1Asset): Asset | undefined {\n        if (!asset || typeof asset !== 'object') {\n            return undefined;\n        }\n        if (asset.guxIcon && typeof asset.guxIcon.name === 'string') {\n            return {\n                type: 'sparkV3SvgSprite',\n                classNames: [asset.guxIcon.name]\n            };\n        } else if (typeof asset.vector === 'string') {\n            try {\n                return {\n                    type: 'remoteVectorImage',\n                    url: new URL(asset.vector)\n                };\n            } catch (_) {\n                return undefined;\n            }\n        } else if (asset.raster && typeof asset.raster === 'object') {\n            // Look though raster props and validate the url\n            const RASTER_PROP_PATTERN = /^x(\\d+)$/;\n            const rasterEntries = Object.entries(asset.raster)\n                .filter(([currProp]) => RASTER_PROP_PATTERN.test(currProp))\n                .filter((toCheck): toCheck is [string, string] => typeof toCheck[1] === 'string');\n            const images = rasterEntries.reduce<Array<{ width: number; height: number; url: URL }>>(\n                (result, [currRasterProp, currRasterValue]) => {\n                    let url;\n                    try {\n                        url = new URL(currRasterValue);\n                    } catch (_) {\n                        // TODO: Log invalid asset url\n                        return result;\n                    }\n\n                    const match = RASTER_PROP_PATTERN.exec(currRasterProp);\n                    if (!match) {\n                        return result;\n                    }\n\n                    const size = parseInt(match[1], 10);\n                    if (isNaN(size)) {\n                        return result;\n                    }\n\n                    result.push({\n                        width: size,\n                        height: size,\n                        url\n                    });\n\n                    return result;\n                },\n                []\n            );\n\n            if (images.length === 1) {\n                const { url, width, height } = images[0];\n                return {\n                    type: 'remoteRasterImage',\n                    url,\n                    width,\n                    height\n                };\n            }\n\n            if (images.length > 1) {\n                return {\n                    type: 'remoteRasterImageSet',\n                    images\n                };\n            }\n        }\n        return undefined;\n    }\n};\n","import { noop } from 'lodash';\n\nexport type PromiseResolve<T> = NonNullable<Parameters<Promise<T>['then']>[0]>;\nexport type PromiseReject<T> = NonNullable<Parameters<Promise<T>['catch']>[0]>;\n\nexport type DeferredPromise<T> = {\n    promise: Promise<T>;\n    resolve: PromiseResolve<T>;\n    reject: PromiseReject<T>;\n};\n\nexport const deferPromise = <T>(): DeferredPromise<T> => {\n    let resolve: PromiseResolve<T> = noop;\n    let reject: PromiseReject<T> = noop;\n\n    const promise = new Promise<T>((res, rej) => {\n        resolve = res;\n        reject = rej;\n    });\n    return { promise, resolve, reject };\n};\n","import { parse } from 'boon-js';\n\nexport function buildSymbolMap(expression, symbolEvaluator) {\n    if (typeof expression !== 'string' || expression === '') {\n        throw new Error('Missing/invalid expression');\n    }\n    if (typeof symbolEvaluator !== 'object' || symbolEvaluator === null || Object.keys(symbolEvaluator).length === 0) {\n        throw new Error('Missing/invalid symbol evaluator');\n    }\n\n    const symbolMap = {};\n\n    const identifiers = parse(expression)\n        .filter(curr => {\n            return curr.name == 'IDENTIFIER';\n        })\n        .map(curr => {\n            return curr.value;\n        });\n\n    if (identifiers.length === 0) {\n        throw new Error('No Identifiers Found');\n    }\n\n    identifiers.forEach(currIdentifier => {\n        const ns = currIdentifier.split(':')[0];\n        let variable = currIdentifier.substring(ns.length + 1);\n        if (!ns || !variable || ns === '' || variable === '') {\n            throw new Error('Invalid identifier');\n        }\n        const nsSymbolEvaluator = symbolEvaluator[ns];\n        if (typeof nsSymbolEvaluator !== 'function') {\n            throw new Error('Missing/Invalid namespace symbol evaluator');\n        }\n        try {\n            symbolMap[`${ns}:${variable}`] = nsSymbolEvaluator(variable);\n        } catch (error) {\n            throw new Error('Namespace symbol evaluator threw');\n        }\n    });\n\n    return symbolMap;\n}\n\nconst expressionBuilder = (operator, conditions) => {\n    return `(${conditions.join(` ${operator} `)})`;\n};\n\nexport const and = function (...conditions) {\n    return expressionBuilder('AND', conditions);\n};\n\nexport const or = function (...conditions) {\n    return expressionBuilder('OR', conditions);\n};\n\nexport const not = condition => `(NOT (${condition}))`;\n\nexport const ft = name => `ft:${name}`;\n\nexport const perm = name => `perm:${name}`;\n\nexport const bool = name => `bool:${name}`;\n","define(\"connections-ui/utils/browser\", [\"exports\", \"ember-purecloud-components/utils/browser\"], function (_exports, _browser) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _browser.default;\n    }\n  });\n});\n","define(\"connections-ui/utils/code-utils\", [\"exports\", \"ember-purecloud-components/utils/code-utils\"], function (_exports, _codeUtils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _codeUtils.default;\n    }\n  });\n});\n","export function isGuid(id: string): boolean {\n    if (!id) return false;\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nexport function isAppleURN(id: string): boolean {\n    if (!id) return false;\n    return !!id.match(/^urn:mbid:/);\n}\n/**\n * Get userId\n * @param user participant.\n * @returns {string or undefined} the userId\n */\nexport const userGuidFromParticipant = (user: any) => {\n    if (!user) {\n        return;\n    }\n\n    const { userId, userUri } = user;\n\n    if (userId) {\n        return userId;\n    }\n    if (userUri) {\n        return userUri.substring(userUri.lastIndexOf('/') + 1);\n    }\n};\n\n/**\n * Convert size in bytes to KB, MB, GB or GB.\n * @param contentLength file size in bytes to be converted against.\n * @returns {string} the converted value with the correct unit.\n */\nexport function formatSize(contentLength: number): string {\n    const units = ['bytes', 'KB', 'MB', 'GB', 'TB'];\n    const i = Math.floor(Math.log(contentLength) / Math.log(1000));\n\n    if (!+contentLength) return '0bytes';\n    return `${parseFloat((contentLength / Math.pow(1000, i)).toFixed(1))}${units[i]}`;\n}\n","/*\n  DEPRECATION NOTICE:  this file has been moved to `ember-purecloud-components`\n  and will be removed.  Please use './node_modules/ember-purecloud-components/addon/utils/dates.js'\n  instead.\n*/\n\nimport moment from 'ember-purecloud-components/utils/dates';\nimport {\n    displayDateRelativeToToday,\n    generateCurrentInterval,\n    splitIntervalString,\n    timeInMillis\n} from 'ember-purecloud-components/utils/dates';\n\nexport default moment;\n\nexport { displayDateRelativeToToday, generateCurrentInterval, splitIntervalString, timeInMillis };\n","define(\"connections-ui/utils/debug-backburner\", [\"exports\", \"ember-purecloud-components/utils/debug-backburner\"], function (_exports, _debugBackburner) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _debugBackburner.default;\n    }\n  });\n});\n","define(\"connections-ui/utils/debug-rsvp\", [\"exports\", \"ember-purecloud-components/utils/debug-rsvp\"], function (_exports, _debugRsvp) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _debugRsvp.default;\n    }\n  });\n});\n","define(\"connections-ui/utils/display-geolocation\", [\"exports\", \"ember-purecloud-components/utils/display-geolocation\"], function (_exports, _displayGeolocation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _displayGeolocation.default;\n    }\n  });\n});\n","define(\"connections-ui/utils/email-types/draft-type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","define(\"connections-ui/utils/email-types/email-type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","define(\"connections-ui/utils/email\", [\"exports\", \"ember-purecloud-components/utils/email\"], function (_exports, _email) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _email.default;\n    }\n  });\n});\n","define(\"connections-ui/utils/ember-types\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","const API_ERROR_MESSAGES = {\n    userNotAssignedNumber: 'USER_NOT_ASSIGNED_TO_NUMBER',\n    e911Support: 'NUMBER_DOES_NOT_SUPPORT_ENHANCED_911',\n    invalidCity: 'INVALID_CITY',\n    notValidNumber: 'PHONE_NUMBER_NOT_US_OR_CA'\n};\n\nconst getErrorString = function (err, defaultMessage) {\n    let errorMessage = defaultMessage || 'emergencyLocation.errors.e911LocationSet';\n\n    if (err.payload && err.payload.message) {\n        const messageType = err.payload.message;\n        switch (messageType) {\n            case API_ERROR_MESSAGES.userNotAssignedNumber:\n                errorMessage = 'emergencyLocation.errors.userNotAssignedNum';\n                break;\n            case API_ERROR_MESSAGES.e911Support:\n                errorMessage = 'emergencyLocation.errors.e911NotEligible';\n                break;\n            case API_ERROR_MESSAGES.invalidCity:\n                errorMessage = 'emergencyLocation.errors.invalidAddressProvided';\n                break;\n            case API_ERROR_MESSAGES.notValidNumber:\n                errorMessage = 'emergencyLocation.errors.e911NotEligible';\n                break;\n        }\n    }\n    return errorMessage;\n};\n\nexport default {\n    getErrorString\n};\n","const formattedEmoji = {\n    smiles: [\n        '😀',\n        '😁',\n        '😆',\n        '😂',\n        '😉',\n        '😏',\n        '😊',\n        '😍',\n        '😋',\n        '😎',\n        '😐',\n        '😣',\n        '😯',\n        '😫',\n        '😴',\n        '😌',\n        '😝',\n        '😜',\n        '😢',\n        '😭',\n        '😨',\n        '😰',\n        '😱',\n        '😠',\n        '😕',\n        '🙁',\n        '😮',\n        '😦',\n        '😧',\n        '😑',\n        '😶',\n        '😒',\n        '😬',\n        '😳',\n        '😞',\n        '😓',\n        '😅',\n        '😇',\n        '😔',\n        '😪',\n        '🥳',\n        '😷',\n        '😺',\n        '😹',\n        '😻',\n        '😼',\n        '🙀',\n        '😿',\n        '😾',\n        '🙈',\n        '🙉',\n        '🙊'\n    ],\n    people: {\n        defaultSkinTone: [\n            '👶',\n            '👦',\n            '👧',\n            '🧑',\n            '👨',\n            '👩',\n            '👴',\n            '👵',\n            '👨‍🎓',\n            '👩‍🎓',\n            '👨‍🏫',\n            '👩‍🏫',\n            '👨‍🌾',\n            '👩‍🌾',\n            '👨‍🍳',\n            '👩‍🍳',\n            '👨‍🔧',\n            '👩‍🔧',\n            '👨‍🏭',\n            '👩‍🏭',\n            '👨‍💼',\n            '👩‍💼',\n            '👨‍🔬',\n            '👩‍🔬',\n            '👨‍💻',\n            '👩‍💻',\n            '👨‍🎤',\n            '👩‍🎤',\n            '👨‍🎨',\n            '👩‍🎨',\n            '👨‍✈️',\n            '👩‍✈️',\n            '👨‍🚀',\n            '👩‍🚀',\n            '👨‍🚒',\n            '👩‍🚒',\n            '👮‍♂️',\n            '👮‍♀️',\n            '🕵️‍♂️',\n            '🕵️‍♀️',\n            '💂‍♂️',\n            '💂‍♀️',\n            '👷‍♂️',\n            '👷‍♀️',\n            '💇‍♂️',\n            '💇‍♀️',\n            '🚶',\n            '🏃',\n            '🛌',\n            '🏇',\n            '🏂',\n            '🏌',\n            '🏄',\n            '🚣',\n            '🏊',\n            '⛹',\n            '🏋',\n            '🚴',\n            '🚵',\n            '💪',\n            '👈',\n            '👉',\n            '👆',\n            '👇',\n            '🖐',\n            '✋',\n            '👌',\n            '👍',\n            '👎',\n            '👊',\n            '👋',\n            '🙌',\n            '👏'\n        ],\n        lightSkinTone: [\n            '👶🏻',\n            '👦🏻',\n            '👧🏻',\n            '🧑🏻',\n            '👨🏻',\n            '👩🏻',\n            '👴🏻',\n            '👵🏻',\n            '👨🏻‍🎓',\n            '👩🏻‍🎓',\n            '👨🏻‍🏫',\n            '👩🏻‍🏫',\n            '👨🏻‍🌾',\n            '👩🏻‍🌾',\n            '👨🏻‍🍳',\n            '👩🏻‍🍳',\n            '👨🏻‍🔧',\n            '👩🏻‍🔧',\n            '👨🏻‍🏭',\n            '👩🏻‍🏭',\n            '👨🏻‍💼',\n            '👩🏻‍💼',\n            '👨🏻‍🔬',\n            '👩🏻‍🔬',\n            '👨🏻‍💻',\n            '👩🏻‍💻',\n            '👨🏻‍🎤',\n            '👩🏻‍🎤',\n            '👨🏻‍🎨',\n            '👩🏻‍🎨',\n            '👨🏻‍✈️',\n            '👩🏻‍✈️',\n            '👨🏻‍🚀',\n            '👩🏻‍🚀',\n            '👨🏻‍🚒',\n            '👩🏻‍🚒',\n            '👮🏻‍♂️',\n            '👮🏻‍♀️',\n            '🕵🏻‍♂️',\n            '🕵🏻‍♀️',\n            '💂🏻‍♂️',\n            '💂🏻‍♀️',\n            '👷🏻‍♂️',\n            '👷🏻‍♀️',\n            '💇🏻‍♂️',\n            '💇🏻‍♀️',\n            '🚶🏻',\n            '🏃🏻',\n            '🛌🏻',\n            '🏇🏻',\n            '🏂🏻',\n            '🏌🏻',\n            '🏄🏻',\n            '🚣🏻',\n            '🏊🏻',\n            '⛹🏻',\n            '🏋🏻',\n            '🚴🏻',\n            '🚵🏻',\n            '💪🏻',\n            '👈🏻',\n            '👉🏻',\n            '👆🏻',\n            '👇🏻',\n            '🖐🏻',\n            '✋🏻',\n            '👌🏻',\n            '👍🏻',\n            '👎🏻',\n            '👊🏻',\n            '👋🏻',\n            '🙌🏻',\n            '👏🏻'\n        ],\n        mediumLightSkinTone: [\n            '👶🏼',\n            '👦🏼',\n            '👧🏼',\n            '🧑🏼',\n            '👨🏼',\n            '👩🏼',\n            '👴🏼',\n            '👵🏼',\n            '👨🏼‍🎓',\n            '👩🏼‍🎓',\n            '👨🏼‍🏫',\n            '👩🏼‍🏫',\n            '👨🏼‍🌾',\n            '👩🏼‍🌾',\n            '👨🏼‍🍳',\n            '👩🏼‍🍳',\n            '👨🏼‍🔧',\n            '👩🏼‍🔧',\n            '👨🏼‍🏭',\n            '👩🏼‍🏭',\n            '👨🏼‍💼',\n            '👩🏼‍💼',\n            '👨🏼‍🔬',\n            '👩🏼‍🔬',\n            '👨🏼‍💻',\n            '👩🏼‍💻',\n            '👨🏼‍🎤',\n            '👩🏼‍🎤',\n            '👨🏼‍🎨',\n            '👩🏼‍🎨',\n            '👨🏼‍✈️',\n            '👩🏼‍✈️',\n            '👨🏼‍🚀',\n            '👩🏼‍🚀',\n            '👨🏼‍🚒',\n            '👩🏼‍🚒',\n            '👮🏼‍♂️',\n            '👮🏼‍♀️',\n            '🕵🏼‍♂️',\n            '🕵🏼‍♀️',\n            '💂🏼‍♂️',\n            '💂🏼‍♀️',\n            '👷🏼‍♂️',\n            '👷🏼‍♀️',\n            '💇🏼‍♂️',\n            '💇🏼‍♀️',\n            '🚶🏼',\n            '🏃🏼',\n            '🛌🏼',\n            '🏇🏼',\n            '🏂🏼',\n            '🏌🏼',\n            '🏄🏼',\n            '🚣🏼',\n            '🏊🏼',\n            '⛹🏼',\n            '🏋🏼',\n            '🚴🏼',\n            '🚵🏼',\n            '💪🏼',\n            '👈🏼',\n            '👉🏼',\n            '👆🏼',\n            '👇🏼',\n            '🖐🏼',\n            '✋🏼',\n            '👌🏼',\n            '👍🏼',\n            '👎🏼',\n            '👊🏼',\n            '👋🏼',\n            '🙌🏼',\n            '👏🏼'\n        ],\n        mediumSkinTone: [\n            '👶🏽',\n            '👦🏽',\n            '👧🏽',\n            '🧑🏽',\n            '👨🏽',\n            '👩🏽',\n            '👴🏽',\n            '👵🏽',\n            '👨🏽‍🎓',\n            '👩🏽‍🎓',\n            '👨🏽‍🏫',\n            '👩🏽‍🏫',\n            '👨🏽‍🌾',\n            '👩🏽‍🌾',\n            '👨🏽‍🍳',\n            '👩🏽‍🍳',\n            '👨🏽‍🔧',\n            '👩🏽‍🔧',\n            '👨🏽‍🏭',\n            '👩🏽‍🏭',\n            '👨🏽‍💼',\n            '👩🏽‍💼',\n            '👨🏽‍🔬',\n            '👩🏽‍🔬',\n            '👨🏽‍💻',\n            '👩🏽‍💻',\n            '👨🏽‍🎤',\n            '👩🏽‍🎤',\n            '👨🏽‍🎨',\n            '👩🏽‍🎨',\n            '👨🏽‍✈️',\n            '👩🏽‍✈️',\n            '👨🏽‍🚀',\n            '👩🏽‍🚀',\n            '👨🏽‍🚒',\n            '👩🏽‍🚒',\n            '👮🏽‍♂️',\n            '👮🏽‍♀️',\n            '🕵🏽‍♂️',\n            '🕵🏽‍♀️',\n            '💂🏽‍♂️',\n            '💂🏽‍♀️',\n            '👷🏽‍♂️',\n            '👷🏽‍♀️',\n            '💇🏽‍♂️',\n            '💇🏽‍♀️',\n            '🚶🏽',\n            '🏃🏽',\n            '🛌🏽',\n            '🏇🏽',\n            '🏂🏽',\n            '🏌🏽',\n            '🏄🏽',\n            '🚣🏽',\n            '🏊🏽',\n            '⛹🏽',\n            '🏋🏽',\n            '🚴🏽',\n            '🚵🏽',\n            '💪🏽',\n            '👈🏽',\n            '👉🏽',\n            '👆🏽',\n            '👇🏽',\n            '🖐🏽',\n            '✋🏽',\n            '👌🏽',\n            '👍🏽',\n            '👎🏽',\n            '👊🏽',\n            '👋🏽',\n            '🙌🏽',\n            '👏🏽'\n        ],\n        mediumDarkSkinTone: [\n            '👶🏾',\n            '👦🏾',\n            '👧🏾',\n            '🧑🏾',\n            '👨🏾',\n            '👩🏾',\n            '👴🏾',\n            '👵🏾',\n            '👨🏾‍🎓',\n            '👩🏾‍🎓',\n            '👨🏾‍🏫',\n            '👩🏾‍🏫',\n            '👨🏾‍🌾',\n            '👩🏾‍🌾',\n            '👨🏾‍🍳',\n            '👩🏾‍🍳',\n            '👨🏾‍🔧',\n            '👩🏾‍🔧',\n            '👨🏾‍🏭',\n            '👩🏾‍🏭',\n            '👨🏾‍💼',\n            '👩🏾‍💼',\n            '👨🏾‍🔬',\n            '👩🏾‍🔬',\n            '👨🏾‍💻',\n            '👩🏾‍💻',\n            '👨🏾‍🎤',\n            '👩🏾‍🎤',\n            '👨🏾‍🎨',\n            '👩🏾‍🎨',\n            '👨🏾‍✈️',\n            '👩🏾‍✈️',\n            '👨🏾‍🚀',\n            '👩🏾‍🚀',\n            '👨🏾‍🚒',\n            '👩🏾‍🚒',\n            '👮🏾‍♂️',\n            '👮🏾‍♀️',\n            '🕵🏾‍♂️',\n            '🕵🏾‍♀️',\n            '💂🏾‍♂️',\n            '💂🏾‍♀️',\n            '👷🏾‍♂️',\n            '👷🏾‍♀️',\n            '💇🏾‍♂️',\n            '💇🏾‍♀️',\n            '🚶🏾',\n            '🏃🏾',\n            '🛌🏾',\n            '🏇🏾',\n            '🏂🏾',\n            '🏌🏾',\n            '🏄🏾',\n            '🚣🏾',\n            '🏊🏾',\n            '⛹🏾',\n            '🏋🏾',\n            '🚴🏾',\n            '🚵🏾',\n            '💪🏾',\n            '👈🏾',\n            '👉🏾',\n            '👆🏾',\n            '👇🏾',\n            '🖐🏾',\n            '✋🏾',\n            '👌🏾',\n            '👍🏾',\n            '👎🏾',\n            '👊🏾',\n            '👋🏾',\n            '🙌🏾',\n            '👏🏾'\n        ],\n        darkSkinTone: [\n            '👶🏿',\n            '👦🏿',\n            '👧🏿',\n            '🧑🏿',\n            '👨🏿',\n            '👩🏿',\n            '👴🏿',\n            '👵🏿',\n            '👨🏿‍🎓',\n            '👩🏿‍🎓',\n            '👨🏿‍🏫',\n            '👩🏿‍🏫',\n            '👨🏿‍🌾',\n            '👩🏿‍🌾',\n            '👨🏿‍🍳',\n            '👩🏿‍🍳',\n            '👨🏿‍🔧',\n            '👩🏿‍🔧',\n            '👨🏿‍🏭',\n            '👩🏿‍🏭',\n            '👨🏿‍💼',\n            '👩🏿‍💼',\n            '👨🏿‍🔬',\n            '👩🏿‍🔬',\n            '👨🏿‍💻',\n            '👩🏿‍💻',\n            '👨🏿‍🎤',\n            '👩🏿‍🎤',\n            '👨🏿‍🎨',\n            '👩🏿‍🎨',\n            '👨🏿‍✈️',\n            '👩🏿‍✈️',\n            '👨🏿‍🚀',\n            '👩🏿‍🚀',\n            '👨🏿‍🚒',\n            '👩🏿‍🚒',\n            '👮🏿‍♂️',\n            '👮🏿‍♀️',\n            '🕵🏿‍♂️',\n            '🕵🏿‍♀️',\n            '💂🏿‍♂️',\n            '💂🏿‍♀️',\n            '👷🏿‍♂️',\n            '👷🏿‍♀️',\n            '💇🏿‍♂️',\n            '💇🏿‍♀️',\n            '🚶🏿',\n            '🏃🏿',\n            '🛌🏿',\n            '🏇🏿',\n            '🏂🏿',\n            '🏌🏿',\n            '🏄🏿',\n            '🚣🏿',\n            '🏊🏿',\n            '⛹🏿',\n            '🏋🏿',\n            '🚴🏿',\n            '🚵🏿',\n            '💪🏿',\n            '👈🏿',\n            '👉🏿',\n            '👆🏿',\n            '👇🏿',\n            '🖐🏿',\n            '✋🏿',\n            '👌🏿',\n            '👍🏿',\n            '👎🏿',\n            '👊🏿',\n            '👋🏿',\n            '🙌🏿',\n            '👏🏿'\n        ]\n    },\n    nature: [\n        '🐒',\n        '🐕',\n        '🐈',\n        '🐅',\n        '🐆',\n        '🐎',\n        '🦌',\n        '🐄',\n        '🐖',\n        '🐑',\n        '🐐',\n        '🐪',\n        '🐘',\n        '🐁',\n        '🐇',\n        '🦃',\n        '🐓',\n        '🐤',\n        '🐦',\n        '🐧',\n        '🐊',\n        '🐢',\n        '🐍',\n        '🐉',\n        '🐳',\n        '🐬',\n        '🐟',\n        '🐙',\n        '🦀',\n        '🐌',\n        '🐛',\n        '🐜',\n        '🐝',\n        '🐞',\n        '🌻',\n        '🌼',\n        '🌷',\n        '🌲',\n        '🌳',\n        '🌵',\n        '🍀',\n        '🍇',\n        '🍉',\n        '🍊',\n        '🍋',\n        '🍌',\n        '🍍',\n        '🍎',\n        '🍏',\n        '🍐',\n        '🍑',\n        '🍒',\n        '🍓',\n        '🍅',\n        '🍆',\n        '🌽',\n        '🍄'\n    ],\n    objects: [\n        '👓',\n        '👔',\n        '👕',\n        '👖',\n        '👗',\n        '👛',\n        '👜',\n        '👞',\n        '👟',\n        '👠',\n        '👢',\n        '👑',\n        '🎓',\n        '💍',\n        '🍞',\n        '🧀',\n        '🍖',\n        '🍗',\n        '🍔',\n        '🍟',\n        '🍕',\n        '🌭',\n        '🌮',\n        '🌯',\n        '🍳',\n        '🍦',\n        '🍩',\n        '🍪',\n        '🎂',\n        '🍫',\n        '🍬',\n        '🍭',\n        '🍼',\n        '☕',\n        '🎭',\n        '🎨',\n        '🚂',\n        '🚃',\n        '🚇',\n        '🚋',\n        '🚌',\n        '🚑',\n        '🚒',\n        '🚓',\n        '🚕',\n        '🚗',\n        '🚚',\n        '🚜',\n        '🚲',\n        '🚏',\n        '⛵',\n        '🛶',\n        '🚤',\n        '🚢',\n        '🛫',\n        '🚁',\n        '🚀',\n        '⌚',\n        '⏰',\n        '⏱',\n        '⭐',\n        '🌈',\n        '🌂',\n        '☔',\n        '⛄',\n        '🌊',\n        '🎃',\n        '🎄',\n        '🎈',\n        '🎉',\n        '🎊',\n        '🎁',\n        '🏆',\n        '🏅',\n        '⚽',\n        '⚾',\n        '🏀',\n        '🏐',\n        '🏈',\n        '🏉',\n        '🎾',\n        '🎱',\n        '🎳',\n        '🏏',\n        '🏑',\n        '🏒',\n        '🏓',\n        '🏸',\n        '🎯',\n        '⛳',\n        '🎣',\n        '🎿',\n        '🎮',\n        '🎤',\n        '🎧',\n        '🎷',\n        '🎸',\n        '🎹',\n        '🎺',\n        '🎻',\n        '📢',\n        '📣',\n        '📱',\n        '📞',\n        '📠',\n        '🔋',\n        '💻',\n        '💿',\n        '📀',\n        '🎬',\n        '📺',\n        '📷',\n        '📹',\n        '📼',\n        '🔍',\n        '🔬',\n        '🔭',\n        '💡',\n        '🔦',\n        '📕',\n        '📖',\n        '📰',\n        '💰',\n        '💳',\n        '📦',\n        '📫',\n        '📪',\n        '📝',\n        '💼',\n        '📁',\n        '📅',\n        '📋',\n        '📎',\n        '📏',\n        '📐',\n        '🔑',\n        '🔨',\n        '🔧',\n        '🔌',\n        '📡',\n        '📌'\n    ],\n    places: [\n        '🌍',\n        '🌎',\n        '🗾',\n        '🌋',\n        '🗻',\n        '🏠',\n        '🏢',\n        '🏤',\n        '🏥',\n        '🏦',\n        '🏨',\n        '🏪',\n        '🏫',\n        '🏬',\n        '🏭',\n        '🏰',\n        '⛪',\n        '⛺',\n        '🌄',\n        '🌅',\n        '🌆',\n        '🌇',\n        '🌉',\n        '🎡',\n        '🎢',\n        '💈',\n        '📍',\n        '🇦🇨',\n        '🇦🇩',\n        '🇦🇪',\n        '🇦🇫',\n        '🇦🇬',\n        '🇦🇮',\n        '🇦🇱',\n        '🇦🇲',\n        '🇦🇴',\n        '🇦🇶',\n        '🇦🇷',\n        '🇦🇸',\n        '🇦🇹',\n        '🇦🇺',\n        '🇦🇼',\n        '🇦🇽',\n        '🇦🇿',\n        '🇧🇦',\n        '🇧🇧',\n        '🇧🇩',\n        '🇧🇪',\n        '🇧🇫',\n        '🇧🇬',\n        '🇧🇭',\n        '🇧🇮',\n        '🇧🇯',\n        '🇧🇱',\n        '🇧🇲',\n        '🇧🇳',\n        '🇧🇴',\n        '🇧🇶',\n        '🇧🇷',\n        '🇧🇸',\n        '🇧🇹',\n        '🇧🇻',\n        '🇧🇼',\n        '🇧🇾',\n        '🇧🇿',\n        '🇨🇦',\n        '🇨🇨',\n        '🇨🇩',\n        '🇨🇫',\n        '🇨🇬',\n        '🇨🇭',\n        '🇨🇮',\n        '🇨🇰',\n        '🇨🇱',\n        '🇨🇲',\n        '🇨🇳',\n        '🇨🇴',\n        '🇨🇵',\n        '🇨🇷',\n        '🇨🇺',\n        '🇨🇻',\n        '🇨🇼',\n        '🇨🇽',\n        '🇨🇾',\n        '🇨🇿',\n        '🇩🇪',\n        '🇩🇬',\n        '🇩🇯',\n        '🇩🇰',\n        '🇩🇲',\n        '🇩🇴',\n        '🇩🇿',\n        '🇪🇦',\n        '🇪🇨',\n        '🇪🇪',\n        '🇪🇬',\n        '🇪🇭',\n        '🇪🇷',\n        '🇪🇸',\n        '🇪🇹',\n        '🇪🇺',\n        '🇫🇮',\n        '🇫🇯',\n        '🇫🇰',\n        '🇫🇲',\n        '🇫🇴',\n        '🇫🇷',\n        '🇬🇦',\n        '🇬🇧',\n        '🇬🇩',\n        '🇬🇪',\n        '🇬🇫',\n        '🇬🇬',\n        '🇬🇭',\n        '🇬🇮',\n        '🇬🇱',\n        '🇬🇲',\n        '🇬🇳',\n        '🇬🇵',\n        '🇬🇶',\n        '🇬🇷',\n        '🇬🇸',\n        '🇬🇹',\n        '🇬🇺',\n        '🇬🇼',\n        '🇬🇾',\n        '🇭🇰',\n        '🇭🇲',\n        '🇭🇳',\n        '🇭🇷',\n        '🇭🇹',\n        '🇭🇺',\n        '🇮🇨',\n        '🇮🇩',\n        '🇮🇪',\n        '🇮🇱',\n        '🇮🇲',\n        '🇮🇳',\n        '🇮🇴',\n        '🇮🇶',\n        '🇮🇷',\n        '🇮🇸',\n        '🇮🇹',\n        '🇯🇪',\n        '🇯🇲',\n        '🇯🇴',\n        '🇯🇵',\n        '🇰🇪',\n        '🇰🇬',\n        '🇰🇭',\n        '🇰🇮',\n        '🇰🇲',\n        '🇰🇳',\n        '🇰🇵',\n        '🇰🇷',\n        '🇰🇼',\n        '🇰🇾',\n        '🇰🇿',\n        '🇱🇦',\n        '🇱🇧',\n        '🇱🇨',\n        '🇱🇮',\n        '🇱🇰',\n        '🇱🇷',\n        '🇱🇸',\n        '🇱🇹',\n        '🇱🇺',\n        '🇱🇻',\n        '🇱🇾',\n        '🇲🇦',\n        '🇲🇨',\n        '🇲🇩',\n        '🇲🇪',\n        '🇲🇫',\n        '🇲🇬',\n        '🇲🇭',\n        '🇲🇰',\n        '🇲🇱',\n        '🇲🇲',\n        '🇲🇳',\n        '🇲🇴',\n        '🇲🇵',\n        '🇲🇶',\n        '🇲🇷',\n        '🇲🇸',\n        '🇲🇹',\n        '🇲🇺',\n        '🇲🇻',\n        '🇲🇼',\n        '🇲🇽',\n        '🇲🇾',\n        '🇲🇿',\n        '🇳🇦',\n        '🇳🇨',\n        '🇳🇪',\n        '🇳🇫',\n        '🇳🇬',\n        '🇳🇮',\n        '🇳🇱',\n        '🇳🇴',\n        '🇳🇵',\n        '🇳🇷',\n        '🇳🇺',\n        '🇳🇿',\n        '🇴🇲',\n        '🇵🇦',\n        '🇵🇪',\n        '🇵🇫',\n        '🇵🇬',\n        '🇵🇭',\n        '🇵🇰',\n        '🇵🇱',\n        '🇵🇲',\n        '🇵🇳',\n        '🇵🇷',\n        '🇵🇸',\n        '🇵🇹',\n        '🇵🇼',\n        '🇵🇾',\n        '🇶🇦',\n        '🇷🇪',\n        '🇷🇴',\n        '🇷🇸',\n        '🇷🇺',\n        '🇷🇼',\n        '🇸🇦',\n        '🇸🇧',\n        '🇸🇨',\n        '🇸🇩',\n        '🇸🇪',\n        '🇸🇬',\n        '🇸🇭',\n        '🇸🇮',\n        '🇸🇯',\n        '🇸🇰',\n        '🇸🇱',\n        '🇸🇲',\n        '🇸🇳',\n        '🇸🇴',\n        '🇸🇷',\n        '🇸🇸',\n        '🇸🇹',\n        '🇸🇻',\n        '🇸🇽',\n        '🇸🇾',\n        '🇸🇿',\n        '🇹🇦',\n        '🇹🇨',\n        '🇹🇩',\n        '🇹🇫',\n        '🇹🇬',\n        '🇹🇭',\n        '🇹🇯',\n        '🇹🇰',\n        '🇹🇱',\n        '🇹🇲',\n        '🇹🇳',\n        '🇹🇴',\n        '🇹🇷',\n        '🇹🇹',\n        '🇹🇻',\n        '🇹🇼',\n        '🇹🇿',\n        '🇺🇦',\n        '🇺🇬',\n        '🇺🇸',\n        '🇺🇾',\n        '🇺🇿',\n        '🇻🇦',\n        '🇻🇨',\n        '🇻🇪',\n        '🇻🇬',\n        '🇻🇮',\n        '🇻🇳',\n        '🇻🇺',\n        '🇼🇫',\n        '🇼🇸',\n        '🇽🇰',\n        '🇾🇪',\n        '🇾🇹',\n        '🇿🇦',\n        '🇿🇲',\n        '🇿🇼'\n    ],\n    symbols: [\n        '🚦',\n        '🚧',\n        '⚡',\n        '🔈',\n        '🔔',\n        '🎵',\n        '💱',\n        '💲',\n        '📈',\n        '📉',\n        '📊',\n        '🔒',\n        '🔓',\n        '⛔',\n        '🚫',\n        '▶',\n        '⏩',\n        '⏭',\n        '⏯',\n        '⏪',\n        '⏮',\n        '⏸',\n        '⏹',\n        '⏺',\n        '✅',\n        '✔',\n        '✖',\n        '➕',\n        '➖',\n        '➗',\n        '‼',\n        '⁉',\n        '❔',\n        '❕',\n        '💯',\n        '🔀',\n        '🔁'\n    ]\n};\nexport default formattedEmoji;\n","const formattedEmoji = {\n    people: [\n        '😀',\n        '😁',\n        '😂',\n        '😉',\n        '😊',\n        '😋',\n        '😎',\n        '😐',\n        '😣',\n        '😯',\n        '😫',\n        '😴',\n        '😌',\n        '😜',\n        '😕',\n        '🙁',\n        '😳',\n        '😇',\n        '😺',\n        '😹',\n        '🙈',\n        '🙉',\n        '🙊',\n        '👶',\n        '👦',\n        '👧',\n        '👨',\n        '👩',\n        '👴',\n        '👵',\n        '👨‍🎓',\n        '👩‍🎓',\n        '👨‍🏫',\n        '👩‍🏫',\n        '👨‍🌾',\n        '👩‍🌾',\n        '👨‍🍳',\n        '👩‍🍳',\n        '👨‍🔧',\n        '👩‍🔧',\n        '👨‍🏭',\n        '👩‍🏭',\n        '👨‍💼',\n        '👩‍💼',\n        '👨‍🔬',\n        '👩‍🔬',\n        '👨‍💻',\n        '👩‍💻',\n        '👨‍🎤',\n        '👩‍🎤',\n        '👨‍🎨',\n        '👩‍🎨',\n        '👨‍✈️',\n        '👩‍✈️',\n        '👨‍🚀',\n        '👩‍🚀',\n        '👨‍🚒',\n        '👩‍🚒',\n        '👮',\n        '🕵',\n        '💂',\n        '👷',\n        '💇🏼',\n        '🚶',\n        '🏃',\n        '🛌',\n        '🏇',\n        '🏂',\n        '🏌',\n        '🏄',\n        '🚣',\n        '🏊',\n        '⛹',\n        '🏋',\n        '🚴',\n        '🚵',\n        '👪',\n        '👨‍👩‍👦',\n        '👨‍👩‍👧',\n        '👨‍👩‍👧‍👦',\n        '👨‍👩‍👦‍👦',\n        '👨‍👩‍👧‍👧',\n        '👨‍👨‍👦',\n        '👨‍👨‍👧',\n        '👨‍👨‍👧‍👦',\n        '👨‍👨‍👦‍👦',\n        '👨‍👨‍👧‍👧',\n        '👩‍👩‍👦',\n        '👩‍👩‍👧',\n        '👩‍👩‍👧‍👦',\n        '👩‍👩‍👦‍👦',\n        '👩‍👩‍👧‍👧',\n        '💪',\n        '👈',\n        '👉',\n        '☝',\n        '👇',\n        '✌',\n        '🖐',\n        '✋',\n        '👌',\n        '👍',\n        '👎',\n        '👊',\n        '👋',\n        '✍',\n        '👏'\n    ],\n    nature: [\n        '🐒',\n        '🐕',\n        '🐈',\n        '🐅',\n        '🐆',\n        '🐎',\n        '🦌',\n        '🐄',\n        '🐖',\n        '🐑',\n        '🐐',\n        '🐪',\n        '🐘',\n        '🐁',\n        '🐇',\n        '🦃',\n        '🐓',\n        '🐤',\n        '🐦',\n        '🐧',\n        '🐊',\n        '🐢',\n        '🐍',\n        '🐉',\n        '🐳',\n        '🐬',\n        '🐟',\n        '🐙',\n        '🦀',\n        '🐌',\n        '🐛',\n        '🐜',\n        '🐝',\n        '🐞',\n        '🌻',\n        '🌼',\n        '🌷',\n        '🌲',\n        '🌳',\n        '🌵',\n        '🍀',\n        '🍇',\n        '🍉',\n        '🍊',\n        '🍋',\n        '🍌',\n        '🍍',\n        '🍎',\n        '🍏',\n        '🍐',\n        '🍑',\n        '🍒',\n        '🍓',\n        '🍅',\n        '🍆',\n        '🌽',\n        '🍄'\n    ],\n    objects: [\n        '👓',\n        '👔',\n        '👕',\n        '👖',\n        '👗',\n        '👛',\n        '👜',\n        '👞',\n        '👟',\n        '👠',\n        '👢',\n        '👑',\n        '🎓',\n        '💍',\n        '🍞',\n        '🧀',\n        '🍖',\n        '🍗',\n        '🍔',\n        '🍟',\n        '🍕',\n        '🌭',\n        '🌮',\n        '🌯',\n        '🍳',\n        '🍦',\n        '🍩',\n        '🍪',\n        '🎂',\n        '🍫',\n        '🍬',\n        '🍭',\n        '🍼',\n        '☕',\n        '🎭',\n        '🎨',\n        '🚂',\n        '🚃',\n        '🚇',\n        '🚋',\n        '🚌',\n        '🚑',\n        '🚒',\n        '🚓',\n        '🚕',\n        '🚗',\n        '🚚',\n        '🚜',\n        '🚲',\n        '🚏',\n        '⛵',\n        '🛶',\n        '🚤',\n        '🚢',\n        '🛫',\n        '🚁',\n        '🚀',\n        '⌚',\n        '⏰',\n        '⏱',\n        '⭐',\n        '🌈',\n        '🌂',\n        '☔',\n        '⛄',\n        '🌊',\n        '🎃',\n        '🎄',\n        '🎈',\n        '🎉',\n        '🎊',\n        '🎁',\n        '🏆',\n        '🏅',\n        '⚽',\n        '⚾',\n        '🏀',\n        '🏐',\n        '🏈',\n        '🏉',\n        '🎾',\n        '🎱',\n        '🎳',\n        '🏏',\n        '🏑',\n        '🏒',\n        '🏓',\n        '🏸',\n        '🎯',\n        '⛳',\n        '🎣',\n        '🎿',\n        '🎮',\n        '🎤',\n        '🎧',\n        '🎷',\n        '🎸',\n        '🎹',\n        '🎺',\n        '🎻',\n        '📱',\n        '📞',\n        '📠',\n        '🔋',\n        '💻',\n        '💿',\n        '📀',\n        '🎬',\n        '📺',\n        '📷',\n        '📹',\n        '📼',\n        '🔍',\n        '🔬',\n        '🔭',\n        '💡',\n        '🔦',\n        '📕',\n        '📖',\n        '📰',\n        '💰',\n        '💳',\n        '📦',\n        '📫',\n        '📪',\n        '📝',\n        '💼',\n        '📁',\n        '📅',\n        '📋',\n        '📎',\n        '📏',\n        '📐',\n        '🔑',\n        '🔨',\n        '🔧',\n        '🔌',\n        '📡',\n        '📌'\n    ],\n    places: [\n        '🌍',\n        '🌎',\n        '🗾',\n        '🌋',\n        '🗻',\n        '🏠',\n        '🏢',\n        '🏤',\n        '🏥',\n        '🏦',\n        '🏨',\n        '🏪',\n        '🏫',\n        '🏬',\n        '🏭',\n        '🏰',\n        '⛪',\n        '⛺',\n        '🌄',\n        '🌅',\n        '🌆',\n        '🌇',\n        '🌉',\n        '🎡',\n        '🎢',\n        '💈',\n        '📍',\n        '🇦🇨',\n        '🇦🇩',\n        '🇦🇪',\n        '🇦🇫',\n        '🇦🇬',\n        '🇦🇮',\n        '🇦🇱',\n        '🇦🇲',\n        '🇦🇴',\n        '🇦🇶',\n        '🇦🇷',\n        '🇦🇸',\n        '🇦🇹',\n        '🇦🇺',\n        '🇦🇼',\n        '🇦🇽',\n        '🇦🇿',\n        '🇧🇦',\n        '🇧🇧',\n        '🇧🇩',\n        '🇧🇪',\n        '🇧🇫',\n        '🇧🇬',\n        '🇧🇭',\n        '🇧🇮',\n        '🇧🇯',\n        '🇧🇱',\n        '🇧🇲',\n        '🇧🇳',\n        '🇧🇴',\n        '🇧🇶',\n        '🇧🇷',\n        '🇧🇸',\n        '🇧🇹',\n        '🇧🇻',\n        '🇧🇼',\n        '🇧🇾',\n        '🇧🇿',\n        '🇨🇦',\n        '🇨🇨',\n        '🇨🇩',\n        '🇨🇫',\n        '🇨🇬',\n        '🇨🇭',\n        '🇨🇮',\n        '🇨🇰',\n        '🇨🇱',\n        '🇨🇲',\n        '🇨🇳',\n        '🇨🇴',\n        '🇨🇵',\n        '🇨🇷',\n        '🇨🇺',\n        '🇨🇻',\n        '🇨🇼',\n        '🇨🇽',\n        '🇨🇾',\n        '🇨🇿',\n        '🇩🇪',\n        '🇩🇬',\n        '🇩🇯',\n        '🇩🇰',\n        '🇩🇲',\n        '🇩🇴',\n        '🇩🇿',\n        '🇪🇦',\n        '🇪🇨',\n        '🇪🇪',\n        '🇪🇬',\n        '🇪🇭',\n        '🇪🇷',\n        '🇪🇸',\n        '🇪🇹',\n        '🇪🇺',\n        '🇫🇮',\n        '🇫🇯',\n        '🇫🇰',\n        '🇫🇲',\n        '🇫🇴',\n        '🇫🇷',\n        '🇬🇦',\n        '🇬🇧',\n        '🇬🇩',\n        '🇬🇪',\n        '🇬🇫',\n        '🇬🇬',\n        '🇬🇭',\n        '🇬🇮',\n        '🇬🇱',\n        '🇬🇲',\n        '🇬🇳',\n        '🇬🇵',\n        '🇬🇶',\n        '🇬🇷',\n        '🇬🇸',\n        '🇬🇹',\n        '🇬🇺',\n        '🇬🇼',\n        '🇬🇾',\n        '🇭🇰',\n        '🇭🇲',\n        '🇭🇳',\n        '🇭🇷',\n        '🇭🇹',\n        '🇭🇺',\n        '🇮🇨',\n        '🇮🇩',\n        '🇮🇪',\n        '🇮🇱',\n        '🇮🇲',\n        '🇮🇳',\n        '🇮🇴',\n        '🇮🇶',\n        '🇮🇷',\n        '🇮🇸',\n        '🇮🇹',\n        '🇯🇪',\n        '🇯🇲',\n        '🇯🇴',\n        '🇯🇵',\n        '🇰🇪',\n        '🇰🇬',\n        '🇰🇭',\n        '🇰🇮',\n        '🇰🇲',\n        '🇰🇳',\n        '🇰🇵',\n        '🇰🇷',\n        '🇰🇼',\n        '🇰🇾',\n        '🇰🇿',\n        '🇱🇦',\n        '🇱🇧',\n        '🇱🇨',\n        '🇱🇮',\n        '🇱🇰',\n        '🇱🇷',\n        '🇱🇸',\n        '🇱🇹',\n        '🇱🇺',\n        '🇱🇻',\n        '🇱🇾',\n        '🇲🇦',\n        '🇲🇨',\n        '🇲🇩',\n        '🇲🇪',\n        '🇲🇫',\n        '🇲🇬',\n        '🇲🇭',\n        '🇲🇰',\n        '🇲🇱',\n        '🇲🇲',\n        '🇲🇳',\n        '🇲🇴',\n        '🇲🇵',\n        '🇲🇶',\n        '🇲🇷',\n        '🇲🇸',\n        '🇲🇹',\n        '🇲🇺',\n        '🇲🇻',\n        '🇲🇼',\n        '🇲🇽',\n        '🇲🇾',\n        '🇲🇿',\n        '🇳🇦',\n        '🇳🇨',\n        '🇳🇪',\n        '🇳🇫',\n        '🇳🇬',\n        '🇳🇮',\n        '🇳🇱',\n        '🇳🇴',\n        '🇳🇵',\n        '🇳🇷',\n        '🇳🇺',\n        '🇳🇿',\n        '🇴🇲',\n        '🇵🇦',\n        '🇵🇪',\n        '🇵🇫',\n        '🇵🇬',\n        '🇵🇭',\n        '🇵🇰',\n        '🇵🇱',\n        '🇵🇲',\n        '🇵🇳',\n        '🇵🇷',\n        '🇵🇸',\n        '🇵🇹',\n        '🇵🇼',\n        '🇵🇾',\n        '🇶🇦',\n        '🇷🇪',\n        '🇷🇴',\n        '🇷🇸',\n        '🇷🇺',\n        '🇷🇼',\n        '🇸🇦',\n        '🇸🇧',\n        '🇸🇨',\n        '🇸🇩',\n        '🇸🇪',\n        '🇸🇬',\n        '🇸🇭',\n        '🇸🇮',\n        '🇸🇯',\n        '🇸🇰',\n        '🇸🇱',\n        '🇸🇲',\n        '🇸🇳',\n        '🇸🇴',\n        '🇸🇷',\n        '🇸🇸',\n        '🇸🇹',\n        '🇸🇻',\n        '🇸🇽',\n        '🇸🇾',\n        '🇸🇿',\n        '🇹🇦',\n        '🇹🇨',\n        '🇹🇩',\n        '🇹🇫',\n        '🇹🇬',\n        '🇹🇭',\n        '🇹🇯',\n        '🇹🇰',\n        '🇹🇱',\n        '🇹🇲',\n        '🇹🇳',\n        '🇹🇴',\n        '🇹🇷',\n        '🇹🇹',\n        '🇹🇻',\n        '🇹🇼',\n        '🇹🇿',\n        '🇺🇦',\n        '🇺🇬',\n        '🇺🇸',\n        '🇺🇾',\n        '🇺🇿',\n        '🇻🇦',\n        '🇻🇨',\n        '🇻🇪',\n        '🇻🇬',\n        '🇻🇮',\n        '🇻🇳',\n        '🇻🇺',\n        '🇼🇫',\n        '🇼🇸',\n        '🇽🇰',\n        '🇾🇪',\n        '🇾🇹',\n        '🇿🇦',\n        '🇿🇲',\n        '🇿🇼'\n    ],\n    symbols: [\n        '🚦',\n        '🚧',\n        '⚡',\n        '🔈',\n        '🔔',\n        '🎵',\n        '💱',\n        '💲',\n        '📈',\n        '📉',\n        '📊',\n        '🔒',\n        '🔓',\n        '⛔',\n        '🚫',\n        '▶',\n        '⏩',\n        '⏭',\n        '⏯',\n        '⏪',\n        '⏮',\n        '⏸',\n        '⏹',\n        '⏺',\n        '✅',\n        '✔',\n        '✖',\n        '➕',\n        '➖',\n        '➗',\n        '‼',\n        '⁉',\n        '❔',\n        '❕',\n        '💯',\n        '🔀',\n        '🔁'\n    ]\n};\nexport default formattedEmoji;\n","const formattedEmoji = {\n    smiles: [\n        '😀',\n        '😁',\n        '😂',\n        '😉',\n        '😊',\n        '😋',\n        '😎',\n        '😐',\n        '😣',\n        '😯',\n        '😫',\n        '😴',\n        '😌',\n        '😜',\n        '😕',\n        '🙁',\n        '😳',\n        '😇',\n        '😺',\n        '😹',\n        '🙈',\n        '🙉',\n        '🙊'\n    ],\n    people: {\n        defaultSkinTone: [\n            '👶',\n            '👦',\n            '👧',\n            '🧑',\n            '👨',\n            '👩',\n            '👴',\n            '👵',\n            '👨‍🎓',\n            '👩‍🎓',\n            '👨‍🏫',\n            '👩‍🏫',\n            '👨‍🌾',\n            '👩‍🌾',\n            '👨‍🍳',\n            '👩‍🍳',\n            '👨‍🔧',\n            '👩‍🔧',\n            '👨‍🏭',\n            '👩‍🏭',\n            '👨‍💼',\n            '👩‍💼',\n            '👨‍🔬',\n            '👩‍🔬',\n            '👨‍💻',\n            '👩‍💻',\n            '👨‍🎤',\n            '👩‍🎤',\n            '👨‍🎨',\n            '👩‍🎨',\n            '👨‍✈️',\n            '👩‍✈️',\n            '👨‍🚀',\n            '👩‍🚀',\n            '👨‍🚒',\n            '👩‍🚒',\n            '👮‍♂️',\n            '👮‍♀️',\n            '🕵️‍♂️',\n            '🕵️‍♀️',\n            '💂‍♂️',\n            '💂‍♀️',\n            '👷‍♂️',\n            '👷‍♀️',\n            '💇‍♂️',\n            '💇‍♀️',\n            '🚶',\n            '🏃',\n            '🛌',\n            '🏇',\n            '🏂',\n            '🏌',\n            '🏄',\n            '🚣',\n            '🏊',\n            '⛹',\n            '🏋',\n            '🚴',\n            '🚵',\n            '💪',\n            '👈',\n            '👉',\n            '👆',\n            '👇',\n            '🖐',\n            '✋',\n            '👌',\n            '👍',\n            '👎',\n            '👊',\n            '👋',\n            '👏'\n        ],\n        lightSkinTone: [\n            '👶🏻',\n            '👦🏻',\n            '👧🏻',\n            '🧑🏻',\n            '👨🏻',\n            '👩🏻',\n            '👴🏻',\n            '👵🏻',\n            '👨🏻‍🎓',\n            '👩🏻‍🎓',\n            '👨🏻‍🏫',\n            '👩🏻‍🏫',\n            '👨🏻‍🌾',\n            '👩🏻‍🌾',\n            '👨🏻‍🍳',\n            '👩🏻‍🍳',\n            '👨🏻‍🔧',\n            '👩🏻‍🔧',\n            '👨🏻‍🏭',\n            '👩🏻‍🏭',\n            '👨🏻‍💼',\n            '👩🏻‍💼',\n            '👨🏻‍🔬',\n            '👩🏻‍🔬',\n            '👨🏻‍💻',\n            '👩🏻‍💻',\n            '👨🏻‍🎤',\n            '👩🏻‍🎤',\n            '👨🏻‍🎨',\n            '👩🏻‍🎨',\n            '👨🏻‍✈️',\n            '👩🏻‍✈️',\n            '👨🏻‍🚀',\n            '👩🏻‍🚀',\n            '👨🏻‍🚒',\n            '👩🏻‍🚒',\n            '👮🏻‍♂️',\n            '👮🏻‍♀️',\n            '🕵🏻‍♂️',\n            '🕵🏻‍♀️',\n            '💂🏻‍♂️',\n            '💂🏻‍♀️',\n            '👷🏻‍♂️',\n            '👷🏻‍♀️',\n            '💇🏻‍♂️',\n            '💇🏻‍♀️',\n            '🚶🏻',\n            '🏃🏻',\n            '🛌🏻',\n            '🏇🏻',\n            '🏂🏻',\n            '🏌🏻',\n            '🏄🏻',\n            '🚣🏻',\n            '🏊🏻',\n            '⛹🏻',\n            '🏋🏻',\n            '🚴🏻',\n            '🚵🏻',\n            '💪🏻',\n            '👈🏻',\n            '👉🏻',\n            '👆🏻',\n            '👇🏻',\n            '🖐🏻',\n            '✋🏻',\n            '👌🏻',\n            '👍🏻',\n            '👎🏻',\n            '👊🏻',\n            '👋🏻',\n            '👏🏻'\n        ],\n        mediumLightSkinTone: [\n            '👶🏼',\n            '👦🏼',\n            '👧🏼',\n            '🧑🏼',\n            '👨🏼',\n            '👩🏼',\n            '👴🏼',\n            '👵🏼',\n            '👨🏼‍🎓',\n            '👩🏼‍🎓',\n            '👨🏼‍🏫',\n            '👩🏼‍🏫',\n            '👨🏼‍🌾',\n            '👩🏼‍🌾',\n            '👨🏼‍🍳',\n            '👩🏼‍🍳',\n            '👨🏼‍🔧',\n            '👩🏼‍🔧',\n            '👨🏼‍🏭',\n            '👩🏼‍🏭',\n            '👨🏼‍💼',\n            '👩🏼‍💼',\n            '👨🏼‍🔬',\n            '👩🏼‍🔬',\n            '👨🏼‍💻',\n            '👩🏼‍💻',\n            '👨🏼‍🎤',\n            '👩🏼‍🎤',\n            '👨🏼‍🎨',\n            '👩🏼‍🎨',\n            '👨🏼‍✈️',\n            '👩🏼‍✈️',\n            '👨🏼‍🚀',\n            '👩🏼‍🚀',\n            '👨🏼‍🚒',\n            '👩🏼‍🚒',\n            '👮🏼‍♂️',\n            '👮🏼‍♀️',\n            '🕵🏼‍♂️',\n            '🕵🏼‍♀️',\n            '💂🏼‍♂️',\n            '💂🏼‍♀️',\n            '👷🏼‍♂️',\n            '👷🏼‍♀️',\n            '💇🏼‍♂️',\n            '💇🏼‍♀️',\n            '🚶🏼',\n            '🏃🏼',\n            '🛌🏼',\n            '🏇🏼',\n            '🏂🏼',\n            '🏌🏼',\n            '🏄🏼',\n            '🚣🏼',\n            '🏊🏼',\n            '⛹🏼',\n            '🏋🏼',\n            '🚴🏼',\n            '🚵🏼',\n            '💪🏼',\n            '👈🏼',\n            '👉🏼',\n            '👆🏼',\n            '👇🏼',\n            '🖐🏼',\n            '✋🏼',\n            '👌🏼',\n            '👍🏼',\n            '👎🏼',\n            '👊🏼',\n            '👋🏼',\n            '👏🏼'\n        ],\n        mediumSkinTone: [\n            '👶🏽',\n            '👦🏽',\n            '👧🏽',\n            '🧑🏽',\n            '👨🏽',\n            '👩🏽',\n            '👴🏽',\n            '👵🏽',\n            '👨🏽‍🎓',\n            '👩🏽‍🎓',\n            '👨🏽‍🏫',\n            '👩🏽‍🏫',\n            '👨🏽‍🌾',\n            '👩🏽‍🌾',\n            '👨🏽‍🍳',\n            '👩🏽‍🍳',\n            '👨🏽‍🔧',\n            '👩🏽‍🔧',\n            '👨🏽‍🏭',\n            '👩🏽‍🏭',\n            '👨🏽‍💼',\n            '👩🏽‍💼',\n            '👨🏽‍🔬',\n            '👩🏽‍🔬',\n            '👨🏽‍💻',\n            '👩🏽‍💻',\n            '👨🏽‍🎤',\n            '👩🏽‍🎤',\n            '👨🏽‍🎨',\n            '👩🏽‍🎨',\n            '👨🏽‍✈️',\n            '👩🏽‍✈️',\n            '👨🏽‍🚀',\n            '👩🏽‍🚀',\n            '👨🏽‍🚒',\n            '👩🏽‍🚒',\n            '👮🏽‍♂️',\n            '👮🏽‍♀️',\n            '🕵🏽‍♂️',\n            '🕵🏽‍♀️',\n            '💂🏽‍♂️',\n            '💂🏽‍♀️',\n            '👷🏽‍♂️',\n            '👷🏽‍♀️',\n            '💇🏽‍♂️',\n            '💇🏽‍♀️',\n            '🚶🏽',\n            '🏃🏽',\n            '🛌🏽',\n            '🏇🏽',\n            '🏂🏽',\n            '🏌🏽',\n            '🏄🏽',\n            '🚣🏽',\n            '🏊🏽',\n            '⛹🏽',\n            '🏋🏽',\n            '🚴🏽',\n            '🚵🏽',\n            '💪🏽',\n            '👈🏽',\n            '👉🏽',\n            '👆🏽',\n            '👇🏽',\n            '🖐🏽',\n            '✋🏽',\n            '👌🏽',\n            '👍🏽',\n            '👎🏽',\n            '👊🏽',\n            '👋🏽',\n            '👏🏽'\n        ],\n        mediumDarkSkinTone: [\n            '👶🏾',\n            '👦🏾',\n            '👧🏾',\n            '🧑🏾',\n            '👨🏾',\n            '👩🏾',\n            '👴🏾',\n            '👵🏾',\n            '👨🏾‍🎓',\n            '👩🏾‍🎓',\n            '👨🏾‍🏫',\n            '👩🏾‍🏫',\n            '👨🏾‍🌾',\n            '👩🏾‍🌾',\n            '👨🏾‍🍳',\n            '👩🏾‍🍳',\n            '👨🏾‍🔧',\n            '👩🏾‍🔧',\n            '👨🏾‍🏭',\n            '👩🏾‍🏭',\n            '👨🏾‍💼',\n            '👩🏾‍💼',\n            '👨🏾‍🔬',\n            '👩🏾‍🔬',\n            '👨🏾‍💻',\n            '👩🏾‍💻',\n            '👨🏾‍🎤',\n            '👩🏾‍🎤',\n            '👨🏾‍🎨',\n            '👩🏾‍🎨',\n            '👨🏾‍✈️',\n            '👩🏾‍✈️',\n            '👨🏾‍🚀',\n            '👩🏾‍🚀',\n            '👨🏾‍🚒',\n            '👩🏾‍🚒',\n            '👮🏾‍♂️',\n            '👮🏾‍♀️',\n            '🕵🏾‍♂️',\n            '🕵🏾‍♀️',\n            '💂🏾‍♂️',\n            '💂🏾‍♀️',\n            '👷🏾‍♂️',\n            '👷🏾‍♀️',\n            '💇🏾‍♂️',\n            '💇🏾‍♀️',\n            '🚶🏾',\n            '🏃🏾',\n            '🛌🏾',\n            '🏇🏾',\n            '🏂🏾',\n            '🏌🏾',\n            '🏄🏾',\n            '🚣🏾',\n            '🏊🏾',\n            '⛹🏾',\n            '🏋🏾',\n            '🚴🏾',\n            '🚵🏾',\n            '💪🏾',\n            '👈🏾',\n            '👉🏾',\n            '👆🏾',\n            '👇🏾',\n            '🖐🏾',\n            '✋🏾',\n            '👌🏾',\n            '👍🏾',\n            '👎🏾',\n            '👊🏾',\n            '👋🏾',\n            '👏🏾'\n        ],\n        darkSkinTone: [\n            '👶🏿',\n            '👦🏿',\n            '👧🏿',\n            '🧑🏿',\n            '👨🏿',\n            '👩🏿',\n            '👴🏿',\n            '👵🏿',\n            '👨🏿‍🎓',\n            '👩🏿‍🎓',\n            '👨🏿‍🏫',\n            '👩🏿‍🏫',\n            '👨🏿‍🌾',\n            '👩🏿‍🌾',\n            '👨🏿‍🍳',\n            '👩🏿‍🍳',\n            '👨🏿‍🔧',\n            '👩🏿‍🔧',\n            '👨🏿‍🏭',\n            '👩🏿‍🏭',\n            '👨🏿‍💼',\n            '👩🏿‍💼',\n            '👨🏿‍🔬',\n            '👩🏿‍🔬',\n            '👨🏿‍💻',\n            '👩🏿‍💻',\n            '👨🏿‍🎤',\n            '👩🏿‍🎤',\n            '👨🏿‍🎨',\n            '👩🏿‍🎨',\n            '👨🏿‍✈️',\n            '👩🏿‍✈️',\n            '👨🏿‍🚀',\n            '👩🏿‍🚀',\n            '👨🏿‍🚒',\n            '👩🏿‍🚒',\n            '👮🏿‍♂️',\n            '👮🏿‍♀️',\n            '🕵🏿‍♂️',\n            '🕵🏿‍♀️',\n            '💂🏿‍♂️',\n            '💂🏿‍♀️',\n            '👷🏿‍♂️',\n            '👷🏿‍♀️',\n            '💇🏿‍♂️',\n            '💇🏿‍♀️',\n            '🚶🏿',\n            '🏃🏿',\n            '🛌🏿',\n            '🏇🏿',\n            '🏂🏿',\n            '🏌🏿',\n            '🏄🏿',\n            '🚣🏿',\n            '🏊🏿',\n            '⛹🏿',\n            '🏋🏿',\n            '🚴🏿',\n            '🚵🏿',\n            '💪🏿',\n            '👈🏿',\n            '👉🏿',\n            '👆🏿',\n            '👇🏿',\n            '🖐🏿',\n            '✋🏿',\n            '👌🏿',\n            '👍🏿',\n            '👎🏿',\n            '👊🏿',\n            '👋🏿',\n            '👏🏿'\n        ]\n    },\n    nature: [\n        '🐒',\n        '🐕',\n        '🐈',\n        '🐅',\n        '🐆',\n        '🐎',\n        '🦌',\n        '🐄',\n        '🐖',\n        '🐑',\n        '🐐',\n        '🐪',\n        '🐘',\n        '🐁',\n        '🐇',\n        '🦃',\n        '🐓',\n        '🐤',\n        '🐦',\n        '🐧',\n        '🐊',\n        '🐢',\n        '🐍',\n        '🐉',\n        '🐳',\n        '🐬',\n        '🐟',\n        '🐙',\n        '🦀',\n        '🐌',\n        '🐛',\n        '🐜',\n        '🐝',\n        '🐞',\n        '🌻',\n        '🌼',\n        '🌷',\n        '🌲',\n        '🌳',\n        '🌵',\n        '🍀',\n        '🍇',\n        '🍉',\n        '🍊',\n        '🍋',\n        '🍌',\n        '🍍',\n        '🍎',\n        '🍏',\n        '🍐',\n        '🍑',\n        '🍒',\n        '🍓',\n        '🍅',\n        '🍆',\n        '🌽',\n        '🍄'\n    ],\n    objects: [\n        '👓',\n        '👔',\n        '👕',\n        '👖',\n        '👗',\n        '👛',\n        '👜',\n        '👞',\n        '👟',\n        '👠',\n        '👢',\n        '👑',\n        '🎓',\n        '💍',\n        '🍞',\n        '🧀',\n        '🍖',\n        '🍗',\n        '🍔',\n        '🍟',\n        '🍕',\n        '🌭',\n        '🌮',\n        '🌯',\n        '🍳',\n        '🍦',\n        '🍩',\n        '🍪',\n        '🎂',\n        '🍫',\n        '🍬',\n        '🍭',\n        '🍼',\n        '☕',\n        '🎭',\n        '🎨',\n        '🚂',\n        '🚃',\n        '🚇',\n        '🚋',\n        '🚌',\n        '🚑',\n        '🚒',\n        '🚓',\n        '🚕',\n        '🚗',\n        '🚚',\n        '🚜',\n        '🚲',\n        '🚏',\n        '⛵',\n        '🛶',\n        '🚤',\n        '🚢',\n        '🛫',\n        '🚁',\n        '🚀',\n        '⌚',\n        '⏰',\n        '⏱',\n        '⭐',\n        '🌈',\n        '🌂',\n        '☔',\n        '⛄',\n        '🌊',\n        '🎃',\n        '🎄',\n        '🎈',\n        '🎉',\n        '🎊',\n        '🎁',\n        '🏆',\n        '🏅',\n        '⚽',\n        '⚾',\n        '🏀',\n        '🏐',\n        '🏈',\n        '🏉',\n        '🎾',\n        '🎱',\n        '🎳',\n        '🏏',\n        '🏑',\n        '🏒',\n        '🏓',\n        '🏸',\n        '🎯',\n        '⛳',\n        '🎣',\n        '🎿',\n        '🎮',\n        '🎤',\n        '🎧',\n        '🎷',\n        '🎸',\n        '🎹',\n        '🎺',\n        '🎻',\n        '📱',\n        '📞',\n        '📠',\n        '🔋',\n        '💻',\n        '💿',\n        '📀',\n        '🎬',\n        '📺',\n        '📷',\n        '📹',\n        '📼',\n        '🔍',\n        '🔬',\n        '🔭',\n        '💡',\n        '🔦',\n        '📕',\n        '📖',\n        '📰',\n        '💰',\n        '💳',\n        '📦',\n        '📫',\n        '📪',\n        '📝',\n        '💼',\n        '📁',\n        '📅',\n        '📋',\n        '📎',\n        '📏',\n        '📐',\n        '🔑',\n        '🔨',\n        '🔧',\n        '🔌',\n        '📡',\n        '📌'\n    ],\n    places: [\n        '🌍',\n        '🌎',\n        '🗾',\n        '🌋',\n        '🗻',\n        '🏠',\n        '🏢',\n        '🏤',\n        '🏥',\n        '🏦',\n        '🏨',\n        '🏪',\n        '🏫',\n        '🏬',\n        '🏭',\n        '🏰',\n        '⛪',\n        '⛺',\n        '🌄',\n        '🌅',\n        '🌆',\n        '🌇',\n        '🌉',\n        '🎡',\n        '🎢',\n        '💈',\n        '📍',\n        '🇦🇨',\n        '🇦🇩',\n        '🇦🇪',\n        '🇦🇫',\n        '🇦🇬',\n        '🇦🇮',\n        '🇦🇱',\n        '🇦🇲',\n        '🇦🇴',\n        '🇦🇶',\n        '🇦🇷',\n        '🇦🇸',\n        '🇦🇹',\n        '🇦🇺',\n        '🇦🇼',\n        '🇦🇽',\n        '🇦🇿',\n        '🇧🇦',\n        '🇧🇧',\n        '🇧🇩',\n        '🇧🇪',\n        '🇧🇫',\n        '🇧🇬',\n        '🇧🇭',\n        '🇧🇮',\n        '🇧🇯',\n        '🇧🇱',\n        '🇧🇲',\n        '🇧🇳',\n        '🇧🇴',\n        '🇧🇶',\n        '🇧🇷',\n        '🇧🇸',\n        '🇧🇹',\n        '🇧🇻',\n        '🇧🇼',\n        '🇧🇾',\n        '🇧🇿',\n        '🇨🇦',\n        '🇨🇨',\n        '🇨🇩',\n        '🇨🇫',\n        '🇨🇬',\n        '🇨🇭',\n        '🇨🇮',\n        '🇨🇰',\n        '🇨🇱',\n        '🇨🇲',\n        '🇨🇳',\n        '🇨🇴',\n        '🇨🇵',\n        '🇨🇷',\n        '🇨🇺',\n        '🇨🇻',\n        '🇨🇼',\n        '🇨🇽',\n        '🇨🇾',\n        '🇨🇿',\n        '🇩🇪',\n        '🇩🇬',\n        '🇩🇯',\n        '🇩🇰',\n        '🇩🇲',\n        '🇩🇴',\n        '🇩🇿',\n        '🇪🇦',\n        '🇪🇨',\n        '🇪🇪',\n        '🇪🇬',\n        '🇪🇭',\n        '🇪🇷',\n        '🇪🇸',\n        '🇪🇹',\n        '🇪🇺',\n        '🇫🇮',\n        '🇫🇯',\n        '🇫🇰',\n        '🇫🇲',\n        '🇫🇴',\n        '🇫🇷',\n        '🇬🇦',\n        '🇬🇧',\n        '🇬🇩',\n        '🇬🇪',\n        '🇬🇫',\n        '🇬🇬',\n        '🇬🇭',\n        '🇬🇮',\n        '🇬🇱',\n        '🇬🇲',\n        '🇬🇳',\n        '🇬🇵',\n        '🇬🇶',\n        '🇬🇷',\n        '🇬🇸',\n        '🇬🇹',\n        '🇬🇺',\n        '🇬🇼',\n        '🇬🇾',\n        '🇭🇰',\n        '🇭🇲',\n        '🇭🇳',\n        '🇭🇷',\n        '🇭🇹',\n        '🇭🇺',\n        '🇮🇨',\n        '🇮🇩',\n        '🇮🇪',\n        '🇮🇱',\n        '🇮🇲',\n        '🇮🇳',\n        '🇮🇴',\n        '🇮🇶',\n        '🇮🇷',\n        '🇮🇸',\n        '🇮🇹',\n        '🇯🇪',\n        '🇯🇲',\n        '🇯🇴',\n        '🇯🇵',\n        '🇰🇪',\n        '🇰🇬',\n        '🇰🇭',\n        '🇰🇮',\n        '🇰🇲',\n        '🇰🇳',\n        '🇰🇵',\n        '🇰🇷',\n        '🇰🇼',\n        '🇰🇾',\n        '🇰🇿',\n        '🇱🇦',\n        '🇱🇧',\n        '🇱🇨',\n        '🇱🇮',\n        '🇱🇰',\n        '🇱🇷',\n        '🇱🇸',\n        '🇱🇹',\n        '🇱🇺',\n        '🇱🇻',\n        '🇱🇾',\n        '🇲🇦',\n        '🇲🇨',\n        '🇲🇩',\n        '🇲🇪',\n        '🇲🇫',\n        '🇲🇬',\n        '🇲🇭',\n        '🇲🇰',\n        '🇲🇱',\n        '🇲🇲',\n        '🇲🇳',\n        '🇲🇴',\n        '🇲🇵',\n        '🇲🇶',\n        '🇲🇷',\n        '🇲🇸',\n        '🇲🇹',\n        '🇲🇺',\n        '🇲🇻',\n        '🇲🇼',\n        '🇲🇽',\n        '🇲🇾',\n        '🇲🇿',\n        '🇳🇦',\n        '🇳🇨',\n        '🇳🇪',\n        '🇳🇫',\n        '🇳🇬',\n        '🇳🇮',\n        '🇳🇱',\n        '🇳🇴',\n        '🇳🇵',\n        '🇳🇷',\n        '🇳🇺',\n        '🇳🇿',\n        '🇴🇲',\n        '🇵🇦',\n        '🇵🇪',\n        '🇵🇫',\n        '🇵🇬',\n        '🇵🇭',\n        '🇵🇰',\n        '🇵🇱',\n        '🇵🇲',\n        '🇵🇳',\n        '🇵🇷',\n        '🇵🇸',\n        '🇵🇹',\n        '🇵🇼',\n        '🇵🇾',\n        '🇶🇦',\n        '🇷🇪',\n        '🇷🇴',\n        '🇷🇸',\n        '🇷🇺',\n        '🇷🇼',\n        '🇸🇦',\n        '🇸🇧',\n        '🇸🇨',\n        '🇸🇩',\n        '🇸🇪',\n        '🇸🇬',\n        '🇸🇭',\n        '🇸🇮',\n        '🇸🇯',\n        '🇸🇰',\n        '🇸🇱',\n        '🇸🇲',\n        '🇸🇳',\n        '🇸🇴',\n        '🇸🇷',\n        '🇸🇸',\n        '🇸🇹',\n        '🇸🇻',\n        '🇸🇽',\n        '🇸🇾',\n        '🇸🇿',\n        '🇹🇦',\n        '🇹🇨',\n        '🇹🇩',\n        '🇹🇫',\n        '🇹🇬',\n        '🇹🇭',\n        '🇹🇯',\n        '🇹🇰',\n        '🇹🇱',\n        '🇹🇲',\n        '🇹🇳',\n        '🇹🇴',\n        '🇹🇷',\n        '🇹🇹',\n        '🇹🇻',\n        '🇹🇼',\n        '🇹🇿',\n        '🇺🇦',\n        '🇺🇬',\n        '🇺🇸',\n        '🇺🇾',\n        '🇺🇿',\n        '🇻🇦',\n        '🇻🇨',\n        '🇻🇪',\n        '🇻🇬',\n        '🇻🇮',\n        '🇻🇳',\n        '🇻🇺',\n        '🇼🇫',\n        '🇼🇸',\n        '🇽🇰',\n        '🇾🇪',\n        '🇾🇹',\n        '🇿🇦',\n        '🇿🇲',\n        '🇿🇼'\n    ],\n    symbols: [\n        '🚦',\n        '🚧',\n        '⚡',\n        '🔈',\n        '🔔',\n        '🎵',\n        '💱',\n        '💲',\n        '📈',\n        '📉',\n        '📊',\n        '🔒',\n        '🔓',\n        '⛔',\n        '🚫',\n        '▶',\n        '⏩',\n        '⏭',\n        '⏯',\n        '⏪',\n        '⏮',\n        '⏸',\n        '⏹',\n        '⏺',\n        '✅',\n        '✔',\n        '✖',\n        '➕',\n        '➖',\n        '➗',\n        '‼',\n        '⁉',\n        '❔',\n        '❕',\n        '💯',\n        '🔀',\n        '🔁'\n    ]\n};\nexport default formattedEmoji;\n","define(\"connections-ui/utils/emoji\", [\"exports\", \"ember-purecloud-components/utils/emoji\"], function (_exports, _emoji) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emoji.default;\n    }\n  });\n});\n","import _ from 'lodash';\n\nimport { BASE_GROUP_FIELDS, BASE_GROUP } from '../models/group';\nimport { BASE_LOCATION_FIELDS, BASE_LOCATION } from '../models/location';\nimport { BASE_PERSON_FIELDS, BASE_PERSON } from '../models/person';\n\nexport const MULTI_ENTITY_FIELDS = _.uniq(\n    [].concat(BASE_GROUP_FIELDS).concat(BASE_LOCATION_FIELDS).concat(BASE_PERSON_FIELDS)\n);\n\nexport const FL = {\n    all: {\n        fl: MULTI_ENTITY_FIELDS.join(',')\n    },\n    group: {\n        fl: BASE_GROUP\n    },\n    person: BASE_PERSON,\n    location: BASE_LOCATION\n};\n","export default ['error.ininedgecontrol.sesion.inactive'];\n","import Ember from 'ember';\n\nconst HTMLChars = [\n    {\n        char: '&',\n        escaped: '&amp;'\n    },\n    {\n        char: '<',\n        escaped: '&lt;'\n    },\n    {\n        char: '>',\n        escaped: '&gt;'\n    },\n    {\n        char: '\"',\n        escaped: '&quot;'\n    },\n    {\n        char: \"'\",\n        escaped: '&apos;'\n    }\n];\n\nfunction regExpEscape(literal_string) {\n    return literal_string.replace(/[-[\\]{}()*+!<=:?.\\/\\\\^$|#\\s,]/g, '\\\\$&');\n}\n\nexport default function escape(obj) {\n    if (obj === null || typeof obj === 'function') {\n        return null;\n    }\n    if (typeof obj === 'string') {\n        const escapedString = Ember.Handlebars.Utils.escapeExpression(obj);\n        // [RELATE-2592] allow single quotes to make it through the escape pass\n        return escapedString.replace(/&#x27;/g, `'`);\n    }\n    if (typeof obj !== 'object') {\n        return obj;\n    }\n    const clone = JSON.parse(JSON.stringify(obj));\n    Object.keys(clone).forEach(k => {\n        clone[k] = escape(clone[k]);\n    });\n    // maintain keys with value of undefined (these get lost in the clone)\n    Object.keys(obj).forEach(k => {\n        // fixup SafeString items that looked like objects\n        if (Ember.String.isHTMLSafe(obj[k])) {\n            clone[k] = obj[k].toString();\n        }\n        if (Object.prototype.hasOwnProperty.call(obj, k) && typeof obj[k] === 'undefined') {\n            clone[k] = undefined;\n        }\n    });\n    return clone;\n}\n\nexport function unescape(obj) {\n    if (typeof obj === 'string') {\n        let theString = obj;\n        HTMLChars.forEach(char => {\n            // replaceAll isn't available until Chrome 85, so unit tests failed\n            // This regex method works, just not as clean\n            theString = theString.replace(new RegExp(regExpEscape(char.escaped), 'g'), char.char);\n        });\n\n        return theString;\n    } else {\n        return obj;\n    }\n}\n","class ExponentialIntervalGenerator {\n    constructor(maxInterval, baselineInterval = 0) {\n        this._failures = 0;\n        this._baselineInterval = baselineInterval;\n        this._maxAdditionalInterval = maxInterval - baselineInterval;\n    }\n\n    fail() {\n        this._failures++;\n    }\n\n    reset() {\n        this._failures = 0;\n    }\n\n    getInterval() {\n        /*\n         The max interval is determined by the following equation:\n\n         2^k - 1\n\n         We then multiple it by 1000 to convert it to milliseconds.\n         */\n        var expInterval = (Math.pow(2, this._failures) - 1) * 1000;\n        var generatedMaxInterval = Math.min(expInterval, this._maxAdditionalInterval);\n\n        // Get a random interval amount so that we don't flood the server with reconnect\n        // requests from every single user at the same time.\n        var interval = this._baselineInterval + Math.random() * generatedMaxInterval;\n        return interval;\n    }\n}\n\nexport default ExponentialIntervalGenerator;\n","import { messagingChannelTypes, getDisplayOrScreenName, messagingChannelTypeFor } from './message-channels';\nimport Ember from 'ember';\nimport { CHANNEL_MODEL_TYPE } from 'connections-ui/services/relate';\n\nexport const I18N_INFO = {\n    updateChannelInfoPrompt: 'purecloud.acdInteraction.relate.displayProfile.updateChannelInfoPrompt',\n    updateChannelInfoPromptPlural: 'purecloud.acdInteraction.relate.displayProfile.updateChannelInfoPromptPlural',\n    updateAllChannelInfoPrompt: 'purecloud.acdInteraction.relate.displayProfile.updateAllChannelInfoPrompt',\n    newChannelPrompt: 'purecloud.acdInteraction.relate.displayProfile.newChannelPrompt',\n    pleaseWaitForFullContactInfo: 'purecloud.acdInteraction.relate.displayProfile.pleaseWaitForFullContactInfo',\n    propertyChanged: 'purecloud.acdInteraction.relate.channelTypes'\n};\n\nexport const ID = 'id';\nexport const IDS = 'ids';\nexport const USER_ID = 'userId';\nconst CHANNEL_ID_PROPERTY = 'channelIdProperty';\nconst CHANNEL_TYPE = 'type';\nconst IS_NEW_CHANNEL = 'isNewChannel';\nconst AGENT_RESPONDED_TO_PROMPT = 'agentRespondedToPrompt';\nconst CHANGES_IGNORED_BY_AGENT = 'changesIgnoredByAgent';\n\nexport const CHANNEL_RECORD_PROPERTIES = [\n    CHANNEL_TYPE,\n    CHANNEL_ID_PROPERTY,\n    IS_NEW_CHANNEL,\n    CHANGES_IGNORED_BY_AGENT,\n    AGENT_RESPONDED_TO_PROMPT,\n    USER_ID,\n    IDS,\n    ID\n];\n\n// Refer to the message-interaction.js MESSENGER_TYPE const for these values.  Could use DRYing\nexport const KNOWN_INBOUND_MESSAGE_SUBTYPES = [\n    ...messagingChannelTypes.map(messagingChannelType => messagingChannelType.type)\n];\n\n/**\n * Used to return the \"class\" of an Ember component `call`ing this function; e.g.\n * `componentClassName.call(this)`\n *\n * Used primarily to include a query parameter in a REST endpoint call to identify a component responsible for making the call.\n */\nexport function componentClassName() {\n    try {\n        return encodeURIComponent(this.toString());\n    } catch (e) {\n        return 'COMPONENT_UNKNOWN';\n    }\n}\n\nexport function isInboundMessageType(interaction) {\n    return interaction && KNOWN_INBOUND_MESSAGE_SUBTYPES.includes(getMessengerType(interaction));\n}\n\nexport function getMessengerType(interaction) {\n    return interaction && interaction.get('subMessageType');\n}\n\nexport function getIdentifier(interaction) {\n    if (!interaction) {\n        return null;\n    }\n\n    const messagingChannelType = messagingChannelTypeFor(getMessengerType(interaction));\n    return messagingChannelType && messagingChannelType.getReverseWhitepagesLookupValue(interaction);\n}\n\nexport function getDisplayableName(interaction) {\n    return interaction && interaction.get('participantForCustomer.messages.firstObject.fromAddress.addressDisplayable');\n}\n\nexport function isNewId(id, messengerType, externalContact) {\n    if (!externalContact) {\n        return true; // If the caller supplies no externalContact instance, then consider the id as being new\n    }\n    const messagingChannelType = messagingChannelTypes.find(mct => {\n        return mct.type === messengerType;\n    });\n    if (!messagingChannelType) {\n        return false; // An unrecognized messenger type, so can't determine if the ID is new or not, so return\n    }\n\n    return messagingChannelType.isNewId(messagingChannelType.getIdsFromExternalContact(externalContact), id);\n}\n\nexport function getMessageChannelType(messengerType) {\n    return messagingChannelTypes.find(messagingChannelType => {\n        return messagingChannelType.type === messengerType;\n    });\n}\n\n// Returns an external contact channel object that's specific to the interaction's `subMessageType` type,\n// populated with properties mapping to Relate's Java message channel type models (e.g. FacebookId, LineId, TwitterId, and WhatsappId).\nexport function getInteractionChannel(interaction, logger = null) {\n    if (!interaction) {\n        return null;\n    }\n    const interactionId = interaction.get('id');\n    const interactionType = interaction.get('type');\n    const messengerType = getMessengerType(interaction);\n    const messagingChannelType = messagingChannelTypeFor(messengerType);\n\n    if (!messagingChannelType) {\n        if (logger) {\n            logger.error(\n                `ACD Relate: Could not determine the messenger channel type for interaction id \"${interactionId}\" where messenger type is \"${messengerType}\" and the interaction type is \"${interactionType}\"`\n            );\n        }\n        return null;\n    }\n    const id = getIdentifier(interaction);\n    const displayOrScreenName = getDisplayOrScreenName(interaction);\n    const handle = getDisplayableName(interaction); // Returns undefined if not a Twitter interaction and that's OK because the other modelProperties functions will just ognore it\n\n    return messagingChannelType.modelProperties(id, displayOrScreenName, handle);\n}\n\nexport function notExcluded(key) {\n    return !CHANNEL_RECORD_PROPERTIES.includes(key);\n}\n\n/**\n * Sets new values into the channel record for purposes of change detection\n * @param interactionChannelProperties An object with properties and values based on a channel-record; e.g. for Facebook:\n * { displayName: 'Don Herkimer', ids: [ { scopedId: '23456' } ] }.  The source of \"new\" values for the channel gotten\n * from an interaction.\n * @param isNewChannel true if this is a new channel for the contact\n * @param contact An external contact that may (or may not) already have a channel for this interaction.  The source of\n * \"old\" values for the channel.\n * @param channelIdProperty E.g. 'id', 'ids', 'phoneNumber' etc. (see the message-channels util for details)\n * @param idPropertyName E.g. 'userId' or 'scopedId', if the channel is capable of having an array of ID objects\n * whose every key is the given property name.  Null otherwise.\n * @param channelRecord A channel-record model instance that will track changed attributes (ref. Ember DS.Model's changedAttributes method)\n */\nexport function setNewValuesInChannelRecord(\n    interactionChannelProperties,\n    isNewChannel,\n    contact,\n    channelIdProperty,\n    idPropertyName,\n    channelRecord\n) {\n    const messagingChannelType = messagingChannelTypeFor(channelRecord.get('type'));\n    // Iterate over the interaction's channel-related properties to get potentially new values\n    Object.keys(interactionChannelProperties).forEach(key => {\n        const modelKey = `${messagingChannelType.modelKey}`;\n        const contactChannelIds = !isNewChannel && IDS === key && contact.get(`${modelKey}.${key}`);\n        if (key === IDS && (contactChannelIds || isNewChannel)) {\n            addOrReplaceIdsInChannelRecord(\n                idPropertyName,\n                channelRecord,\n                interactionChannelProperties,\n                contactChannelIds\n            );\n        } else {\n            if ('id' === key) {\n                // We don't use an 'id' key in the channel record, since Ember DS will consider that to be the ID of the record.\n                // We use 'userId' to hold the value of the inbound message's (user) 'id' property.\n                channelRecord.set(USER_ID, interactionChannelProperties[key]);\n            } else if (deepNotEqual(channelRecord.get(`${key}`), interactionChannelProperties[key])) {\n                // Set this legit new value in the record\n                channelRecord.set(`${key}`, interactionChannelProperties[key]);\n            }\n        }\n    });\n}\n\nfunction getChannelRecordInfo(type, freshContactSnapshot, channelIdProperty, interaction, logger) {\n    const interactionChannel = getInteractionChannel(interaction, logger);\n    if (!interactionChannel) {\n        // Not much we can do for this interaction if we can't get channel info from it\n        return {};\n    }\n\n    const messagingChannelType = getMessageChannelType(type);\n    let attributes = {};\n    if (freshContactSnapshot) {\n        Object.assign(attributes, freshContactSnapshot.get(messagingChannelType.modelKey)); // The source for old (WRT the Ember DS channel record) values\n    }\n    const interactionChannelProperties = interactionChannel[messagingChannelType.modelKey]; // The source for new (WRT the Ember DS channelRecord) values\n    const isNewChannel = !attributes || !attributes[messagingChannelType.channelId]; // The channel's new if either there is no lineId, or twitterId, or ... property, *or* said property has no channel ID\n    if (isNewChannel) {\n        attributes = interactionChannel;\n    }\n    attributes.type = type;\n    attributes.channelIdProperty = channelIdProperty;\n    attributes.isNewChannel = isNewChannel;\n    attributes.changesIgnoredByAgent = false;\n    attributes.agentRespondedToPrompt = false;\n    const messengerType = messagingChannelType.type;\n    const idAttribute = messagingChannelType.channelId;\n    const idOrIDs =\n        freshContactSnapshot.get(`${messengerType}Id.${idAttribute}`) ||\n        interactionChannelProperties[interactionChannel.channelId];\n    if (idAttribute === IDS) {\n        attributes.userId = idOrIDs;\n    } else {\n        attributes.userId = idOrIDs;\n    }\n    // The ids, name, displayName, screenName, and phoneNumber properties for the channel record under-construction\n    // (see the channel-record model)\n    return { attributes, isNewChannel, interactionChannelProperties };\n}\n\n// Returns an Ember DS channel-record; see the model for more info.\n// The ID of the returned record is that of the interaction\nexport function push(store, interaction, freshContactSnapshot, type, channelIdProperty, logger) {\n    const { attributes, isNewChannel, interactionChannelProperties } = getChannelRecordInfo(\n        type,\n        freshContactSnapshot,\n        channelIdProperty,\n        interaction,\n        logger\n    );\n    if (!attributes) {\n        // Not much we can do for this interaction if we can't get channel info from it\n        return null;\n    }\n\n    // The channelRecord's changedAttributes function will return an object\n    // with properties storing arrayed pairs denoting an oldValue and\n    // a newValue: [oldValue, newValue], plus the numberOfChanges method that helps\n    // to determine if the inbound message introduces changes that need to be applied\n    // to the freshContactSnapshot's channel.\n    //\n    // We leverage that capability by setting values below.\n    let channelRecord;\n    Ember.run(() => {\n        // A run is required here for a successful run of the interaction-relate-profile-v2's \"should display a confirmation prompt if...\" integration test\n        channelRecord = store.push({\n            data: {\n                id: interaction.get('id'), // Use the interaction's ID as the ID for the record to allow peeks (see the peekForChannelRecord method)\n                type: CHANNEL_MODEL_TYPE,\n                attributes: attributes // The set of \"old\" values that may be updated by the forEach iterator below\n            }\n        });\n        // Add a numberOfChanges function to the channelRecord object so the confirmation prompt component can use it to\n        // determine what sort of prompt to offer the user\n        channelRecord.numberOfChanges = () => {\n            return Object.keys(channelRecord.changedAttributes()).length;\n        };\n\n        // See if the channel identifies users with an _array_ of IDs\n        const ids = interactionChannelProperties.ids;\n        // If so, grab the property of the first of those IDs to use as a property name if IDs are being added (below)\n        const idPropertyName = ids ? Object.keys(ids[0])[0] : null;\n        setNewValuesInChannelRecord(\n            interactionChannelProperties,\n            isNewChannel,\n            freshContactSnapshot,\n            channelIdProperty,\n            idPropertyName,\n            channelRecord\n        );\n    });\n    return channelRecord;\n}\n\n/**\n * Updates the contact with changes recorded by the channel Ember DS record\n * @param channelRecord\n * @param contact\n */\nexport function updateContactWithChannelChanges(channelRecord, contact) {\n    if (!channelRecord) {\n        return;\n    }\n\n    const channelRecordData = channelRecord.data;\n    const changedAttributes = channelRecord.changedAttributes();\n    const messagingChannelType = messagingChannelTypeFor(channelRecordData.type);\n    const modelKey = `${messagingChannelType.modelKey}`;\n    const modelProperties = Object.keys(messagingChannelType.modelProperties()[modelKey]);\n    Ember.run.join(() => {\n        if (channelRecordData.isNewChannel) {\n            // Set up the new channel and its id(s)\n            contact.set(`${modelKey}`, channelRecordData[`${modelKey}`]);\n        } else {\n            // Copy the updated channel's data into the contact\n            Object.keys(changedAttributes).forEach(key => {\n                if (key === USER_ID) {\n                    const channelIdProperty = `${messagingChannelType.modelKey}.${messagingChannelType.channelId}`;\n                    // We don't use an 'id' key in the record because Ember DS will consider that to be the ID of the record.\n                    // We use 'channelId' to hold the value of the inbound message's 'id' property.\n                    if (messagingChannelType.idPropertyName) {\n                        // If the there's an idPropertyName, that means the channel uses an array of objects to denote IDs\n                        const id = messagingChannelType.getIdFrom(changedAttributes[key][1]);\n                        const contactChannelIds = contact.get(`${channelIdProperty}`);\n                        contact.set(`${channelIdProperty}`, [id].concat(contactChannelIds));\n                    } else {\n                        contact.set(`${channelIdProperty}`, messagingChannelType.getIdFrom(changedAttributes[key][1]));\n                    }\n                } else if (notExcluded(key) && modelProperties.includes(key)) {\n                    contact.set(`${modelKey}.${key}`, changedAttributes[key][1]);\n                }\n            });\n        }\n\n        // Delete irrelevant, channel-record-specific properties\n        CHANNEL_RECORD_PROPERTIES.forEach(property => {\n            delete contact.get(`${modelKey}.${property}`);\n        });\n    });\n}\n\nfunction deepNotEqual(a, b) {\n    return JSON.stringify(a) !== JSON.stringify(b);\n}\n\nfunction addOrReplaceIdsInChannelRecord(idPropertyName, channelRecord, interactionChannel, contactChannelIds) {\n    // Currently, FacebookId and LineId (contacts-service Java model class names) objects\n    // (facebook-id and line-id Ember DS models) use a property named 'ids' that has an array of\n    // objects whose key/value pairs are an ID name ('scopedId' and 'userId' respectively)\n    // paired with an ID string value.\n    //\n    // E.g. a facebook-id model object will have a property named 'ids', and its value could be\n    // [ { scopedId: '1234' }, { scopedId: '5678' } ]\n    const contactChannelIdValues = contactChannelIds ? contactChannelIds.map(id => id[idPropertyName]) : [];\n    const interactionIdValues = interactionChannel.ids.map(id => {\n        return id[idPropertyName];\n    });\n    let addedIds = false;\n    const newIdValues = interactionIdValues.map(interactionId => {\n        if (!contactChannelIdValues.includes(interactionId)) {\n            addedIds = true;\n            return interactionId;\n        }\n    });\n    if (addedIds) {\n        // As of this writing (31AUG2018), there is only one element in any contact's ids array.\n        //\n        // The uncommented statement map invocation below works under this assumption.  To relax that assumption at\n        // some point in the future, use the commented-out map line below instead.\n        const ids = newIdValues.map(idVal => {\n            // const ids = contactChannelIdValues.concat(newIdValues).map(idVal => {\n            const id = {};\n            id[idPropertyName] = idVal;\n            return id;\n        });\n        // Invoking the setter on the record engages the Ember DS changed attribute logic for models\n        channelRecord.set(IDS, ids);\n    }\n}\n","export default {\n    acdDivisionPresenceProfileToggle: true, // Secondary translation fix for regions | ACE-3661\n    acdHybridToastNoActiveQueue: true, // Partially Enabled | ACE-1440\n    acdNormalizedMessages: true, // ACE-2199\n    acdOutboundWhatsApp: true, // PURE-2802 | ACE-2511\n    acdSecurePause: true, // ACE-2443\n    acdTransferPermissions: true, //PURE-4261\n    'ACT-1205': true, // ACT-1205 Adding Agent Greeting from Agent UI Settings to Preferences\n    'AGORA-137_connections-ui-contentsquare': true,\n    'AGORA-268_connections-ui-in-admin-ui': true,\n    'AGORA-319_webrtc-sdk-dependency-removal': true,\n    'AGORA-71_new-org-settings-api': true,\n    'ATLAS-467_integrate-connections-ui': true, // ATLAS-467: Integrate Connections UI IFC client into Web Directory\n    'ATLAS-536_EnableContentSquare': true,\n    auraACWGadgets: true, //AURA-88\n    'comui-disable-legacy-api-url': true,\n    conversationSummary3256: true, // ATEAM-1229\n    digitalFirstPURE2942: true,\n    emergencyLocation: true,\n    enableUIAjaxRetryHeader: true,\n    epcDecompPresenceLabel: true,\n    'gcucc-ui-PCUCC-3734': true, // PCUCC-3734\n    'gcucc.ui.useIntegrationPresenceSourceDirectorySearch': true, // PCUCC-1007\n    groupProileNoIndividualsSave: true, // PLUG-188\n    hawkClientScreenShare: true,\n    interactionNameQueueCallingQueue: true, // ACE-1872\n    notificationOutputPicker: true,\n    playRecordingFromSelectedOutput: true,\n    'PURE-3256_useConversationDetails': true, // // ATEAM-1229\n    'PURE-5421_CannedResponse_Gadget': true, // PURE-5421\n    'PURE-6104_no_snatch_phone': true,\n    'PURE-6186_Scripter_Gadget_GCUI': true, // CC-4815\n    'PURE-7064_search_favorites': true,\n    'PURE3301-dynamicGroups': true,\n    'qm.release.evaluation.assignee': true, // WEM-742\n    'qm.release.evaluation.disputes': true, // WEM-689\n    relateDynamicSchema: true,\n    showVideoInThumbnail: true, // Show video on thumbnail if there is a screen stream, and participant is major, and video is not muted\n    userRecordingDownload: true, // CM-5713: feature toggle for new API to download user recordings for Calls.\n    webrtcClientNetworkProbeAutoAdjust: true,\n    webrtcDefaultDeviceProfile: true, //PURE-5609\n    webrtcDisableDeviceProfileNotifications: true, // PURE-5609\n    webrtcMMSDnsCheck: true,\n    webrtcRelayOnly: true,\n    webrtcTrackBasedActions: true,\n    webUiDarkTheme: true\n} as const;\n","export const imageTypes = [\n    'apng',\n    'avif',\n    'bmp',\n    'cur',\n    'eps',\n    'gif',\n    'ico',\n    'jpeg',\n    'jpg',\n    'png',\n    'svg',\n    'svg+xml',\n    'tif',\n    'tiff',\n    'webp'\n] as const;\nexport type ImageType = (typeof imageTypes)[number];\n\nexport const audioTypes = [\n    'aac',\n    'aif',\n    'aifc',\n    'aiff',\n    'caf',\n    'flac',\n    'm4a',\n    'm4r',\n    'mogg',\n    'mp3',\n    'oga',\n    'ogg',\n    'pcm',\n    'wav',\n    'wave',\n    'wma',\n    'wmf'\n] as const;\nexport type AudioType = (typeof audioTypes)[number];\n\nexport const videoTypes = [\n    '3g2',\n    '3gp',\n    'amv',\n    'asf',\n    'avi',\n    'f4a',\n    'f4b',\n    'f4p',\n    'f4v',\n    'flv',\n    'gifv',\n    'm4p',\n    'm4v',\n    'mkv',\n    'mng',\n    'mod',\n    'mov',\n    'mp2',\n    'mp4',\n    'mpe',\n    'mpeg',\n    'mpg',\n    'mpv',\n    'mxf',\n    'nsv',\n    'ogv',\n    'qt',\n    'rm',\n    'roq',\n    'rrc',\n    'svi',\n    'vob',\n    'webm',\n    'wmv',\n    'yuv'\n] as const;\nexport type VideoType = (typeof videoTypes)[number];\n\nexport const textDocTypes = ['doc', 'docm', 'docx', 'dot', 'dotm', 'dotx', 'odt', 'txt'] as const;\nexport type TextDocType = (typeof textDocTypes)[number];\n\nexport const pdfTypes = ['pdf'] as const;\nexport type PdfType = (typeof pdfTypes)[number];\n\nexport const powerPointTypes = ['key', 'pptx', 'pptm', 'ppt'] as const;\nexport type PowerPointType = (typeof powerPointTypes)[number];\n\nexport const excelTypes = ['xlsx', 'xls'] as const;\nexport type ExcelType = (typeof excelTypes)[number];\n","import Ember from 'ember';\n\nfunction _isSafeToFocus(selector) {\n    const currentSelectedElement = Ember.$(window.document.activeElement);\n\n    switch (selector) {\n        case '#roster-action-answer-button button':\n            // interaction roster\n            if (currentSelectedElement) {\n                return currentSelectedElement.parent().hasClass('toggle-switch-container');\n            }\n            return false;\n        case '.incoming-controls button.answer-call':\n            // active-call-entry\n            if (currentSelectedElement) {\n                return currentSelectedElement.parent().hasClass('toggle-switch-container');\n            }\n            return false;\n        case '.answer-call-action-bar button.answer-call':\n            // call toast\n            if (currentSelectedElement) {\n                return currentSelectedElement.parent().hasClass('toggle-switch-container');\n            }\n            return false;\n        default:\n            return false;\n    }\n}\n\nexport function doFocus(component, selector) {\n    Ember.run.scheduleOnce('afterRender', component, function () {\n        const target = component.$(selector);\n        if (target) {\n            target.focus();\n        }\n    });\n}\n\nexport function requestFocus(scope = Ember, selector) {\n    let isSafe;\n    try {\n        isSafe = _isSafeToFocus(selector);\n    } catch (e) {\n        isSafe = false;\n    }\n\n    if (isSafe) {\n        Ember.run.next(() => {\n            doFocus(scope, selector);\n        });\n    }\n}\n","import Ember from 'ember';\nconst geolocation = navigator.geolocation;\n\nconst GeolocationUtil = Ember.Object.create({\n    hostedContext: null,\n\n    setContext(context) {\n        this.hostedContext = context;\n    },\n    fetchCurrentPostion() {\n        let context = this.get('hostedContext');\n        if (context !== null && context.isHosted() && context.requiresNativeGeolocation()) {\n            return context.requestDesktopPromise({ cmd: 'getGeolocationPosition' });\n        } else {\n            return new Ember.RSVP.Promise(function (resolve, reject) {\n                geolocation.getCurrentPosition(\n                    position => resolve(position),\n                    error => reject(error)\n                );\n            });\n        }\n    },\n\n    watchPosition(onPositionChangedFn, onErrorFn, options) {\n        return geolocation.watchPosition(onPositionChangedFn, onErrorFn, options);\n    },\n\n    clearWatch(watcher) {\n        geolocation.clearWatch(watcher);\n    },\n\n    isGeolocationAvailable() {\n        return 'geolocation' in navigator;\n    },\n\n    getCurrentPosition(success, failure) {\n        return geolocation.getCurrentPosition(success, failure);\n    }\n});\n\nexport default GeolocationUtil;\n","import request from 'ember-ajax';\n\n// see https://github.com/Giphy/GiphyAPI\n\nclass Giphy {\n    constructor(options) {\n        options = options || {};\n        this.baseUrl = 'https://api.giphy.com/v1/gifs';\n        this.apiKey = options.apiKey || 'fsibTNreYj3Co';\n    }\n\n    search(query, limit, offset) {\n        const url = `${this.baseUrl}/search`;\n        const data = {\n            q: query,\n            api_key: this.apiKey,\n            rating: 'pg',\n            fmt: 'json',\n            limit,\n            offset\n        };\n        return request(url, { data }).then(res => (Array.isArray(res.data) ? res.data : []));\n    }\n\n    random(query) {\n        const url = `${this.baseUrl}/random`;\n        const data = {\n            tag: query,\n            api_key: this.apiKey\n        };\n        return request(url, { data }).then(res => res && res.data);\n    }\n}\n\nexport default new Giphy({});\n","const gsm7Chars = [\n    '@',\n    '£',\n    '$',\n    '¥',\n    'è',\n    'é',\n    'ù',\n    'ì',\n    'ò',\n    'Ç',\n    '\\n',\n    'Ø',\n    'ø',\n    '\\r',\n    'Å',\n    'å',\n    'Δ',\n    '_',\n    'Φ',\n    'Γ',\n    'Λ',\n    'Ω',\n    'Π',\n    'Ψ',\n    'Σ',\n    'Θ',\n    'Ξ',\n    'Æ',\n    'æ',\n    'ß',\n    'É',\n    ' ',\n    '!',\n    '\"',\n    '#',\n    '¤',\n    '%',\n    '&',\n    \"'\",\n    '(',\n    ')',\n    '*',\n    '+',\n    ',',\n    '-',\n    '.',\n    '/',\n    '0',\n    '1',\n    '2',\n    '3',\n    '4',\n    '5',\n    '6',\n    '7',\n    '8',\n    '9',\n    ':',\n    ';',\n    '<',\n    '=',\n    '>',\n    '?',\n    '¡',\n    'A',\n    'B',\n    'C',\n    'D',\n    'E',\n    'F',\n    'G',\n    'H',\n    'I',\n    'J',\n    'K',\n    'L',\n    'M',\n    'N',\n    'O',\n    'P',\n    'Q',\n    'R',\n    'S',\n    'T',\n    'U',\n    'V',\n    'W',\n    'X',\n    'Y',\n    'Z',\n    'Ä',\n    'Ö',\n    'Ñ',\n    'Ü',\n    '§',\n    '¿',\n    'a',\n    'b',\n    'c',\n    'd',\n    'e',\n    'f',\n    'g',\n    'h',\n    'i',\n    'j',\n    'k',\n    'l',\n    'm',\n    'n',\n    'o',\n    'p',\n    'q',\n    'r',\n    's',\n    't',\n    'u',\n    'v',\n    'w',\n    'x',\n    'y',\n    'z',\n    'ä',\n    'ö',\n    'ñ',\n    'ü',\n    'à'\n];\nconst gsm7CharsExt = ['\\f', '^', '{', '}', '\\\\', '[', '~', ']', '|', '€'];\n\nexport default { gsm7Chars, gsm7CharsExt };\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { PUBLIC_ENVS } from './net';\n\n//For CEF:\n//_HostedContextFunctions functions:\n// - register(initData)\n// - showNotification(messageData)\n// - setUnreadMessageCount(count)\n// - doTerminateNow()\n\n//The app is considered hosted if it's running in an iframe, -or-. This class helps facilitate communication between\n//the app and its parent.\nvar HostedContext = Ember.Object.extend(Ember.Evented, {\n    applicationService: Ember.inject.service('application'),\n    logger: Ember.inject.service('stash-logger'),\n    applicationController: null,\n\n    _applicationHasFocus: true,\n    _hostType: null, //This determines whether we are actually hosted or not. Possible values: 'CEF', or null\n    _operatingSystem: '', //Mac or Windows\n    _version: '(unknown)', //Desktop application version\n\n    _hostRegion: null,\n    _supportsRegions: false,\n    _supportsUnifiedPreferences: false,\n    _supportsJabra: true,\n    _additionalPreferences: [],\n    _requiresNativeGeolocation: false,\n    runAsMediaHelper: false,\n    previousPresence: null,\n    isScreenLockedOrSleep: false,\n    hasUserAlreadyReturn: false,\n    desktopSleptAt: null,\n\n    init: function () {\n        this._super(...arguments);\n\n        const owner = Ember.getOwner(this);\n        this.set('applicationController', owner.lookup('controller:application'));\n    },\n\n    isHosted: function () {\n        return this._hostType !== null;\n    },\n\n    isHostedProp: Ember.computed(function () {\n        return this.isHosted();\n    }),\n\n    requiresNativeGeolocation: function () {\n        return this._requiresNativeGeolocation;\n    },\n\n    getRegion: function () {\n        return this._hostRegion;\n    },\n\n    supportsRegions: function () {\n        return this._supportsRegions;\n    },\n\n    supportsUnifiedPreferences: function () {\n        return this._supportsUnifiedPreferences;\n    },\n\n    supportsJabra: function () {\n        return this._supportsJabra;\n    },\n\n    isMac: function () {\n        return this._operatingSystem === 'Mac';\n    },\n\n    isWindows: function () {\n        return this._operatingSystem === 'Windows';\n    },\n\n    getAdditionalPreferences: function () {\n        return this._additionalPreferences;\n    },\n\n    doTerminateApplication: function (completion) {\n        this.get('logger').log('in doTerminationApplication with completion: ' + completion);\n        setTimeout(function () {\n            if (completion) {\n                completion();\n            }\n        }, 2000);\n    },\n\n    applicationHasFocus: function () {\n        return window._HostedContextFunctions && window._HostedContextFunctions.doesAppHaveFocus();\n    },\n\n    showNativeNotification: function (data) {\n        window._HostedContextFunctions.showNativeNotification(data);\n    },\n\n    setUnreadMessageCount: function (count) {\n        try {\n            if (this.isHosted()) {\n                window._HostedContextFunctions.setUnreadMessageCount(count);\n            }\n        } catch (e) {\n            this.get('logger').error('Error setting unread message count', { error: e });\n        }\n    },\n\n    //Send a Jabra event to the desktop.\n    //deviceID - ID of the device\n    //event - 'offhook', 'hold', 'mute', ringer'\n    //value - true or false\n    sendJabraEventToDesktop: function (deviceID, event, value) {\n        this.sendEventToDesktop(EVENTS.JABRA_EVENT, {\n            deviceID: deviceID,\n            event: event,\n            value: value\n        });\n    },\n\n    requestJabraDevices: function () {\n        return this.requestDesktopPromise({ cmd: 'requestJabraDevices' });\n    },\n\n    sendEventToDesktop: function (event, data) {\n        try {\n            if (this.isHosted()) {\n                window._HostedContextFunctions.sendEventToDesktop(event, data);\n            }\n        } catch (e) {\n            this.get('logger').error('Error sending event to desktop', { error: e });\n        }\n    },\n\n    getScreenMedia: function (callback) {\n        this.requestDesktopPromise({\n            cmd: 'getUserSelectedScreenMedia'\n        })\n            .then(function (obj) {\n                callback(obj.id);\n            })\n            .catch(function (/*reason*/) {\n                callback(null);\n            });\n    },\n\n    sendRegionToDesktop: function (region) {\n        this._hostRegion = region;\n\n        try {\n            if (this.isHosted()) {\n                let matchedRegion = _.find(PUBLIC_ENVS, { desktopId: region });\n                if (matchedRegion) {\n                    let url = `https://apps.${matchedRegion.envTld}/directory`;\n                    this.get('logger').log('Region: ' + region + ' URL: ' + url);\n                    window._HostedContextFunctions.sendRegionToDesktop(region, url);\n                } else {\n                    this.get('logger').error(`Unable to send region to desktop.  Unknown Region '${region}'`);\n                }\n            }\n        } catch (e) {\n            this.get('logger').error('Error sending region to desktop', { error: e });\n        }\n    },\n\n    getShareableScreens() {\n        return this.requestDesktopPromise({\n            cmd: 'getShareableScreens'\n        });\n    },\n\n    requestDesktopPromise: function (cmd) {\n        return new Ember.RSVP.Promise(function (resolve, reject) {\n            try {\n                var sCmd = JSON.stringify(cmd);\n                window.cefQuery({\n                    request: sCmd,\n                    persistent: false,\n                    onSuccess: function (response) {\n                        try {\n                            var obj = JSON.parse(response);\n                            resolve(obj);\n                        } catch (e) {\n                            resolve({});\n                        }\n                    },\n                    onFailure: function (response) {\n                        reject(response);\n                    }\n                });\n            } catch (e) {\n                this.get('logger').error('Error requesting desktop promise', {\n                    error: e\n                });\n                reject();\n            }\n        });\n    }\n});\n\nexport var EVENTS = {\n    INCOMING_CALL: 'incomingCall',\n    TERMINATED_CALL: 'terminatedCall',\n    MISSED_CALL: 'missedCall',\n    STOPPED_RINGING: 'stoppedRinging',\n    PHONE_CONNECTED: 'phoneConnected',\n    WEBRTC_CONNECTION_INCOMING: 'webrtcConnectionIncoming',\n    WEBRTC_CONNECTION_ANSWERED: 'webrtcConnectionAnswered',\n    WEBRTC_CONNECTION_DECLINED: 'webrtcConnectionDeclined',\n    WEBRTC_CONNECTION_STARTED: 'webrtcConnectionStarted',\n    WEBRTC_CONNECTION_ENDED: 'webrtcConnectionEnded',\n    JABRA_EVENT: 'jabraEvent'\n};\n\nexport default HostedContext;\n","const INSTAGRAM_PROP = {\n    FILE_SIZE: 8,\n    MESSAGE_TYPE: 'instagram',\n    CHARACTER_LIMIT: 1000\n};\n\nexport default INSTAGRAM_PROP;\n","const serverPrefix = 'server_translations';\n\nexport default function missingMessage(key, locales, suppressError) {\n    if (typeof suppressError === 'string') {\n        return suppressError;\n    } else if (!key) {\n        return '';\n    } else if (key.indexOf(serverPrefix) !== -1) {\n        // When a labelKey is typed in, it is user specified and typed in manually.\n        // Show this value rather than the full key if no translation was found.\n        return key.split('_').pop();\n    } else {\n        return key;\n    }\n}\n","export * from 'ember-purecloud-components/utils/jid-helpers';\n","const WHITE_SPACE_KEYCODES = {\n    TAB: 9,\n    ENTER: 13,\n    SPACE: 32\n};\n\nconst WHITE_SPACE_KEYS = {\n    TAB: 'Tab'\n};\n\nconst CAP_ALPHA_KEYCODES = {\n    A: 65,\n    B: 66,\n    C: 67,\n    D: 68,\n    E: 69,\n    F: 70,\n    G: 71,\n    H: 72,\n    I: 73,\n    J: 74,\n    K: 75,\n    L: 76,\n    M: 77,\n    N: 78,\n    O: 79,\n    P: 80,\n    Q: 81,\n    R: 82,\n    S: 83,\n    T: 84,\n    U: 85,\n    V: 86,\n    W: 87,\n    X: 88,\n    Y: 89,\n    Z: 90\n};\n\nconst LOW_ALPHA_KEYCODES = {\n    A: 97,\n    B: 98,\n    C: 99,\n    D: 100,\n    E: 101,\n    F: 102,\n    G: 103,\n    H: 104,\n    I: 105,\n    J: 106,\n    K: 107,\n    L: 108,\n    M: 109,\n    N: 110,\n    O: 111,\n    P: 112,\n    Q: 113,\n    R: 114,\n    S: 115,\n    T: 116,\n    U: 117,\n    V: 118,\n    W: 119,\n    X: 120,\n    Y: 121,\n    Z: 122\n};\n\nconst NUM_KEYCODES = {\n    0: 48,\n    1: 49,\n    2: 50,\n    3: 51,\n    4: 52,\n    5: 53,\n    6: 54,\n    7: 55,\n    8: 56,\n    9: 57\n};\n\nconst NAV_KEYCODES = {\n    LEFT_ARROW: 37,\n    UP_ARROW: 38,\n    RIGHT_ARROW: 39,\n    DOWN_ARROW: 40\n};\n\nconst ESCAPE_KEYCODE = 27;\n\ntype KeyCodeSet = { [x: string]: number };\n\nexport function keyForKeyCode(keyCode: number, object: KeyCodeSet) {\n    let key: string;\n    for (key in object) {\n        if (object.hasOwnProperty(key) && object[key] === keyCode) {\n            return key;\n        }\n    }\n    return null;\n}\n\nexport function isNumber(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    return keyCode >= NUM_KEYCODES[0] && keyCode <= NUM_KEYCODES[9];\n}\n\nexport function isAlphabet(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    return (\n        (keyCode >= CAP_ALPHA_KEYCODES.A && keyCode <= CAP_ALPHA_KEYCODES.Z) ||\n        (keyCode >= LOW_ALPHA_KEYCODES.A && keyCode <= LOW_ALPHA_KEYCODES.Z)\n    );\n}\n\nexport function isNavigation(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    return keyCode >= NAV_KEYCODES.LEFT_ARROW && keyCode <= NAV_KEYCODES.DOWN_ARROW;\n}\n\nexport function isWhitespace(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    return (\n        keyCode === WHITE_SPACE_KEYCODES.SPACE ||\n        keyCode === WHITE_SPACE_KEYCODES.ENTER ||\n        keyCode === WHITE_SPACE_KEYCODES.TAB\n    );\n}\n\nexport function isEscape(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    return keyCode === ESCAPE_KEYCODE;\n}\n\nexport function isTab(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    const key = evt.key;\n    return keyCode === WHITE_SPACE_KEYCODES.TAB || key === WHITE_SPACE_KEYS.TAB;\n}\n\nexport function eventToString(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    if (isAlphabet(evt) || isNumber(evt)) {\n        return String.fromCharCode(keyCode);\n    } else if (isNavigation(evt)) {\n        return keyForKeyCode(keyCode, NAV_KEYCODES);\n    } else if (isWhitespace(evt)) {\n        return keyForKeyCode(keyCode, WHITE_SPACE_KEYCODES);\n    } else if (isEscape(evt)) {\n        return 'ESCAPE';\n    }\n\n    return '' + keyCode;\n}\n\nexport default {\n    isAlphabet,\n    isEscape,\n    isNavigation,\n    isNumber,\n    isTab,\n    isWhitespace,\n    eventToString\n};\n","/* global intlTelInputUtils */\nimport Ember from 'ember';\nimport { getIdentifier } from 'connections-ui/utils/external-contact-messaging';\nimport { addPageAction } from 'connections-ui/utils/newrelic';\n\nconst { get, set } = Ember;\n\n/**\n * Detects the format of the provided phone number string and logs it\n * to Sumo. We are doing this to gather information about the kinds\n * of phone number formats the UI is provided from conversation-service.\n *\n * @param interaction The interaction source for the phone number to be examined\n * @returns {validInput: boolean, normalized?: boolean, converted?: boolean, missingPlusPrefix?: boolean, type?:string, subType?:string, format?: string}\n */\nexport default function logE164Info(interaction) {\n    const loggingObject = {\n        evaluateAndLog() {\n            const loggedE164Info = get(interaction, 'loggedE164Info');\n            let result;\n            let phoneNumberString = '';\n\n            if (!loggedE164Info) {\n                const participants = get(interaction, 'participants') || [];\n                const customer = participants.findBy('purpose', 'customer');\n                if (customer) {\n                    const type = get(interaction, 'type');\n                    const subType = get(interaction, 'subMessageType');\n                    const typesForPhone = ['call', 'callback', 'sms'];\n\n                    if (typesForPhone.indexOf(type) > -1 || typesForPhone.indexOf(subType) > -1) {\n                        phoneNumberString =\n                            get(customer, 'address') ||\n                            get(customer, 'messages.firstObject.fromAddress.addressNormalized');\n                    } else {\n                        phoneNumberString = getIdentifier(interaction);\n                    }\n\n                    if (!phoneNumberString || typeof phoneNumberString !== 'string') {\n                        result = { validInput: false };\n                    }\n                    if (!result) {\n                        result = {\n                            validInput: true,\n                            normalized: false,\n                            converted: false,\n                            missingPlusPrefix: false,\n                            type,\n                            subType,\n                            format: phoneNumberString.replace(/\\d/g, '▲')\n                        };\n\n                        if (phoneNumberString.indexOf('+') < 0) {\n                            result.missingPlusPrefix = true;\n                        }\n\n                        const sanitizedPhoneNumber = phoneNumberString.replace(/tel:/, '');\n                        const normalizedPhoneNumber = intlTelInputUtils.formatNumber(sanitizedPhoneNumber);\n                        if (intlTelInputUtils.isValidNumber(normalizedPhoneNumber)) {\n                            result.normalized = true;\n                            result.converted = normalizedPhoneNumber !== sanitizedPhoneNumber;\n                        }\n                        try {\n                            addPageAction('logE164Info', result);\n                            set(interaction, 'loggedE164Info', true);\n                        } catch (e) {\n                            // logger message failed do nothing\n                        }\n\n                        interaction.removeObserver('participants.[]', loggingObject, 'evaluateAndLog');\n                    }\n                }\n            }\n            return result;\n        }\n    };\n    interaction.addObserver('participants.[]', loggingObject, 'evaluateAndLog');\n    return loggingObject.evaluateAndLog();\n}\n","define(\"connections-ui/utils/logger\", [\"exports\", \"ember-purecloud-components/utils/logger\"], function (_exports, _logger) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _logger.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst hljs = window.hljs;\nhljs.configure({\n    languages: [\n        'bash',\n        'clojure',\n        'coffeescript',\n        'cpp',\n        'cs',\n        'css',\n        'elm',\n        'go',\n        'xml',\n        'handlebars',\n        'http',\n        'ini',\n        'java',\n        'javascript',\n        'json',\n        'makefile',\n        'objectivec',\n        'python',\n        'ruby',\n        'rust',\n        'sql',\n        'swift',\n        'typescript'\n    ]\n});\n\nconst markdown = window.markdownit;\n\nconst md = markdown({\n    html: false,\n    linkify: true,\n    typographer: false,\n    highlight(code, lang) {\n        if (lang === 'no-highlight') {\n            return Ember.Handlebars.Utils.escapeExpression(code);\n        } else if (lang) {\n            try {\n                return hljs.highlight(lang, code).value;\n            } catch (e) {\n                return Ember.Handlebars.Utils.escapeExpression(code);\n            }\n        } else {\n            return hljs.highlightAuto(code).value;\n        }\n    }\n});\n\nfunction isMailTo(href) {\n    return href.indexOf('mailto:') === 0;\n}\n\nfunction initializeMarkdownRendering(isApplicationRoute) {\n    const defaultRender =\n        md.renderer.rules.link_open ||\n        function (tokens, idx, options, env, self) {\n            return self.renderToken(tokens, idx, options);\n        };\n\n    md.renderer.rules.link_open = function (tokens, idx, options, env, self) {\n        const token = tokens[idx];\n        const targetIndex = token.attrIndex('href');\n        if (targetIndex !== -1) {\n            let href = token.attrGet('href');\n            if (!isApplicationRoute(href) && !isMailTo(href)) {\n                token.attrPush(['target', '_blank']);\n                token.attrPush(['rel', 'noopener noreferrer']);\n\n                const pattern = /:\\/\\//i;\n                if (!pattern.test(href)) {\n                    token.attrSet('href', `http://${href}`);\n                }\n            }\n        }\n\n        // pass token to default renderer.\n        return defaultRender(tokens, idx, options, env, self);\n    };\n}\n\nfunction markdownToHtml(markdown) {\n    return markdown ? md.render(markdown) : '';\n}\n\nexport { markdownToHtml, initializeMarkdownRendering };\n","import _ from 'lodash';\n\nconst LAYOUTS = {};\n\nfunction registerLayout(layoutId, layout) {\n    deregisterLayout(layoutId);\n    LAYOUTS[layoutId] = layout;\n}\n\nfunction deregisterLayout(layoutId) {\n    LAYOUTS[layoutId] = null;\n    delete LAYOUTS[layoutId];\n}\n\nfunction rerunLayouts() {\n    _.forOwn(LAYOUTS, layout => {\n        if (layout && layout.rerun) {\n            layout.rerun();\n        }\n    });\n}\n\nexport { registerLayout, deregisterLayout, rerunLayouts };\n","/* global intlTelInputUtils */\n\nimport { getMessengerType, getDisplayableName, getIdentifier } from './external-contact-messaging';\n\n/**\n * A list of all the available messaging channel types in the external contact model\n */\n\nfunction getNameFrom(interaction) {\n    return interaction.get('participantForCustomer.messages.firstObject.fromAddress.name');\n}\n\nfunction getTwitterDisplayNameFrom(interaction) {\n    return (\n        getDisplayableName(interaction) ||\n        interaction.get('participantForCustomer.messages.firstObject.fromAddress.name')\n    );\n}\n\nfunction getRawAddress(interaction) {\n    return interaction && interaction.get('participantForCustomer.messages.firstObject.fromAddress.addressRaw');\n}\n\nexport function getDisplayOrScreenName(interaction) {\n    if (!interaction) {\n        return null;\n    }\n    const messagingChannelType = messagingChannelTypeFor(getMessengerType(interaction));\n    return messagingChannelType && getNameFrom(interaction);\n}\n\n// Returns an object representing a channel property of an Ember DS contact model instance.\n// E.g. messagingChannelTypes[0].modelProperties(...)\nfunction getModelProperties(channelId, idProperties) {\n    const properties = {};\n    properties[channelId] = idProperties;\n    return properties;\n}\n\nexport function messagingChannelTypeFor(messageType) {\n    return messagingChannelTypes.find(messagingChannelType => messagingChannelType.type === messageType);\n}\n\nexport function modelKeyFor(messageType) {\n    const messagingChannelType = messagingChannelTypeFor(messageType);\n    return messagingChannelType ? messagingChannelType.modelKey : null;\n}\n\n// New message channel types must expose a `modelProperties` method that\n// creates an object whose structure is the same as that for that message channel's identifier\n// field in a contact model object.\n//\n// For example, a contact model instance with a Twitter channel looks like this:\n//      {\n//          id: 'df445345abdc',\n//          firstName: 'Elon',\n//          lastName: 'Musk',\n//          address: {\n//                      ...\n//                   }\n//          ...\n//          twitterId: {\n//              id: 'df445345abdc',\n//              name: 'Elon Musk'\n//              screenName: '@elonmusk\n//          }\n//          ...\n//      }\n//\n//     Thus,\n//          messagingChannelTypes.modelProperties('df445345abdc', 'Elon Musk', '@elonmusk')\n//     for a Twitter channel will return\n//          {\n//              twitterId: {\n//                  id: 'df445345abdc',\n//                  name: 'Elon Musk'\n//                  screenName: '@elonmusk\n//             }\n//          }\n//\n\n// The contacts-service returns a displayable phone number, while Smooch may send\n// an e164.  Use this to hopefully match them up.\nexport function getDisplayablePhoneNumberFrom(phoneNumber) {\n    // Assume a US country code;\n    // obviously a short-term kludge that will be unnecessary when the real bug is (hopefully quickly) fixed!\n    return intlTelInputUtils.formatNumber(phoneNumber, 'US', intlTelInputUtils.numberFormat.INTERNATIONAL);\n}\n\nfunction _getChannelPropertiesFromInteraction(interaction, channelType) {\n    const messagingChannelType = messagingChannelTypeFor(channelType);\n\n    const id = getIdentifier(interaction);\n    const displayableName = getDisplayableName(interaction);\n    const name = getDisplayableName(interaction);\n    return messagingChannelType.modelProperties(id, name, displayableName);\n}\n\n// The array of objects below represent the various inbound messaging channels.\n// The properties and functions exposed by message channel types are used for display purposes and other things.\n//\n//\n// For the hasCrucialChannelInfo functions: they should return true iff their condition holds, in service of\n// https://inindca.atlassian.net/browse/RELATE-2536: WhatsApp ACD: Allow the ACD UI to tolerate missing inbound message channel information\n//\n// \"The ACD UI should be aware of and behave tolerably in response to Smooch's updating their messaging protocol and payload, and the consequential\n// implication for possibly missing channel property values (e.g. a missing Twitter ID or handle).\"\n//\n// Although missing information should happen very rarely, the UI still needs to cope. The coping strategy is the same for any message type.\n// There are two cases:\n//\n// 1) The agent is creating a new external contact for an inbound message. The UI should not automatically populate any messaging fields.\n// Whatever info the agent supplies for the contact should be accepted and saved.\n//\n// 2) The agent has an existing contact to associate with the message. Because the message may be missing crucial information, the contact\n// is not automatically updated with the new/incomplete message channel information.\nexport const messagingChannelTypes = [\n    {\n        modelKey: 'twitterId', // The Ember DS externalcontacts/contact model's\n        channelId: 'id',\n        type: 'twitter',\n        idPropertyName: null,\n        modelProperties: function (id, name, twitterHandle) {\n            return getModelProperties(this.modelKey, {\n                id: id,\n                name: name,\n                screenName: twitterHandle\n            });\n        },\n        getReverseWhitepagesLookupValue: getRawAddress,\n        getChannelPropertiesFromExternalContact: externalContact => [externalContact.get('twitterId')],\n        getChannelPropertiesFromInteraction: interaction =>\n            _getChannelPropertiesFromInteraction(interaction, 'twitter'),\n        getIdsFromExternalContact: externalContact => [externalContact.get('twitterId.id')],\n        getIdFrom: id => id,\n        display: channelId => (channelId ? (channelId.screenName ? channelId.screenName : '') : ''),\n        present: channelId => !!(channelId && channelId.screenName),\n        hasCrucialChannelInfo: channelId => !!(channelId && channelId.id && channelId.screenName),\n        displayNameFrom: interaction => getTwitterDisplayNameFrom(interaction),\n        isNewId: (ids, id) => !ids || ids.length !== 1 || ids[0] !== id, // ids is null or a single-element string array with a Twitter ID\n        svgIconKey: '#icon-twitter-white-on-blue'\n    },\n    {\n        modelKey: 'lineId',\n        channelId: 'ids',\n        type: 'line',\n        idPropertyName: 'userId',\n        modelProperties: function (userId, displayName) {\n            return getModelProperties(this.modelKey, {\n                ids: [{ userId: userId }],\n                displayName: displayName\n            });\n        },\n        getReverseWhitepagesLookupValue: getRawAddress,\n        getChannelPropertiesFromExternalContact: externalContact => [externalContact.get('lineId')],\n        getChannelPropertiesFromInteraction: interaction => _getChannelPropertiesFromInteraction(interaction, 'line'),\n        getIdsFromExternalContact: externalContact => externalContact.get('lineId.ids'),\n        getIdFrom: userId => {\n            return {\n                userId: userId\n            };\n        },\n        display: channelId => (channelId.displayName ? channelId.displayName : ''),\n        present: channelId => !!(channelId && channelId.ids),\n        hasCrucialChannelInfo: channelId => !!(channelId && channelId.ids && channelId.ids.every(id => id.userId)),\n        displayNameFrom: interaction => getDisplayOrScreenName(interaction),\n        isNewId: (ids, id) => ids && ids.some(lineId => lineId.userId !== id),\n        svgIconKey: '#icon-line-messenger'\n    },\n    {\n        modelKey: 'facebookId',\n        channelId: 'ids',\n        type: 'facebook',\n        idPropertyName: 'scopedId',\n        modelProperties: function (userId, displayName) {\n            return getModelProperties(this.modelKey, {\n                ids: [{ scopedId: userId }],\n                displayName: displayName\n            });\n        },\n        getReverseWhitepagesLookupValue: getRawAddress,\n        getChannelPropertiesFromExternalContact: externalContact => [externalContact.get('facebookId')],\n        getChannelPropertiesFromInteraction: interaction =>\n            _getChannelPropertiesFromInteraction(interaction, 'facebook'),\n        getIdsFromExternalContact: externalContact => externalContact.get('facebookId.ids'),\n        getIdFrom: scopedId => {\n            return {\n                scopedId: scopedId\n            };\n        },\n        display: channelId => (channelId.displayName ? channelId.displayName : ''),\n        present: channelId => !!(channelId && channelId.ids),\n        hasCrucialChannelInfo: channelId => !!(channelId && channelId.ids && channelId.ids.every(id => id.scopedId)),\n        displayNameFrom: interaction => getDisplayOrScreenName(interaction),\n        isNewId: (ids, id) => ids && ids.some(facebookId => facebookId.scopedId !== id),\n        svgIconKey: '#icon-facebook-messenger'\n    },\n    {\n        modelKey: 'whatsAppId',\n        channelId: 'phoneNumber',\n        nestedIdProperty: 'display',\n        type: 'whatsapp',\n        idPropertyName: null,\n        modelProperties: function (phoneNumber, displayName) {\n            return getModelProperties(this.modelKey, {\n                displayName: displayName,\n                phoneNumber: {\n                    display: getDisplayablePhoneNumberFrom(phoneNumber)\n                }\n            });\n        },\n        getReverseWhitepagesLookupValue: interaction => {\n            const address = getRawAddress(interaction);\n            if (address && /^\\+?[\\d]+$/.test(address)) {\n                return /^\\+/gi.test(address) ? address : `+${address}`;\n            }\n            return address;\n        },\n        getChannelPropertiesFromExternalContact: externalContact => [externalContact.get('whatsAppId')],\n        getChannelPropertiesFromInteraction: interaction =>\n            _getChannelPropertiesFromInteraction(interaction, 'whatsapp'),\n        getIdsFromExternalContact: externalContact => [externalContact.get('whatsAppId.phoneNumber')],\n        getIdFrom: phoneNumber => {\n            return {\n                display: getDisplayablePhoneNumberFrom(phoneNumber)\n            };\n        },\n        display: channelId =>\n            channelId.displayName\n                ? channelId.displayName\n                : channelId.phoneNumber.display\n                ? channelId.phoneNumber.display\n                : channelId.phoneNumber.e164\n                ? channelId.phoneNumber.e164\n                : '',\n        present: channelId => !!(channelId && channelId.phoneNumber),\n        hasCrucialChannelInfo: channelId => !!(channelId && channelId.phoneNumber && channelId.phoneNumber.display),\n        displayNameFrom: interaction => getDisplayOrScreenName(interaction),\n\n        // These two value getters are used by the confirmation-prompt component to\n        // get changes to a whatpsapp channel's displayed phone number in order to prompt\n        // the agent properly.\n        oldIdValue: (channelId, changedAttributes) => changedAttributes[`${channelId}`][0].display,\n        newIdValue: (channelId, changedAttributes) => changedAttributes[`${channelId}`][1].display,\n\n        isNewId: (ids, id) => !ids || ids.length !== 1 || ids[0] !== id, // ids is null, or a single-element string array containing an e164 phone number; id is an e164 number\n        svgIconKey: '#icon-whatsapp'\n    }\n];\n","// eslint-disable-next-line no-control-regex\nconst OnlyLatinChars = /^[\\u0000-\\u024F\\s]+$/i;\n\n/**\n * Determines if the provided name can have initials generated from it. Not all languages support\n * the ability to reduce a name to initials, such as Latin.\n *\n * @note\n * The currently unsupported characters are:\n * - Latin\n *\n * @param name the name to test with\n * @returns boolean value depicting if initials can be generated\n */\nexport function initialsSupported(name: string) {\n    return OnlyLatinChars.test(name);\n}\n\n/**\n * Generates the initials from a given name. If initials are not supported based on the characters of\n * the name provided then `null` will be returned.\n *\n * @note\n * This will adhere to a name string that has been formatted by a comma such as \"Last, First\" and will give\n * the correct initials of \"FL\" (for that instance).\n *\n * @param name the name of the initials in which to generate from\n * @returns the generated initials from the provided name, if none could be generated then `null` is returned\n */\nexport function getInitials(name: string) {\n    if (!initialsSupported(name)) return null;\n\n    const commaIndex = name.indexOf(',') > -1;\n    const spaceIndex = name.indexOf(' ') > -1;\n    const left = name[0].toUpperCase();\n    const right = name.charAt(name.indexOf(' ') + 1).toUpperCase();\n\n    if (commaIndex) {\n        return right + left;\n    } else if (!spaceIndex) {\n        return left;\n    }\n    return left + right;\n}\n","import serviceDiscovery from '@genesys/service-discovery-web-internal';\n\nconst VALID_LOCAL_HOSTNAMES = ['localhost', 'localhost.mypurecloud.com'];\n\n// Change me if you want to proxy locally to a higher environment.\nconst TARGET_ENV = 'dev';\n\nconst ENV_TRANSITIONS = {\n    dev: 'dca',\n    test: 'tca',\n    prod: 'pca'\n    // DO NOT ADD NEW ENVS HERE\n    // New envs will be defaulted to their true value in service-discovery-web\n};\n\nconst DEPLOYMENT_ID_MAP = {\n    dev: 'dca',\n    test: 'tca',\n    prod: 'us',\n    'prod-apne1': 'jp',\n    'prod-apne2': 'apne2',\n    'prod-aps1': 'aps1',\n    'prod-apse2': 'au',\n    'prod-cac1': 'cac1',\n    'prod-euc1': 'de',\n    'prod-euw1': 'ie',\n    'prod-euw2': 'euw2',\n    'prod-usw2': 'usw2'\n    // DO NOT ADD NEW REGIONS HERE\n    // New regions will be defaulted to their name in service-discovery-web\n};\n\nconst REGION_TRANSLATION_KEY_MAP = {\n    prod: 'components.region.global',\n    'prod-apne1': 'components.region.japan',\n    'prod-apne2': 'components.region.apne2',\n    'prod-aps1': 'components.region.aps1',\n    'prod-apse2': 'components.region.australia',\n    'prod-cac1': 'components.region.cac1',\n    'prod-euc1': 'components.region.germany',\n    'prod-euw1': 'components.region.ireland',\n    'prod-euw2': 'components.region.euw2',\n    'prod-usw2': 'components.region.usw2'\n    // DO NOT ADD NEW REGIONS HERE\n    // New regions will be defaulted to 'name': `components.region.${name}`\n};\n\nconst getPcApplicationsSubdomain = (_window = window) => {\n    // window passed in for testing\n    const subdomain = _window.location.hostname.split('.')[0];\n    return subdomain.toLowerCase() === 'app' ? 'app' : 'apps';\n};\n\nconst getEnv = ({ env }) => ENV_TRANSITIONS[env] || env;\nconst getRegion = ({ name, region }) => DEPLOYMENT_ID_MAP[name] || region;\nconst getDeploymentId = ({ name }) => DEPLOYMENT_ID_MAP[name] || name;\nconst getRegionTranslationKey = ({ name }) => REGION_TRANSLATION_KEY_MAP[name] || `components.region.${name}`;\nconst getDesktopId = environment => {\n    const deploymentId = getDeploymentId(environment);\n    return deploymentId === 'us' ? 'global' : deploymentId;\n};\n\nconst publicEnvFilter = { env: ['prod', 'fedramp'], status: ['beta', 'stable'] };\nexport const PUBLIC_ENVS = serviceDiscovery.getEnvironments(publicEnvFilter).map(environment => ({\n    id: getDeploymentId(environment),\n    desktopId: getDesktopId(environment),\n    region: getRegion(environment),\n    translationKey: getRegionTranslationKey(environment),\n    env: getEnv(environment),\n    envTld: environment.publicDomainName,\n    envStatus: environment.status\n}));\n\nexport const STABLE_PUBLIC_ENVS = serviceDiscovery.getEnvironments().map(environment => ({\n    id: getDeploymentId(environment),\n    desktopId: getDesktopId(environment),\n    region: getRegion(environment),\n    translationKey: getRegionTranslationKey(environment),\n    env: getEnv(environment),\n    envTld: environment.publicDomainName\n}));\n\nexport const parseRuntimeCustom = (url = window.location.href) => {\n    url = url.replace(/connections-ui/, TARGET_ENV);\n    return (\n        serviceDiscovery.parseRuntimeFromLocalPath(VALID_LOCAL_HOSTNAMES)(url) ||\n        serviceDiscovery.parseDeployedRuntime(url)\n    );\n};\n\nexport const getEnvDetails = (url = window.location.href) => {\n    if (!url || typeof url !== 'string') throw new Error('url must be a non-empty string');\n    const runtime = parseRuntimeCustom(url);\n    if (!runtime) throw new Error(`'${url}' is not a valid, known Genesys Cloud app location`);\n    return {\n        runtime, // Attach the service-discovery-web runtime\n        local: runtime.local,\n        envTld: runtime.local ? new URL(url).hostname : runtime.currentDomainName,\n        env: getEnv(runtime),\n        region: ['prod', 'fedramp'].includes(runtime.env) ? getRegion(runtime) : null\n    };\n};\n\nexport const getEnvCookieDomain = (hostname = window.location.hostname) => {\n    if (!hostname || typeof hostname !== 'string') {\n        throw new Error('hostname must be a non-empty string');\n    }\n    // Handle the local special cases\n    if (hostname === 'localhost') return '';\n    if (hostname === 'localhost.mypurecloud.com') return `.localhost.mypurecloud.com`;\n\n    const result = serviceDiscovery.parseDeployedRuntime(`https://${hostname}`);\n    if (!result) throw new Error(`'${hostname}' is not a valid, known Genesys Cloud app location`);\n    return `.${result.currentDomainName}`;\n};\n\nexport const isExternalDomain = url => !serviceDiscovery.isKnown(url, {});\n\nexport const getCurrentWindowOrigin = () => window.location.origin;\n\nexport default {\n    PUBLIC_ENVS,\n    STABLE_PUBLIC_ENVS,\n    getPcApplicationsSubdomain,\n    getEnvDetails,\n    getEnvCookieDomain,\n    isExternalDomain,\n    getCurrentWindowOrigin\n};\n","define(\"connections-ui/utils/newrelic-legacy\", [\"exports\", \"ember-purecloud-components/utils/newrelic-legacy\"], function (_exports, _newrelicLegacy) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _newrelicLegacy.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\n/*\n * This is a simple wrapper for New Relic's browser agent.  The goal is to no-op\n * when the browser agent is not available on the page (due to adblockers,\n * unit-tests, etc).\n */\n\nfunction addPageAction(actionName: string, attributes?: null | Record<string, any>) {\n    if (\n        window &&\n        'newrelic' in window &&\n        window.newrelic &&\n        typeof window.newrelic === 'object' &&\n        'addPageAction' in window.newrelic &&\n        typeof window.newrelic.addPageAction === 'function'\n    ) {\n        if (typeof actionName !== 'string' || !actionName.trim()) {\n            //actionName cannot be an empty string\n            Ember.Logger.error('Invalid actionName for addPageAction ->', {\n                remoteData: {\n                    actionName,\n                    actionNameType: typeof actionName\n                }\n            });\n            return;\n        }\n        if (attributes !== undefined && attributes !== null) {\n            // if not null and not undefined, attributes can be null/undefined\n            if (typeof attributes !== 'object' || Array.isArray(attributes)) {\n                Ember.Logger.error('Invalid attributes for addPageAction ->', {\n                    remoteData: {\n                        actionName,\n                        attrType: typeof attributes\n                    }\n                });\n                return;\n            } else {\n                const reservedKeys = ['accountId', 'timestamp', 'appId'];\n                attributes = Object.fromEntries(\n                    Object.entries(attributes)\n                        .map<[string, any] | null>(([key, value]) => {\n                            if (reservedKeys.includes(key)) {\n                                Ember.Logger.warn('Invalid reserved keys for addPageAction ->', {\n                                    remoteData: {\n                                        actionName,\n                                        attrKey: key\n                                    }\n                                });\n                                return null;\n                            }\n                            return [key, value];\n                        })\n                        .filter((curr): curr is [string, any] => {\n                            return !!curr;\n                        })\n                );\n            }\n        }\n        window.newrelic.addPageAction(actionName, attributes);\n    }\n}\n\nfunction setCustomAttribute(key: string, value: string | number | null | boolean, persist?: boolean) {\n    if (\n        window &&\n        'newrelic' in window &&\n        window.newrelic &&\n        typeof window.newrelic === 'object' &&\n        'setCustomAttribute' in window.newrelic &&\n        typeof window.newrelic.setCustomAttribute === 'function'\n    ) {\n        if (typeof key !== 'string') {\n            Ember.Logger.error('Invalid key for setCustomAttribute ->', {\n                remoteData: {\n                    key,\n                    keyType: typeof key\n                }\n            });\n            return;\n        }\n        if (value !== null && !['string', 'number', 'boolean'].includes(typeof value)) {\n            Ember.Logger.error('Invalid value for setCustomAttribute ->', {\n                remoteData: {\n                    key,\n                    valueType: typeof value\n                }\n            });\n            return;\n        }\n        if (typeof persist !== 'undefined' && typeof persist !== 'boolean') {\n            Ember.Logger.error('Invalid persist for setCustomAttribute ->', {\n                remoteData: {\n                    key,\n                    persistType: typeof persist\n                }\n            });\n            return;\n        }\n        window.newrelic.setCustomAttribute(key, value, persist);\n    }\n}\n\nexport { addPageAction, setCustomAttribute };\n","import Ember from 'ember';\nimport moment from './dates';\n\nconst { typeOf, Service, Application, get } = Ember;\n\n/**\n * @callback extractRawDataKeyFilter\n * @param {Array.<string>} path - An array of the ancesteral keys of this key. Array indices will be converted to strings. Note that the root node will not be included in this path so this array will be empty for root props/indices.\n * @param {string} key The current key to evaluate; Array indices will be converted to strings\n * @returns {boolean} true if the key and its associated value should be included; false to exclude.\n *\n * @callback extractRawDataValueFilter\n * @param {Array.<string>} path - An array of the keys down to the current value.  Array indices will be converted to strings. Note that the root node will not be included in this path so this array will be of length 1 for root values.\n * @param {*} value The current value to evaluate\n * @returns {boolean} true if the value and it's associated key should be included; false to exclude.\n */\n\nconst ALLOWED_VALUE_TYPES = [\n    'null',\n    'undefined',\n    'regexp',\n    'date',\n    'moment',\n    'boolean',\n    'number',\n    'string',\n    'array',\n    'object',\n    'instance'\n];\n\n/**\n * Extract raw data from the provided input. Practically, this can be\n * used for extracting the raw data from Ember Object instances with some gotchas:\n *\n * * Non-string keys are NOT included\n * * All non-enumerable properties are NOT included\n *   * This implicitly excludes prototype properties\n * * Certain value types are NOT included\n *   * symbol, filelist, class, error\n *   * function (computeds, observers, etc.)\n *\n * Other important items to note:\n *\n * * If any object (other than Date or moment instances) in the hierarchy implements toJSON, it will be called with the current key and the result will then be processed through the depth check, key filters, and value filters.\n * * Cycles are replaced with [Cycle] and are more likely if services or the container are referenced (Best Practice: Use the defaults to filter underscore keys and Ember Services)\n * * Depth of objects will affect efficiency (Best Practice: Remove unnecessary keys/values with filters and built-in options)\n * * Objects and arrays will be truncated with '[Object]' and '[Array(<length>)]' if the maxDepth is exceeded.\n *\n * @param {null|undefined|Array|object} input - The object to extract\n * @param {Object} options - Options for parsing the object\n * @param {number?} options.maxDepth - An integer indicating the max allowed traversal depth.  Once reached, Objects and Arrays will be replaced with '[Object]' and '[Array(<length>)]' respectively. Root properties considered at depth 1.  Defaults to no max depth.\n * @param {boolean?} options.excludeUnderscoreKeys [true] - if keys starting with _ should be excluded; defaults to true\n * @param {boolean?} options.excludeEmberServices [true] - if Ember Service values should be excluded; defaults to true\n * @param {extractRawDataKeyFilter?} options.keyFilter [null] - A filter function to apply to keys which are not already excluded by other means; true will include the key/value pair, false will exclude\n * @param {extractRawDataValueFilter?} options.valueFilter [null] - A filter function to apply to values which are not already excluded by other means; true will include the key/value pair, false will exclude\n * @throws Error if the provided input is not undefined, null, a custom object, an Ember instance, or an array\n * @throws Error if the provided input cannot be extracted.  This could occur because of excessive depth, invalid input parameter or object structure, a faulty toJSON nested implementation, etc.\n * @throws Error if any options are invalid\n * @returns {null|undefined|Array|object} output\n */\nexport function extractRawData(input, options = {}) {\n    let safeOptions = {\n        maxDepth: Number.MAX_SAFE_INTEGER,\n        excludeUnderscoreKeys: true,\n        excludeEmberServices: true,\n        excludeEmberApplications: true\n    };\n\n    if (typeOf(options) !== 'object') {\n        throw new Error('options can only be an object if specified');\n    } else {\n        if (Object.prototype.hasOwnProperty.call(options, 'maxDepth')) {\n            if (typeOf(options.maxDepth) === 'number' && options.maxDepth < Number.MAX_SAFE_INTEGER) {\n                safeOptions.maxDepth = Math.floor(options.maxDepth);\n            } else {\n                throw new Error('maxDepth must be a number less than Number.MAX_SAFE_INTEGER if specified');\n            }\n        }\n\n        if (Object.prototype.hasOwnProperty.call(options, 'keyFilter')) {\n            if (typeof options.keyFilter === 'function') {\n                safeOptions.keyFilter = options.keyFilter;\n            } else {\n                throw new Error('keyFilter must be a function if specified');\n            }\n        }\n\n        if (Object.prototype.hasOwnProperty.call(options, 'valueFilter')) {\n            if (typeof options.valueFilter === 'function') {\n                safeOptions.valueFilter = options.valueFilter;\n            } else {\n                throw new Error('valueFilter must be a function if specified');\n            }\n        }\n\n        if (Object.prototype.hasOwnProperty.call(options, 'excludeUnderscoreKeys')) {\n            if (typeOf(options.excludeUnderscoreKeys) === 'boolean') {\n                safeOptions.excludeUnderscoreKeys = options.excludeUnderscoreKeys.valueOf();\n            } else {\n                throw new Error('excludeUnderscoreKeys must be a boolean if specified');\n            }\n        }\n\n        if (Object.prototype.hasOwnProperty.call(options, 'excludeEmberServices')) {\n            if (typeOf(options.excludeEmberServices) === 'boolean') {\n                safeOptions.excludeEmberServices = options.excludeEmberServices.valueOf();\n            } else {\n                throw new Error('excludeEmberServices must be a boolean if specified');\n            }\n        }\n\n        if (Object.prototype.hasOwnProperty.call(options, 'excludeEmberApplications')) {\n            if (typeOf(options.excludeEmberApplications) === 'boolean') {\n                safeOptions.excludeEmberApplications = options.excludeEmberApplications;\n            } else {\n                throw new Error('excludeEmberApplications must be a boolean if specified');\n            }\n        }\n    }\n\n    let inputType = myTypeOf(input);\n\n    if (['null', 'undefined'].indexOf(inputType) >= 0) {\n        return input;\n    } else if (['array', 'object', 'instance'].indexOf(inputType) >= 0) {\n        return _extractRawDataHelper(null, input, safeOptions);\n    } else {\n        throw new Error(\n            'Input must be undefined, null, a custom object (not date, moment, regexp, filelist, error, etc), an Ember Instance, or an array'\n        );\n    }\n}\n\n/**\n * Recursive raw data extraction util.\n *\n * An item of the stack used to track history in traversing a nested array/object.\n * @typedef {Object} ContextStackItem\n * @property {array|object} scope - The parent object or array of the specified property\n * @property {string} propertyName - The name of the property (or index for arrays)\n *\n * A stack used track history while traversing a nested array/object.\n * @typedef {Array.<ContextStackItem>} ContextStack\n *\n * @param {ContextStack} contextStack The stack representing the lineage of the input parameter.  If null, input is considered the root input to extract.\n * @param {*} input The current object to extract\n * @param {*} options Type-safe and valid extraction options\n * @returns {Object|string|null} raw data representation of input\n */\nfunction _extractRawDataHelper(contextStack, input, options) {\n    let inputType = myTypeOf(input);\n\n    if (['null', 'undefined', 'regexp', 'date', 'moment'].indexOf(inputType) >= 0) {\n        return input;\n    }\n\n    if (['boolean', 'number', 'string'].indexOf(inputType) >= 0) {\n        if (typeof input.valueOf === 'function') {\n            return input.valueOf();\n        }\n\n        return input;\n    }\n\n    // Return null for all other cases: 'function', 'symbol', 'filelist', 'class', 'error'\n    if (['array', 'object', 'instance'].indexOf(inputType) < 0) {\n        return null;\n    }\n\n    // Found an array, object, or instance that may need to be recursed\n\n    // Check for cycles before decending\n    if (contextStack) {\n        let found = contextStack.find(currStackItem => currStackItem.scope === input);\n        if (found) {\n            return '[Cycle]';\n        }\n    }\n\n    // Check maxDepth before decending\n    let currLevel = contextStack ? contextStack.length : 0;\n\n    if (currLevel + 1 > options.maxDepth) {\n        if (inputType === 'array') {\n            return `[Array(${input.length})]`;\n        } else {\n            return '[Object]';\n        }\n    }\n\n    // Safe to recurse sub-object or array\n\n    if (inputType === 'array') {\n        return input.reduce((result, currItem, currIndex) => {\n            let currStack = buildNewContextStack(contextStack, input, currIndex.toString());\n            if (isAllowed(currStack, currItem, options)) {\n                result.push(_extractRawDataHelper(currStack, currItem, options));\n            }\n\n            return result;\n        }, []);\n    } else {\n        if (typeof input.toJSON === 'function') {\n            try {\n                let customJsonValue = input.toJSON(\n                    (contextStack && contextStack[contextStack.length - 1].propertyName) || ''\n                );\n\n                // Process the custom json value back through the _extractRawDataHelper to process filters, rules, and depth checks (max depth, fitlers, etc.)\n                // The original stack should be kept\n                return _extractRawDataHelper(contextStack, customJsonValue, options);\n            } catch (e) {\n                let wrappedJsonError = new Error('Failed to marshal nested toJSON representation');\n                wrappedJsonError.baseError = e;\n                throw wrappedJsonError;\n            }\n        }\n\n        // iterate on props\n        return Object.keys(input).reduce((acc, currKey) => {\n            let currValue = input[currKey];\n\n            let currStack = buildNewContextStack(contextStack, input, currKey);\n            if (!isAllowed(currStack, currValue, options)) {\n                return acc;\n            }\n\n            acc[currKey] = _extractRawDataHelper(currStack, input[currKey], options);\n\n            return acc;\n        }, {});\n    }\n}\n\n/**\n * Assesses if provided stack (containing the implicit curr key) and value pass various filters to be\n * included in the extracted object.\n *\n * @param {ContextStack} contextStack The historical stack from the root down to the current key\n * @param {*} value The value to check\n * @param {object} options The configurable filtering options (assumed to be valid)\n * @param {?boolean} options.excludeUnderscoreKeys [false] - if keys starting with _ should be excluded\n * @param {?boolean} options.excludeEmberServices [false] - if Ember Service values should be excluded\n * @param {?extractRawDataKeyFilter} options.keyFilter [null] - A filter function to apply to keys which are not already excluded by other means; true will include the key/value pair, false will exclude\n * @param {?extractRawDataValueFilter} options.valueFilter [null] - A filter function to apply to values which are not already excluded by other means; true will includ the key/value pair, false will exclude\n */\nfunction isAllowed(contextStack, value, options) {\n    let key = contextStack[contextStack.length - 1].propertyName;\n    let path = contextStack.slice(0, -1).map(curr => curr.propertyName);\n\n    // Check Filters\n    if (key) {\n        if (myTypeOf(key) !== 'string') {\n            return false;\n        }\n\n        if (options.excludeUnderscoreKeys && key.charAt(0) === '_') {\n            return false;\n        }\n\n        let keyFilter = options.keyFilter || null;\n        if (keyFilter && !keyFilter(path, key)) {\n            return false;\n        }\n    }\n\n    let valueType = myTypeOf(value);\n    if (ALLOWED_VALUE_TYPES.indexOf(valueType) < 0) {\n        return false;\n    }\n\n    if (options.excludeEmberServices && valueType === 'instance' && value instanceof Service) {\n        return false;\n    }\n\n    if (options.excludeEmberApplications && valueType === 'instance' && value instanceof Application) {\n        return false;\n    }\n\n    let valueFilter = options.valueFilter || null;\n    if (valueFilter && !valueFilter([...path, key], value)) {\n        return false;\n    }\n\n    return true;\n}\n\nfunction buildNewContextStack(currStack, scope, propertyName) {\n    let newStackItem = {\n        scope,\n        propertyName\n    };\n\n    if (currStack) {\n        return [...currStack, newStackItem];\n    } else {\n        return [newStackItem];\n    }\n}\n\nfunction myTypeOf(value) {\n    if (typeof value === 'symbol') {\n        return 'symbol';\n    }\n\n    if (value instanceof moment) {\n        return 'moment';\n    }\n\n    return typeOf(value);\n}\n\n/**\n * Utility to determine if object is destroyed\n * or being destroyed.\n * @param obj - Ember object to check\n * @returns boolean\n */\nexport function isDestroyed(obj) {\n    return get(obj, 'isDestroyed') || get(obj, 'isDestroying');\n}\n\nexport default {\n    extractRawData\n};\n","/**\n * A common regex for many different number formats. Includes the following and more:\n *\n * 18005551234\n * 1 800 555 1234\n * +1 800 555-1234\n * +86 800 555 1234\n * 1-800-555-1234\n * 1 (800) 555-1234\n * (800)555-1234\n * (800) 555-1234\n * (800)5551234\n * 800-555-1234\n * 800.555.1234\n * 800 555 1234x5678\n * 8005551234 x5678\n * 1    800    555-1234\n * 1----800----555-1234\n */\nconst PHONE_NUMBER_REGEX = /^\\s*(?:\\+?(\\d{1,3}))?[-. (]*(\\d{3})[-. )]*(\\d{3})[-. ]*(\\d{4})(?: *x(\\d+))?\\s*$/;\n\n/**\n * Tests the value provided against a phone number regex to determine if the number is valid.\n * @param value phone number to test against\n * @returns boolean depicting whether or not the number provided is valid\n */\nexport function isValidPhoneNumber(value: string): boolean {\n    return value ? PHONE_NUMBER_REGEX.test(value.trim()) : false;\n}\n","import type { Models } from 'purecloud-platform-client-internal-v2';\n\nexport function activityCounter(\n    contactCenter: Models.MediaSummaryDetail | Models.UserConversationsEventMediaSummaryDetail | number,\n    enterprise: Models.MediaSummaryDetail | Models.UserConversationsEventMediaSummaryDetail | number\n): number {\n    let contactCenterCount = 0;\n    let enterpriseCount = 0;\n\n    if (typeof contactCenter === 'number') {\n        contactCenterCount = contactCenter;\n    } else if (contactCenter && contactCenter.active) {\n        contactCenterCount = contactCenter.active;\n    }\n\n    if (typeof enterprise === 'number') {\n        enterpriseCount = enterprise;\n    } else if(enterprise && enterprise.active){\n        enterpriseCount = enterprise.active;\n    }\n\n    return contactCenterCount + enterpriseCount;\n}\n","/**\n * Checks if the presence source is a default presence source.\n * @param {string} source the presence source to check\n * @param {boolean} useDefaultName should we use 'default' as a presence source\n * @returns\n */\nexport function isDefaultPresence(source) {\n    // we will want to switch completely to 'default'\n    // as the only default presence source but will be blocked until\n    // the Presence Service is only returning 'default'.\n    return isPurecloudSource(source) || source === 'default';\n}\n/**\n * Checks if the presence source is PURECLOUD.\n * @param {string} source the presence source to check\n * @returns\n */\nexport function isPurecloudSource(source) {\n    return source && source.toLowerCase() === 'purecloud';\n}\n","export * from 'ember-purecloud-components/utils/presence';\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nfunction tap(proxy, promise) {\n    Ember.set(proxy, 'isFulfilled', false);\n    Ember.set(proxy, 'isRejected', false);\n\n    return promise.then(\n        function (result) {\n            var payload;\n            var content = result;\n            if (result && typeof result === 'object') {\n                content = result.collection;\n                payload = result.payload;\n            }\n\n            Ember.set(proxy, 'isFulfilled', true);\n            Ember.set(proxy, 'content', content);\n\n            Ember.set(proxy, 'content._payload', payload);\n            Ember.set(proxy, '_payload', payload);\n\n            return content;\n        },\n        function (reason) {\n            Ember.set(proxy, 'isRejected', true);\n            Ember.set(proxy, 'reason', reason);\n            throw reason;\n        },\n        'Ember: PromiseProxy'\n    );\n}\n\nexport default DS.PromiseArray.extend({\n    _payload: null,\n\n    promise: Ember.computed({\n        get() {\n            throw Ember.Logger.error(\"PromiseProxy's promise must be set\");\n        },\n\n        set(key, promise) {\n            return tap(this, promise);\n        }\n    })\n});\n","import _ from 'lodash';\n\nexport function parseQueryParams() {\n    var obj = {};\n    var params = window.location.search.slice(1).split('&');\n\n    _.each(params, function (param) {\n        const split = param.split('=');\n        const key = decodeURIComponent(split[0]);\n        const value = split.length > 1 ? decodeURIComponent(split[1]) : '';\n        obj[key] = value;\n    });\n\n    return obj;\n}\n","import Ember from 'ember';\nimport uuid from 'uuid';\n\nconst { computed, typeOf } = Ember;\nconst MSG_NAMESPACE = 'QueuedProcessingChain';\n\n/**\n * Queues events by queueId and processes said events serially through a processor chain.\n * Events across queues will be processed \"concurrently\" via javascript's event loop.\n *\n * Chain:\n * A sequence of 1 or more processors which run serially for an event.\n *\n * Processors:\n * A synchronous or async function that performs work.  Regardless of whether a\n * processor is sync or async, each processor within a queue will be run serially.  While\n * processors could perform side-effects, it is preferable to mutate the data\n * in the context or the context itself.\n *\n * Processor Return Values:\n * false - Stops the event from progressing further in the chain\n * undefined (explicit or implicit) - Passes the current context, as is, into the next processor\n * object - Passes the returned object to the next processor as it's context\n *\n * Processor Errors:\n * If a processor throws or rejects, an error will be logged and the event will stop\n * propogating through the chain.  It is advised that processor blocks handle\n * their own errors internally and either recover or explicitly stop the chain by returning false.\n *\n * Lifecycle:\n * Both the QueuedProcessingChain instance and an optional lifecycleContainer can be used to manage events\n * and processors.  If either this instance or the optional lifecycleContainer is\n * destroying/destroyed, all active event processing will be haulted, any queued\n * work will be dropped, and any future attempt to enqueue new work will noop.\n */\nconst QueuedProcessingChain = Ember.Object.extend({\n    // An ember object (instance) whose lifecycle should bind this chain's event processing\n    lifecycleContainer: undefined,\n    label: null,\n    _defaultLabel: null,\n    _chain: null,\n    _processingQueueMap: null,\n\n    init() {\n        this._super(...arguments);\n        this._defaultLabel = `processingChain-${uuid()}`;\n        this._chain = [];\n        this._processingQueueMap = {};\n\n        if (!['undefined', 'instance'].includes(typeOf(this.lifecycleContainer))) {\n            throw new Error('if specified, the lifecycleContainer must be an Ember instance');\n        }\n    },\n\n    setProcessingChain(chain) {\n        if (!chain || !Array.isArray(chain)) {\n            throw new Error(this._buildErrorMessage('Only an array can be used as a processing chain.'));\n        }\n\n        chain.forEach((p, index) => {\n            if (!isValidProcessor(p)) {\n                throw new Error(this._buildErrorMessage(`Invalid Processor Provided at ${index}`));\n            }\n        });\n\n        this._chain = chain;\n    },\n\n    appendToChain(processor) {\n        if (!isValidProcessor(processor)) {\n            throw new Error(this._buildErrorMessage('Invalid Processor Provided'));\n        }\n        this._chain.push(processor);\n\n        return this._chain;\n    },\n\n    enqueueEvent(queueId, event) {\n        // NICETOHAVE/FUTURE: Optimize the chain by rejecting duplicate events\n        if (!this._isLifecycleValid()) {\n            // Do not enqueue more events if the chain or container are shutting down\n            return;\n        }\n\n        if (this._processingQueueMap[queueId]) {\n            this._processingQueueMap[queueId].workQueue.unshift(event);\n        } else {\n            this._processingQueueMap[queueId] = {\n                workQueue: [event]\n            };\n        }\n        this._checkForWork();\n    },\n\n    _checkForWork() {\n        let emptyQueueIds = [];\n        for (let currQueueId in this._processingQueueMap) {\n            const currQueue = this._processingQueueMap[currQueueId];\n            if (!currQueue.activeWorkItem) {\n                if (currQueue.workQueue.length > 0) {\n                    // start work\n                    let event = currQueue.workQueue.pop();\n                    currQueue.activeWorkItem = (async () => {\n                        try {\n                            await this._processEventThroughChain(event);\n                        } catch (error) {\n                            Ember.Logger.error(this._buildLoggerMessage('Exception thrown in process chain'), {\n                                event,\n                                error,\n                                remoteData: {\n                                    chainLabel: this.get('_safeLabel')\n                                }\n                            });\n                        }\n                        currQueue.activeWorkItem = null;\n                        this._checkForWork();\n                    })();\n                } else {\n                    emptyQueueIds.push(currQueueId);\n                }\n            }\n        }\n\n        emptyQueueIds.forEach(c => {\n            this._processingQueueMap[c] = undefined;\n            delete this._processingQueueMap[c];\n        });\n    },\n\n    async _processEventThroughChain(event) {\n        if (!this._isLifecycleValid()) {\n            // Lifecycle ended.  Log and skip processing this event.\n            Ember.Logger.debug(\n                this._buildLoggerMessage(\n                    'Chain or Lifecycle Container are shutting down.  Event will be skipped.  All active and queued work will be dropped.'\n                ),\n                {\n                    event,\n                    remoteData: {\n                        chainLabel: this.get('_safeLabel'),\n                        chainIndex: 0\n                    }\n                }\n            );\n\n            return;\n        }\n\n        const chain = this._chain;\n        if (chain && chain.length > 0) {\n            Ember.Logger.debug(this._buildLoggerMessage('Processing Event through chain'), {\n                event,\n                remoteData: {\n                    chainLabel: this.get('_safeLabel')\n                }\n            });\n            await this._chainHelper(chain, 0, event);\n        }\n    },\n\n    async _chainHelper(chain, chainIndex, context) {\n        let processor = chain[chainIndex];\n        let { label, process } = processor;\n\n        if (!this._isLifecycleValid()) {\n            // Lifecycle ended.  Log and end this processing chain.\n            Ember.Logger.debug(\n                this._buildLoggerMessage(\n                    'Chain or Lifecycle Container are shutting down.  Processor will be skipped.  All active and queued work will be dropped.'\n                ),\n                {\n                    remoteData: {\n                        chainLabel: this.get('_safeLabel'),\n                        chainIndex,\n                        processorLabel: label\n                    }\n                }\n            );\n\n            return;\n        }\n\n        let processorResult;\n        try {\n            Ember.Logger.debug(this._buildLoggerMessage('Running Processor'), {\n                context,\n                remoteData: {\n                    chainLabel: this.get('_safeLabel'),\n                    chainIndex,\n                    processorLabel: label\n                }\n            });\n            processorResult = await process(context);\n        } catch (e) {\n            Ember.Logger.error(this._buildLoggerMessage('Processor threw or rejected'), {\n                context,\n                e,\n                remoteData: {\n                    chainLabel: this.get('_safeLabel'),\n                    chainIndex,\n                    processorLabel: label\n                }\n            });\n            return;\n        }\n\n        let processorResultType = typeOf(processorResult);\n        if (\n            !['undefined', 'boolean', 'object'].includes(processorResultType) ||\n            (processorResultType === 'boolean' && processorResult !== false)\n        ) {\n            Ember.Logger.error(this._buildLoggerMessage('Processor returned unallowed value'), {\n                context,\n                remoteData: {\n                    chainLabel: this.get('_safeLabel'),\n                    chainIndex,\n                    processorLabel: label,\n                    processorResultType\n                }\n            });\n            return;\n        }\n\n        if (processorResult === false) {\n            Ember.Logger.info(this._buildLoggerMessage('Processor haulted chain'), {\n                context,\n                remoteData: {\n                    chainLabel: this.get('_safeLabel'),\n                    chainIndex,\n                    processorLabel: label\n                }\n            });\n            return;\n        }\n\n        if (chainIndex + 1 < chain.length) {\n            // Call the next processor in the chain with the existing or mutated context\n            await this._chainHelper(chain, chainIndex + 1, !processorResult ? context : processorResult);\n        }\n    },\n\n    _buildLoggerMessage(msg) {\n        return [MSG_NAMESPACE, msg].join(' - ');\n    },\n\n    _buildErrorMessage(msg) {\n        return [MSG_NAMESPACE, this.get('_safeLabel'), msg].join(' - ');\n    },\n\n    _safeLabel: computed('label', '_defaultLabel', function () {\n        const { label, _defaultLabel } = this.getProperties('label', '_defaultLabel');\n        return label || _defaultLabel;\n    }),\n\n    _isLifecycleValid() {\n        const lifecycleContainer = this.get('lifecycleContainer');\n\n        return !(\n            this.get('isDestroying') ||\n            this.get('isDestroyed') ||\n            (lifecycleContainer && (lifecycleContainer.get('isDestroying') || lifecycleContainer.get('isDestroyed')))\n        );\n    }\n});\n\nfunction isValidProcessor(processor) {\n    if (!processor || !processor.process) {\n        return false;\n    }\n    return typeof processor === 'object' && typeof processor.process === 'function';\n}\n\nexport default QueuedProcessingChain;\n","import { isAjaxError, AjaxError } from 'ember-ajax/errors';\nimport DS from 'ember-data';\nimport { RawErrorResponse } from 'ember-ajax/-private/types';\nimport { hasKey } from './types';\n\nexport type RequestFailureLoggableDetails = {\n    status?: number;\n    correlationId?: string;\n};\n\nexport function getLoggableRequestFailureDetails(errorResponse: unknown): undefined | RequestFailureLoggableDetails {\n    if (!errorResponse || typeof errorResponse !== 'object') {\n        return undefined;\n    }\n\n    try {\n        if (errorResponse instanceof DS.AdapterError) {\n            return getAdapterErrorLoggableDetails(errorResponse);\n        } else if (isAjaxError(errorResponse)) {\n            return getAjaxErrorLoggableDetails(errorResponse);\n        } else if (isRawErrorResponse(errorResponse)) {\n            return getRawAjaxErrorLoggableDetails(errorResponse);\n        }\n    } catch (_) {}\n\n    return undefined;\n}\n\nfunction getAdapterErrorLoggableDetails(adapterError: DS.AdapterError): undefined | RequestFailureLoggableDetails {\n    if (hasKey(adapterError, 'errors') && Array.isArray(adapterError.errors) && adapterError.errors.length > 0) {\n        const error = adapterError.errors[0];\n        if (error && typeof error === 'object') {\n            // Tragically, all the various adapters in this baseline are inconsistent\n            // So, we need to check the root error as well as error.detail and error.details for the server payload\n            return Object.assign(\n                {},\n                ...[error, error.detail, error.details].map<undefined | RequestFailureLoggableDetails>(curr => {\n                    const payloadDetails = getLoggableRequestFailureDetailsPartial(curr);\n\n                    if (!payloadDetails) {\n                        return undefined;\n                    }\n\n                    // Prune out undefined values so they won't override previous, non-undefined values in Object.assign\n                    return Object.fromEntries(\n                        Object.entries(payloadDetails).filter(([, value]) => value !== undefined)\n                    );\n                })\n            );\n        }\n    }\n\n    return undefined;\n}\n\nfunction getAjaxErrorLoggableDetails({ status, payload }: AjaxError): undefined | RequestFailureLoggableDetails {\n    const result: RequestFailureLoggableDetails = {\n        status: status\n    };\n\n    if (\n        payload &&\n        typeof payload === 'object' &&\n        hasKey(payload, 'contextId') &&\n        typeof payload.contextId === 'string' &&\n        isUuid(payload.contextId)\n    ) {\n        result.correlationId = payload.contextId;\n    }\n\n    return result;\n}\n\nfunction getRawAjaxErrorLoggableDetails(rawErrorResponse: RawErrorResponse): RequestFailureLoggableDetails {\n    return {\n        status: rawErrorResponse.jqXHR.status,\n        correlationId: rawErrorResponse.jqXHR.getResponseHeader('inin-correlation-id') || undefined\n    };\n}\n\nfunction getLoggableRequestFailureDetailsPartial(payload: unknown): undefined | RequestFailureLoggableDetails {\n    if (!payload || typeof payload !== 'object') {\n        return undefined;\n    }\n\n    let result: undefined | RequestFailureLoggableDetails = undefined;\n\n    if (hasKey(payload, 'status')) {\n        if (typeof payload.status === 'number' && Number.isInteger(payload.status)) {\n            result = result || {};\n            result.status = payload.status;\n        } else if (typeof payload.status === 'string') {\n            const statusInt = parseInt(payload.status, 10);\n            if (Number.isInteger(statusInt) && payload.status === statusInt + '') {\n                result = result || {};\n                result.status = statusInt;\n            }\n        }\n    }\n\n    if (hasKey(payload, 'contextId') && typeof payload.contextId === 'string' && isUuid(payload.contextId)) {\n        result = result || {};\n        result.correlationId = payload.contextId;\n    }\n\n    return result;\n}\n\nconst UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/;\nfunction isUuid(toCheck: string) {\n    return UUID_REGEXP.test(toCheck);\n}\n\nfunction isRawErrorResponse(toCheck: unknown): toCheck is RawErrorResponse {\n    if (!toCheck || typeof toCheck !== 'object') return false;\n\n    // We can reasonably assume this is a ember-ajax RawErrorResponse\n    return ['payload', 'textStatus', 'jqXHR', 'errorThrown', 'response'].every(currProp =>\n        Object.prototype.hasOwnProperty.call(toCheck, currProp)\n    );\n}\n","define(\"connections-ui/utils/routing-status\", [\"exports\", \"ember-purecloud-components/utils/routing-status\"], function (_exports, _routingStatus) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _routingStatus.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default function (object, property, value) {\n    const { set } = Ember;\n    if (property && isSafe(object)) {\n        return set(object, property, value);\n    }\n}\n\nexport function isSafe(object) {\n    const { get } = Ember;\n    return object && !(get(object, 'isDestroyed') || get(object, 'isDestroying'));\n}\n","import { Promise, resolve, reject } from 'rsvp';\nimport type { StashLoggerLogPayload, StashLoggerService } from '@connections-ui/services';\nimport { hasKey } from './types';\n\nexport type AsyncPromiseChainStep = {\n    stepDesc: string;\n    process: () => Promise<any>;\n};\nexport type SyncPromiseChainStep = {\n    stepDesc: string;\n    processSync: () => any;\n};\n\nexport type PromiseChainStep = AsyncPromiseChainStep | SyncPromiseChainStep;\nfunction isSyncPromiseChainStep(toCheck: PromiseChainStep): toCheck is SyncPromiseChainStep {\n    return 'processSync' in toCheck;\n}\n\nexport type LoggingConfig = {\n    logger: StashLoggerService;\n    logMsgPrefix?: string;\n};\n\nexport type ChainOptions = {\n    loggingConfig?: LoggingConfig;\n};\n\nexport type ChainStepFailure = {\n    origReason: any;\n    stepDesc: string;\n};\n\nexport function isChainStepFailure(toCheck: unknown): toCheck is ChainStepFailure {\n    if (!toCheck || typeof toCheck !== 'object') {\n        return false;\n    }\n\n    return hasKey(toCheck, 'origReason') && hasKey(toCheck, 'stepDesc') && typeof toCheck.stepDesc === 'string';\n}\n\n/**\n * Serially executes a chain of synchronous and/or asynchronous steps utilizing RSVP promises\n * to work correctly with the Ember runloop.\n *\n * Work will not be started (no promise creation) until the previous step completes successfully\n * The chain will hault and reject with a ChainStepFailure upon the first encountered step rejection or thrown error\n */\nexport function executeChain(chain: PromiseChainStep[], { loggingConfig }: ChainOptions = {}): Promise<void> {\n    loggingConfig?.logger.debug(buildLogMsg('Chain begin', loggingConfig), {\n        remoteData: { chainLength: chain.length }\n    });\n\n    return chain\n        .reduce((acc, currChainStep, stepIndex) => {\n            const { stepDesc } = currChainStep;\n            const stepProgress = `${stepIndex + 1} of ${chain.length}`;\n            return acc.then(() => {\n                return resolve()\n                    .then(() => {\n                        loggingConfig?.logger.debug(buildLogMsg('Step begin', loggingConfig), {\n                            remoteData: { stepDesc, stepProgress }\n                        });\n                        if (isSyncPromiseChainStep(currChainStep)) {\n                            return currChainStep.processSync();\n                        } else {\n                            return currChainStep.process();\n                        }\n                    })\n                    .then(() => {\n                        loggingConfig?.logger.debug(buildLogMsg('Step success', loggingConfig), {\n                            remoteData: { stepDesc, stepProgress }\n                        });\n                        return;\n                    })\n                    .catch(reason => {\n                        loggingConfig?.logger.warn(buildLogMsg('Step failure', loggingConfig), {\n                            reason,\n                            remoteData: { stepDesc, stepProgress }\n                        });\n                        return reject({\n                            origReason: reason,\n                            stepDesc\n                        } as ChainStepFailure);\n                    });\n            });\n        }, resolve())\n        .then(() => {\n            loggingConfig?.logger.debug(buildLogMsg('Chain success', loggingConfig), {\n                remoteData: { chainLength: chain.length }\n            });\n        })\n        .catch(reason => {\n            const logPayload: StashLoggerLogPayload = {\n                remoteData: {\n                    chainLength: chain.length\n                }\n            };\n\n            // Theoretically, we ensure reason will always be a ChainStepFailure, but .. promise rejection typings\n            if (isChainStepFailure(reason)) {\n                logPayload.origReason = reason.origReason;\n                logPayload.remoteData!.failedStep = reason.stepDesc;\n            }\n\n            loggingConfig?.logger.warn(buildLogMsg('Chain failure', loggingConfig), logPayload);\n\n            return reject(reason);\n        });\n}\n\nfunction buildLogMsg(msg: string, loggingConfig: undefined | LoggingConfig) {\n    return `${loggingConfig?.logMsgPrefix ? loggingConfig.logMsgPrefix : ''}${msg}`;\n}\n","interface CacheItem<T> {\n    value: T;\n    timestamp: number;\n}\n\nexport default class SimpleCache {\n    private cache: Map<string, CacheItem<any>> = new Map();\n\n    set(id: string, value: any, ttlMinutes = 60): void {\n        const expirationTime = Date.now() + ttlMinutes * 60 * 1000;\n        this.cache.set(id, { value, timestamp: expirationTime });\n    }\n\n    get<T>(id: string): T | undefined {\n        const cachedItem = this.cache.get(id);\n\n        if (cachedItem && Date.now() < cachedItem.timestamp) {\n            return cachedItem.value;\n        }\n\n        this.cache.delete(id);\n        return undefined;\n    }\n\n    delete(id: string): void {\n        this.cache.delete(id);\n    }\n\n    clear(): void {\n        this.cache.clear();\n    }\n}\n","const SMS_PROP = {\n    FILE_SIZE: 5\n};\n\nexport default SMS_PROP;\n","import Ember from 'ember';\nimport computed from 'ember-computed';\nimport Howler from 'howler-but-with-updates';\nimport { isTesting } from './testing';\n\nconst Howl = Howler.Howl;\n\n// Recorder from: https://github.com/chris-rudmin/Recorderjs\nconst { MediaRecorder } = window;\n\nexport default Ember.Object.extend(Ember.Evented, {\n    ajax: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    recording: false,\n\n    blob: null,\n    recorder: null,\n\n    deferred: null,\n\n    init() {\n        this._super(...arguments);\n        if (isTesting) return;\n        this.setupRecorder();\n    },\n\n    destroy() {\n        this._super(...arguments);\n        if (this.recorder) {\n            this.recorder.clearStream();\n            this.recorder.audioContext.suspend();\n        }\n    },\n\n    mimeType: computed(function () {\n        const mimeTypes = ['audio/mp3', 'audio/ogg', 'audio/wav', 'audio/webm'];\n        return mimeTypes.find(mimeType => MediaRecorder.isTypeSupported(mimeType));\n    }),\n\n    format: computed('mimeType', function () {\n        // Forcing OGG for now\n        // return _.last(this.get('mimeType').split('/'));\n        return 'ogg';\n    }),\n\n    blobURL: computed('blob', function () {\n        const blob = this.get('blob');\n        if (blob) {\n            return this.getBlobUrl(blob);\n        }\n\n        return null;\n    }),\n\n    setupRecorder() {\n        this.deferred = Ember.RSVP.defer();\n        this.loadEncoder()\n            .then(encoderPath => {\n                this.recorder = new window.Recorder({\n                    encoderPath\n                });\n\n                const context = this.recorder.audioContext;\n                if (context && context.state === 'suspended') {\n                    return context.resume();\n                }\n            })\n            .then(() => {\n                this.recorder.addEventListener('streamReady', this._streamReady.bind(this));\n                this.recorder.addEventListener('stop', this._stoppedRecording.bind(this));\n                this.recorder.addEventListener('dataAvailable', this._onDataAvailable.bind(this));\n\n                this.deferred.resolve();\n            });\n    },\n\n    reset() {\n        this.set('blob', null);\n    },\n\n    startRecording() {\n        this.deferred.promise.then(() => {\n            this.recorder.initStream();\n\n            this.set('blob', null);\n            this.set('chunks', []);\n        });\n    },\n\n    resumeRecording() {\n        this.recorder.resume();\n    },\n\n    pauseRecording() {\n        this.recorder.pause();\n    },\n\n    stopRecording() {\n        this.recorder.stop();\n    },\n\n    createHowlFromBlob(blob) {\n        const blobUrl = URL.createObjectURL(blob);\n        return new Howl({\n            src: [blobUrl],\n            loop: false,\n            format: [this.get('format')],\n            html5: true\n        });\n    },\n\n    getBlobUrl(blob) {\n        return URL.createObjectURL(blob);\n    },\n\n    loadEncoder() {\n        return this._loadSoundRecorder().then(() => this._loadWorker());\n    },\n\n    _onDataAvailable(event) {\n        const blob = new Blob([event.detail], { type: 'audio/ogg' });\n        this.set('blob', blob);\n\n        this.trigger('blobready');\n    },\n\n    _streamReady() {\n        this.set('recording', true);\n        this.recorder.start();\n    },\n\n    _stoppedRecording() {\n        this.set('recording', false);\n    },\n\n    _loadSoundRecorder() {\n        if (window.Recorder) {\n            return Ember.RSVP.resolve();\n        }\n\n        const path = 'assets/recorder.min.js';\n        return new Ember.RSVP.Promise(resolve => {\n            Ember.$.getScript(path, function success() {\n                resolve();\n            });\n        });\n    },\n\n    _loadWorker() {\n        const path = 'assets/workers/encoderWorker.min.js';\n        return Ember.$.get(path).then(contents => {\n            const blob = new Blob([contents]);\n            return window.URL.createObjectURL(blob);\n        });\n    }\n});\n","export const MESSAGING_SUBTYPES = [\n    'apple',\n    'facebook',\n    'instagram',\n    'line',\n    'open',\n    'sms',\n    'twitter',\n    'wechat',\n    'whatsapp',\n    'webmessaging'\n] as const;\n","import ENV from 'connections-ui/config/environment';\n\n/**\n * Determines if the app is currently running in a testing mode or not based on the ENV config used\n * at build time.\n *\n * @returns boolean detailing if the environment is in testing mode or not\n */\nexport const isTesting = ENV.environment === 'test';\n","import { isSameSiteNoneCompatible } from 'should-send-same-site-none';\nimport { getEnvCookieDomain } from './net';\n\n/**\n * The current theme that the user has saved based on cookie value\n */\nlet currentTheme = null;\n\n/**\n * The name of the cookie being set.\n */\nexport const THEME_COOKIE = 'pureCloudTheme';\n/**\n * The time in seconds that the cookie will expire\n */\nexport const TEN_YEARS = 315360000; // in seconds\n\n/**\n * List of all possible themes that could be supported based on feature toggles and base classes. Key/value pair\n * to make sure values don't differ throughout the logic.\n * Please add a note next to the theme key/value detailing the ticket and feature toggle associated with it.\n *\n * Future Todo: We should move away from tacking on `-theme` to the end of the classes.\n */\nexport const THEME_CLASSES = {\n    LIGHT: 'light-theme', // default theme, always supported\n    DARK: 'dark-theme', // FT - webUiDarkTheme\n    BASE: 'purecloud-theme' // Legacy theme needed for app styling / TODO: Remove upon theme rework\n};\n/**\n * This is the theme that the app defaults to if a theme is not saved or selected yet.\n */\nexport const DEFAULT_THEME = THEME_CLASSES.LIGHT;\n/**\n * This is an array of the base themes that are always supported no matter what. Other themes may need to be hidden behind a feature toggle.\n */\nexport const BASE_THEME_LIST = [THEME_CLASSES.LIGHT];\n\n/**\n * This is the current theme list to select from. This function calculates all supported themes\n * based on feature toggles and returns a value of all themes that can be supported.\n * DEV NOTE: Add all new theme logic to this function to determine what themes to return.\n */\nexport function getThemeList(session) {\n    let extraThemes = [];\n\n    // Only check feature toggle based themes if session with features object is provided\n    if (session && session.features) {\n        if (session.features.webUiDarkTheme) {\n            extraThemes.push(THEME_CLASSES.DARK);\n        }\n    }\n\n    return [...BASE_THEME_LIST, ...extraThemes].sort((a, b) => {\n        if (a > b) {\n            return 1;\n        } else if (b > a) {\n            return -1;\n        } else {\n            return 0;\n        }\n    });\n}\n\n/**\n * Loads in the theme from the browsers cookies if there was a theme already set.\n * @param {string} cookies a long string of cookies that are character separated\n * @returns A new theming object used to set the applications theme\n */\nexport function loadTheme(session, cookies = document.cookie) {\n    const cookie = cookies\n        .split(/;[ \\t]?/)\n        .map(cookie => {\n            const [name, theme] = cookie.split('=');\n            return { name, theme };\n        })\n        .find(({ name }) => name === THEME_COOKIE);\n\n    if (cookie && getThemeList(session).find(theme => theme === cookie.theme)) {\n        return cookie;\n    } else {\n        return { theme: DEFAULT_THEME };\n    }\n}\n\n/**\n * Returns the current theme value being applied to the app\n * @returns the current theme value\n */\nexport function getThemeClass() {\n    return currentTheme;\n}\n\n/**\n * Sets the class of the provided element with the provided theme. Also removes the old theme class from the same element (if found), and sets the\n * `currentTheme` to the new value.\n * @param {{theme: THEME_CLASSES, element: HTMLELement}} param0 any object that contains at least the new theme and element to apply the class to.\n */\nexport function setThemeClass({ theme = THEME_CLASSES.LIGHT, element = document.body } = {}) {\n    if (currentTheme) {\n        element.classList.remove(currentTheme);\n    }\n\n    if (!element.classList.contains(THEME_CLASSES.BASE)) {\n        element.classList.add(THEME_CLASSES.BASE);\n    }\n\n    if (!element.classList.contains(theme)) {\n        element.classList.add(theme);\n    }\n\n    currentTheme = theme;\n}\n\n/**\n * Sets the theme cookie on the application to determine how the application should be styled when loaded in. Will alter the cookie values based on conditional values\n * such as the current locations protocol as well as the current browser being viewed on.\n * @param {{theme: THEME_CLASSES, duration: number, path: string, protocol: string, domain: string, setCookie: function, userAgent: string}} param0 an object used to set the new cookie value regarding the application theme\n */\nexport function setThemeCookie({\n    theme = THEME_CLASSES.LIGHT,\n    duration = TEN_YEARS,\n    path = '/',\n    protocol = _getCurrProtocol(),\n    domain = getEnvCookieDomain(),\n    setCookie = _setCookie, // mainly used for testing\n    userAgent = _getCurrUserAgent()\n} = {}) {\n    let cookieStmt = `${THEME_COOKIE}=${theme};path=${path};domain=${domain};max-age=${duration}`;\n\n    if (protocol === 'https:') {\n        cookieStmt += `;Secure`;\n    }\n\n    if (userAgent && typeof userAgent === 'string' && isSameSiteNoneCompatible(userAgent)) {\n        cookieStmt += `;SameSite=None`;\n    }\n\n    setCookie(cookieStmt);\n    setThemeClass({ theme });\n}\n\n/**\n * Resets the current theme back to undefined\n * Mainly used for testing purposes\n */\nexport function resetTheme() {\n    currentTheme = null;\n}\n\n/**\n * Private function to set the provided cookie on the document\n * @param {any} cookie the cookie w/ value to set\n */\nfunction _setCookie(cookie) {\n    document.cookie = cookie;\n}\n\n/**\n * Returns the windows current protocol. Expected `https:`\n * @returns the windows protocol\n */\nfunction _getCurrProtocol() {\n    if (window && window.location) {\n        return window.location.protocol;\n    }\n\n    return undefined;\n}\n\n/**\n * Returns the users current browser agent\n * @returns the users current browser agent\n */\nfunction _getCurrUserAgent() {\n    if (navigator && navigator.userAgent) {\n        return navigator.userAgent;\n    }\n\n    return undefined;\n}\n","define(\"connections-ui/utils/timeout-promise\", [\"exports\", \"ember-purecloud-components/utils/timeout-promise\"], function (_exports, _timeoutPromise) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _timeoutPromise.default;\n    }\n  });\n});\n","// Native Panels will eventually be replaced by providers and gadgets\nconst NATIVE_PANELS = ['details', 'scripts', 'responses', 'notes', 'scheduleCallback', 'wrapup'] as const;\ntype NativePanel = (typeof NATIVE_PANELS)[number];\n\nconst SCRIPTS_GADGET_PANEL_ID = 'scripts&scriptsProvider';\nconst deprecatedConversationSummaryPanelIds = ['interaction-details', 'agent-conversation-summary'].map(\n    currPanelId => `${currPanelId}&conversationSummaryInterapptionsProvider`\n);\nconst CONVERSATION_DETAILS_GADGET_PANEL_ID = 'conversation-details&conversationDetailsInterapptionsProvider';\nconst CANNED_RESPONSES_GADGET_PANEL_ID = 'responses&cannedResponsesProvider';\n// Assuming the provider and app id for Schedule Callbacks\nconst SCHEDULE_CALLBACK_GADGET_PANEL_ID = 'scheduleCallback&scheduleCallbackProvider';\nconst NOTES_GADGET_PANEL_ID = 'notesGadget&notesGadgetProvider';\nconst WRAPUP_GADGET_PANEL_ID = 'wrapupCodesGadget&wrapupCodesGadgetProvider';\n\nexport interface PanelSetting {\n    type: 'BuiltIn' | 'BuiltInInterapption' | 'Integration';\n    panelId: string;\n}\n\ninterface TransformationMap {\n    [key: string]: {\n        dependentFeatureToggles?: string[];\n        active: (features: Record<string, boolean>) => boolean;\n        shouldTransformPanelSetting: (panelSetting: PanelSetting) => boolean;\n        transformPanelSetting: () => PanelSetting;\n        // Supports both single and multipanel\n        shouldTransformAppDefId: (appDefId: string) => boolean;\n        transformAppDefId: () => string;\n    };\n}\n\nconst transformationMaps: TransformationMap = {\n    // Note: Conversation Summary will be replaced by Conversation Details before going GA\n    // CS options were never shipped to AUiB and CS used two different panel ids which complicates the transform\n    // As such, we're only supporting between details and conversation-details\n    details: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'details' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: CONVERSATION_DETAILS_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return ['details', addNativeProvider('details'), ...deprecatedConversationSummaryPanelIds].includes(\n                appDefId\n            );\n        },\n        transformAppDefId: () => {\n            return CONVERSATION_DETAILS_GADGET_PANEL_ID;\n        },\n        dependentFeatureToggles: ['conversationSummary3256', 'PURE-3256_useConversationDetails'],\n        active: features => {\n            return features.conversationSummary3256 && features['PURE-3256_useConversationDetails'];\n        }\n    },\n    reverseDetails: {\n        shouldTransformPanelSetting: panelSetting => {\n            return (\n                panelSetting.panelId === CONVERSATION_DETAILS_GADGET_PANEL_ID &&\n                panelSetting.type.toLowerCase() === 'builtininterapption'\n            );\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltIn',\n                panelId: 'details'\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return [...deprecatedConversationSummaryPanelIds, CONVERSATION_DETAILS_GADGET_PANEL_ID].includes(appDefId);\n        },\n        transformAppDefId: () => {\n            return 'details';\n        },\n        active: features => {\n            return !transformationMaps.details.active(features);\n        }\n    },\n    notes: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'notes' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: NOTES_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === 'notes' || appDefId === addNativeProvider('notes');\n        },\n        transformAppDefId: () => {\n            return NOTES_GADGET_PANEL_ID;\n        },\n        dependentFeatureToggles: ['auraACWGadgets'],\n        active: features => {\n            return features['auraACWGadgets'];\n        }\n    },\n    reverseNotes: {\n        shouldTransformPanelSetting: panelSetting => {\n            return (\n                panelSetting.panelId === NOTES_GADGET_PANEL_ID &&\n                panelSetting.type.toLowerCase() === 'builtininterapption'\n            );\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltIn',\n                panelId: 'notes'\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === NOTES_GADGET_PANEL_ID;\n        },\n        transformAppDefId: () => {\n            return 'notes';\n        },\n        active: features => {\n            return !transformationMaps.notes.active(features);\n        }\n    },\n    wrapup: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'wrapup' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: WRAPUP_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === 'wrapup' || appDefId === addNativeProvider('wrapup');\n        },\n        transformAppDefId: () => {\n            return WRAPUP_GADGET_PANEL_ID;\n        },\n        dependentFeatureToggles: ['auraACWGadgets'],\n        active: features => {\n            return features['auraACWGadgets'];\n        }\n    },\n    reverseWrapup: {\n        shouldTransformPanelSetting: panelSetting => {\n            return (\n                panelSetting.panelId === WRAPUP_GADGET_PANEL_ID &&\n                panelSetting.type.toLowerCase() === 'builtininterapption'\n            );\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltIn',\n                panelId: 'wrapup'\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === WRAPUP_GADGET_PANEL_ID;\n        },\n        transformAppDefId: () => {\n            return 'wrapup';\n        },\n        active: features => {\n            return !transformationMaps.wrapup.active(features);\n        }\n    },\n    responses: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'responses' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: CANNED_RESPONSES_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === 'responses' || appDefId == addNativeProvider('responses');\n        },\n        transformAppDefId: () => {\n            return CANNED_RESPONSES_GADGET_PANEL_ID;\n        },\n        dependentFeatureToggles: ['PURE-5421_CannedResponse_Gadget'],\n        active: features => {\n            return features['PURE-5421_CannedResponse_Gadget'];\n        }\n    },\n    reverseResponses: {\n        shouldTransformPanelSetting: panelSetting => {\n            return (\n                panelSetting.panelId === CANNED_RESPONSES_GADGET_PANEL_ID &&\n                panelSetting.type.toLowerCase() === 'builtininterapption'\n            );\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltIn',\n                panelId: 'responses'\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === CANNED_RESPONSES_GADGET_PANEL_ID;\n        },\n        transformAppDefId: () => {\n            return 'responses';\n        },\n        active: features => {\n            return !transformationMaps.responses.active(features);\n        }\n    },\n    scheduleCallback: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'scheduleCallback' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: SCHEDULE_CALLBACK_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === 'scheduleCallback' || appDefId === addNativeProvider('scheduleCallback');\n        },\n        transformAppDefId: () => {\n            return SCHEDULE_CALLBACK_GADGET_PANEL_ID;\n        },\n        dependentFeatureToggles: ['scheduleCallbackGadget'], // assumption for the ft\n        active: features => {\n            return features['scheduleCallbackGadget']; // assumption for the ft\n        }\n    },\n    reverseScheduleCallback: {\n        shouldTransformPanelSetting: panelSetting => {\n            return (\n                panelSetting.panelId === SCHEDULE_CALLBACK_GADGET_PANEL_ID &&\n                panelSetting.type.toLowerCase() === 'builtininterapption'\n            );\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltIn',\n                panelId: 'scheduleCallback'\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === SCHEDULE_CALLBACK_GADGET_PANEL_ID;\n        },\n        transformAppDefId: () => {\n            return 'scheduleCallback';\n        },\n        active: features => {\n            return !transformationMaps.scheduleCallback.active(features);\n        }\n    },\n    scripts: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'scripts' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: SCRIPTS_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === 'scripts' || appDefId === addNativeProvider('scripts');\n        },\n        transformAppDefId: () => {\n            return SCRIPTS_GADGET_PANEL_ID;\n        },\n        dependentFeatureToggles: ['PURE-6186_Scripter_Gadget_GCUI'], // assumption for the ft\n        active: features => {\n            // Here, we do not have to check for workitem scripter FT\n            // PEF does not support workitems and therefore we only need to transform query params for conversations\n            // The Workitem scripter PM setting will use the built-in provider panel setting from the get-go\n            // The workitem scritper panel will use the built-in provider panelId from the get-go\n            // legacy scripter panel ids in layout models only need to be transformed for conversations;\n            //   again because workitem scripter panelIds will use provider from the get-go\n            return features['PURE-6186_Scripter_Gadget_GCUI'];\n        }\n    }\n};\n\nexport const transformationDependentFeatureToggles = [\n    ...new Set(\n        Object.values(transformationMaps).flatMap(({ dependentFeatureToggles }) => dependentFeatureToggles ?? [])\n    )\n];\n\nexport const buildTransformationFtComputedDepKey = (injectionPrefix: string): string => {\n    return `${injectionPrefix}.{${transformationDependentFeatureToggles.join(',')}}`;\n};\n\nexport const standardTransformationFtComputedDepKey = buildTransformationFtComputedDepKey('session.features');\n\nexport const transformPanelSetting = (panelSetting: PanelSetting, features: Record<string, boolean>) => {\n    const requiredTransform = Object.values(transformationMaps).find(\n        transform => transform.active(features) && transform.shouldTransformPanelSetting(panelSetting)\n    );\n    if (requiredTransform) {\n        return requiredTransform.transformPanelSetting();\n    }\n    return panelSetting;\n};\n\n/**\n * Transforms the provided panelId to the target panelId based on the enable state of various transformers.\n * If no applicable transformer is found, the original panelId is returned. This\n * transformation will work for native src panels with and without a native provider, but note that\n * transformations back to native panels will not include the native provider.  If the native provider is needed,\n * callers should call `addNativeProvider` on the returned panelId.\n *\n * @param panelId The panelId (with or without native provider) to transform, when applicable\n * @param features The feature flags to use when determining which transformer to use\n * @returns A transformed panelId if applicable, otherwise the original panelId.  Native panelIds will not include the native provider.\n */\nexport const transformPanelId = (panelId: string, features: Record<string, boolean>) => {\n    // Normalize native panel ids to not include the native provider for searching transformers\n    const srcNativePanelMatch = findNativePanel(panelId);\n    const toSearch = srcNativePanelMatch ? srcNativePanelMatch.panelId : panelId;\n\n    const requiredTransform = Object.values(transformationMaps).find(\n        transform => transform.active(features) && transform.shouldTransformAppDefId(toSearch)\n    );\n    if (requiredTransform) {\n        return requiredTransform.transformAppDefId();\n    }\n    return panelId;\n};\n\n/**\n * Appends the native provider to the end of the provided panelId if it represents a native panel.\n * This function is idempotent and safe to call on non-native panelIds as well as panelIds\n * which may already include the native provider.\n *\n * eg.\n * scheduleCallback -> scheduleCallback&native\n * scheduleCallback&native -> scheuldeCallback&native\n * nonNativePanelId -> nonNativePanelId\n * nonNativePanelId&nonNativeProviderId -> nonNativePanelId&nonNativeProviderId\n */\nexport const addNativeProvider = (panelId: string): string => {\n    const nativePanel = findNativePanel(panelId);\n    if (nativePanel) {\n        return `${nativePanel.panelId}&native`;\n    }\n\n    return panelId;\n};\n\ntype NativePanelMatch = {\n    panelId: NativePanel;\n    includedNativeProvider: boolean;\n};\nconst findNativePanel = (panelId: string): NativePanelMatch | undefined => {\n    const nativePanel = NATIVE_PANELS.find(\n        currNativePanel => panelId === currNativePanel || panelId === `${currNativePanel}&native`\n    );\n    if (!nativePanel) {\n        return;\n    }\n\n    return {\n        panelId: nativePanel,\n        includedNativeProvider: panelId.endsWith('&native')\n    };\n};\n","import { hasKey } from './types';\n\ntype CacheEntry<T> = {\n    expirationTimestamp?: number;\n    value: T;\n};\ntype TtlCacheConfig = {\n    defaultTtl?: number;\n};\n\n// A bit of jitter to ensure the TTL has been reached upon timer expiration\nconst TIMER_JITTER_MILLIS = 5;\n\nexport default class TtlCache<T> {\n    private config: TtlCacheConfig;\n    private cacheData: Record<string, CacheEntry<T>>;\n    private expiryCheck: {\n        timerRef?: number;\n        nextExpirationTimestamp?: number;\n    };\n    private tearingDown: boolean;\n\n    constructor({ defaultTtl }: TtlCacheConfig = {}) {\n        this.config = {\n            // <0, 0, and undefined all equate to no TTL (undefined)\n            defaultTtl: this.normalizeTtl(defaultTtl)\n        };\n        this.cacheData = {};\n        this.tearingDown = false;\n        this.expiryCheck = {};\n    }\n\n    keys(): string[] {\n        return Object.keys(this.cacheData);\n    }\n\n    /**\n     * Returns true if the key is in the cache, regardless of expiry; flase otherwise.\n     * Calls to has and get are stable within the same function.\n     *\n     * @param key The key to check\n     * @returns true if an item exists in the case under the specified key (regardless of expiry); false otherwise.\n     */\n    has(key: string): boolean {\n        return hasKey(this.cacheData, key);\n    }\n\n    get(key: string): undefined | T {\n        return this.cacheData[key]?.value;\n    }\n\n    /**\n     * @param key The key to use for this cache entry\n     * @param value The value to use for this cache entry\n     * @param ttl Unspecified/undefined uses the default ttl; <=0 indicates no caching, ttl otherwise\n     */\n    put(key: string, value: T, ttl?: number) {\n        const currTimeMillis = Date.now();\n\n        // Use the default ttl if item ttl is unspecified\n        // <=0 indicates no cache\n        const effectiveTtl = typeof ttl === 'undefined' ? this.config.defaultTtl : this.normalizeTtl(ttl);\n        const expirationTimestamp = typeof effectiveTtl === 'number' ? currTimeMillis + effectiveTtl : undefined;\n\n        this.cacheData[key] = {\n            expirationTimestamp,\n            value\n        };\n\n        if (expirationTimestamp) {\n            this.scheduleEviction(expirationTimestamp);\n        }\n    }\n\n    delete(key: string): boolean {\n        if (this.has(key)) {\n            const removedExpirationTimestamp = this.cacheData[key]?.expirationTimestamp;\n            delete this.cacheData[key];\n\n            if (removedExpirationTimestamp && removedExpirationTimestamp === this.expiryCheck.nextExpirationTimestamp) {\n                // We've removed an item which matches the next eviction timestamp\n\n                // Clear the existing timer.  Otherwise, scheduleEviction will still see\n                // the exiting timer as earlier than the new timer we're trying to set and noop\n                this.clearEvictionTimer();\n\n                // Re-schedule the eviction timer in case this is the last such entry at that eviction time\n                this.scheduleEviction();\n            }\n\n            return true;\n        }\n\n        return false;\n    }\n\n    clear() {\n        this.clearEvictionTimer();\n\n        this.cacheData = {};\n    }\n\n    tearDown(): void {\n        this.tearingDown = true;\n\n        this.clearEvictionTimer();\n\n        this.clear();\n    }\n\n    private clearEvictionTimer() {\n        if (this.expiryCheck.timerRef) {\n            window.clearTimeout(this.expiryCheck.timerRef);\n        }\n\n        this.expiryCheck = {};\n    }\n\n    /**\n     * Schedules an eviction timer to run approximately at the sprecified timestamp if no earlier timer already exists.\n     *\n     * If an earlier timer exists, this function will no-op; however, the \"interval\" will continue to be set\n     * based on the expiry timestamps of the cache, always selecting the nearest timestamp until no such timer is needed.\n     *\n     * @param requestedTimestamp The desired timestamp for the next timer. If no timestamp is provided, the next\n     *  timer will be calculated from the entries in the cache.\n     */\n    private scheduleEviction(requestedTimestamp = this.getEarliestExpirationTimestamp()) {\n        const currTimeMillis = Date.now();\n\n        if (this.tearingDown || typeof requestedTimestamp !== 'number' || requestedTimestamp < currTimeMillis) {\n            return;\n        }\n\n        if (\n            this.expiryCheck.nextExpirationTimestamp &&\n            this.expiryCheck.nextExpirationTimestamp <= requestedTimestamp\n        ) {\n            return;\n        }\n\n        if (this.expiryCheck.timerRef) {\n            window.clearTimeout(this.expiryCheck.timerRef);\n        }\n\n        this.expiryCheck.nextExpirationTimestamp = requestedTimestamp;\n        this.expiryCheck.timerRef = window.setTimeout(() => {\n            this.evictExpiredItems();\n            this.scheduleEviction();\n        }, requestedTimestamp - currTimeMillis + TIMER_JITTER_MILLIS);\n    }\n\n    private evictExpiredItems() {\n        const currTimeMillis = Date.now();\n        Object.entries(this.cacheData).forEach(([key, cacheEntry]) => {\n            if (cacheEntry.expirationTimestamp && cacheEntry.expirationTimestamp <= currTimeMillis) {\n                delete this.cacheData[key];\n            }\n        });\n    }\n\n    private getEarliestExpirationTimestamp() {\n        let earliestExpiration: undefined | number;\n\n        Object.values(this.cacheData).forEach(({ expirationTimestamp }) => {\n            if (expirationTimestamp && (!earliestExpiration || expirationTimestamp < earliestExpiration)) {\n                earliestExpiration = expirationTimestamp;\n            }\n        });\n\n        return earliestExpiration;\n    }\n\n    private normalizeTtl(ttl: undefined | number) {\n        if (typeof ttl === 'undefined') {\n            return undefined;\n        }\n\n        if (ttl <= 0) {\n            return undefined;\n        }\n\n        return ttl;\n    }\n}\n","const TWITTER_PROP = {\n    FILE_SIZE: 3,\n    MESSAGE_TYPE: 'twitter'\n};\n\nexport default TWITTER_PROP;\n","/*\n * Utility and Common types\n * Note: Feature-specific types should be kept within their own or separate util files.\n */\nexport function assertNever(x: never): never {\n    throw new Error(`Unexpected object: ${x}`);\n}\n\n// TS can't narrow `object` to an object with a known key, so we need a type-guard for that\nexport function hasKey<K extends string>(obj: object, key: K): obj is Record<K, unknown> {\n    return key in obj;\n}\n\n// Includes type-guard/utility for readonly arrays/tuples/string unions\nexport function includes<S extends string>(haystack: readonly S[], needle: string): needle is S {\n    const _haystack: readonly string[] = haystack;\n    return _haystack.includes(needle);\n}\n\nexport type UnionFromTuple<T extends any[] | readonly any[]> = T[number];\n","const APPS_URI_V2 = 'api/v2/apps';\nconst BASE_URI_V2 = 'api/v2/conversations';\nconst PC_BASE_URI = 'platform';\n\nconst SEND_MESSAGING_TYPING_URI = 'messages/{conversationId}/communications/{communicationId}/typing';\nconst GET_APPS_DOWNLOAD_URI = 'downloads/{downloadId}?contentDisposition=INLINE';\n\n/**\n * Replaces patterns param names with provided values.\n * @param path - the string path to replace\n * @param values - the replacement values\n */\nfunction paramReplace(path: string, baseUri: string, values: Record<string, string>) {\n    for (const [key, value] of Object.entries(values)) {\n        const pattern = new RegExp(`\\{${key}\\}`);\n        path = path.replace(pattern, value);\n    }\n    return `/${PC_BASE_URI}/${baseUri}/${path}`;\n}\n\nexport default function UriBuilder() {\n    return {\n        /**\n         * Path to notify a message conversation's typing state\n         * @param conversationId - the conversation guid\n         * @param communicationId - the communication guid\n         */\n        sendMessagingTypingUri(conversationId: string, communicationId: string) {\n            const params = { conversationId, communicationId };\n            return paramReplace(SEND_MESSAGING_TYPING_URI, BASE_URI_V2, params);\n        },\n\n        /**\n         * Path to retrieve the download URL for the specified download.\n         * Used for cookie authentication.\n         * @param downloadId - the download guid\n         */\n        getAppsDownloadUri(downloadId: string) {\n            const params = { downloadId };\n            return paramReplace(GET_APPS_DOWNLOAD_URI, APPS_URI_V2, params);\n        }\n    };\n}\n","define(\"connections-ui/utils/uuid-generator\", [\"exports\", \"ember-uuid/utils/uuid-generator\"], function (_exports, _uuidGenerator) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _uuidGenerator.default;\n    }\n  });\n  Object.defineProperty(_exports, \"parse\", {\n    enumerable: true,\n    get: function get() {\n      return _uuidGenerator.parse;\n    }\n  });\n  Object.defineProperty(_exports, \"unparse\", {\n    enumerable: true,\n    get: function get() {\n      return _uuidGenerator.unparse;\n    }\n  });\n  Object.defineProperty(_exports, \"v1\", {\n    enumerable: true,\n    get: function get() {\n      return _uuidGenerator.v1;\n    }\n  });\n  Object.defineProperty(_exports, \"v4\", {\n    enumerable: true,\n    get: function get() {\n      return _uuidGenerator.v4;\n    }\n  });\n});\n","import uuid from 'uuid';\n\nfunction generate() {\n    return uuid.v4();\n}\n\nexport default {\n    generate\n};\n","define(\"connections-ui/utils/video-frame-checker\", [\"exports\", \"ember-webrtc-troubleshoot/utils/video-frame-checker\"], function (_exports, _videoFrameChecker) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _videoFrameChecker.default;\n    }\n  });\n});\n","const WEBMESSAGING_PROP = {\n    CHARACTER_LIMIT: 4000,\n    FILE_SIZE: 25\n};\n\nexport default WEBMESSAGING_PROP;\n","define(\"connections-ui/validators/alias\", [\"exports\", \"ember-cp-validations/validators/alias\"], function (_exports, _alias) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _alias.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/belongs-to\", [\"exports\", \"ember-cp-validations/validators/belongs-to\"], function (_exports, _belongsTo) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _belongsTo.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/collection\", [\"exports\", \"ember-cp-validations/validators/collection\"], function (_exports, _collection) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _collection.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/confirmation\", [\"exports\", \"ember-cp-validations/validators/confirmation\"], function (_exports, _confirmation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _confirmation.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/date\", [\"exports\", \"ember-cp-validations/validators/date\"], function (_exports, _date) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _date.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/dependent\", [\"exports\", \"ember-cp-validations/validators/dependent\"], function (_exports, _dependent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _dependent.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/ds-error\", [\"exports\", \"ember-cp-validations/validators/ds-error\"], function (_exports, _dsError) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _dsError.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/exclusion\", [\"exports\", \"ember-cp-validations/validators/exclusion\"], function (_exports, _exclusion) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _exclusion.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/format\", [\"exports\", \"ember-cp-validations/validators/format\"], function (_exports, _format) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _format.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/has-many\", [\"exports\", \"ember-cp-validations/validators/has-many\"], function (_exports, _hasMany) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _hasMany.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/inclusion\", [\"exports\", \"ember-cp-validations/validators/inclusion\"], function (_exports, _inclusion) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _inclusion.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/length\", [\"exports\", \"ember-cp-validations/validators/length\"], function (_exports, _length) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _length.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/messages\", [\"exports\", \"ember-intl-cp-validations/validators/messages\"], function (_exports, _messages) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _messages.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/number\", [\"exports\", \"ember-cp-validations/validators/number\"], function (_exports, _number) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _number.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/presence\", [\"exports\", \"ember-cp-validations/validators/presence\"], function (_exports, _presence) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _presence.default;\n    }\n  });\n});\n","define(\"connections-ui/video-participant-v2/model\", [\"exports\", \"ember-webrtc-components/models/video-participant-v2\"], function (_exports, _videoParticipantV) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _videoParticipantV.default;\n    }\n  });\n});\n","define(\"connections-ui/video-participant/model\", [\"exports\", \"ember-webrtc-components/models/video-participant\"], function (_exports, _videoParticipant) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _videoParticipant.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    templateName: 'card/tree/tree',\n    classNames: ['card-tree-container', 'container-fluid'],\n\n    attachTextInputListeners: Ember.on('didInsertElement', function () {\n        const fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        return fields.on('keydown', event => event.stopPropagation());\n    }),\n\n    removeTextInputListeners: Ember.on('willClearRender', function () {\n        const fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        return fields.off('keydown');\n    })\n});\n","define(\"connections-ui/webrtc-conversation/model\", [\"exports\", \"ember-webrtc-components/models/webrtc-conversation\"], function (_exports, _webrtcConversation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _webrtcConversation.default;\n    }\n  });\n});\n","define('connections-ui/config/environment', ['ember'], function(Ember) {\n  var prefix = 'connections-ui';\ntry {\n  var metaName = prefix + '/config/environment';\n  var rawConfig = document.querySelector('meta[name=\"' + metaName + '\"]').getAttribute('content');\n  var config = JSON.parse(unescape(rawConfig));\n\n  var exports = { 'default': config };\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n  return exports;\n}\ncatch(err) {\n  throw new Error('Could not read config from meta tag with name \"' + metaName + '\".');\n}\n\n});\n","if (!runningTests) {\n  require(\"connections-ui/app\")[\"default\"].create({\"version\":\"1.6.2\",\"semver\":\"1.6.2+6-hotfix/1.6-72b4d7d8dfce23e7f48e99b52c3d47299e25d0b1\",\"urlprefix\":\"https://dhqbrvplips7x.cloudfront.net/connections-ui/1.6.2-6/\",\"buildNumber\":\"6\",\"libs\":{\"@purecloud/ember-purecloud-components\":\"13.6.7\",\"@purecloud/ember-softphone-integration\":\"1.0.8\"},\"INTL_LANGUAGES\":{\"ar\":\"العربية (beta)\",\"cs\":\"Čeština\",\"da\":\"Dansk\",\"de\":\"Deutsch\",\"en-us\":\"English\",\"es\":\"Español\",\"fi\":\"Suomi\",\"fr-ca\":\"Français (Canada) (beta)\",\"fr\":\"Français\",\"he\":\"עברית (beta)\",\"hi\":\"हिन्दी (beta)\",\"it\":\"Italiano\",\"ja\":\"日本語\",\"ko\":\"한국어\",\"nl\":\"Nederlands\",\"no\":\"Norsk\",\"pl\":\"Polski\",\"pt-br\":\"Português do Brasil\",\"pt-pt\":\"Português\",\"ru\":\"Русский\",\"sv\":\"Svenska\",\"th\":\"ไทย (beta)\",\"tr\":\"Türkçe\",\"uk\":\"Українська\",\"zh-cn\":\"简体中文\",\"zh-tw\":\"繁體中文\"},\"name\":\"connections-ui\"});\n}\n"]}