com.phloxui
Version:
PhloxUI Ng2+ Framework
745 lines (744 loc) • 80.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Injectable } from '@angular/core';
const /** @type {?} */ KEY_MODIFIER = ["ctrl", "shift", "option", "alt", "command", "control"];
const /** @type {?} */ KEY_MODIFIER_CODE = [17, 16, 18, 91, 93, 224];
export class KeyboardShortcutService {
constructor() {
this.DEFAULT_KEYDOWN_MS = 1000;
this.DEFAULT_BADGE_SPACE = 3;
this.DEFAULT_FADEOUT_MS = 300;
this.nameMapping = {};
this.nameHandler = {};
this.keyHandler = {};
this.keyHintAnchor = {};
this.bindedKeys = [];
// check key up & down
$(document).on('keydown', (keyEvent) => {
if (this.keydownTimer === undefined) {
this.keydownTimer = setTimeout(() => {
for (let /** @type {?} */ keyHint in this.keyHintAnchor) {
let /** @type {?} */ shortcutArray = this.keyHintAnchor[keyHint];
let /** @type {?} */ pass = (keyHint === KEY_MODIFIER[0] && key.control) || (keyHint === KEY_MODIFIER[1] && key.shift)
|| (keyHint === KEY_MODIFIER[2] && key.option) || (keyHint === KEY_MODIFIER[3] && key.alt)
|| (keyHint === KEY_MODIFIER[4] && key.command);
let /** @type {?} */ outOfModify = true;
let /** @type {?} */ passedArray = key.getPressedKeyCodes();
for (let /** @type {?} */ passed of passedArray) {
if (KEY_MODIFIER_CODE.indexOf(passed) < 0) {
outOfModify = false;
}
}
if (pass && outOfModify) {
for (let /** @type {?} */ shortcut of shortcutArray) {
let /** @type {?} */ keysArray = this.getNameKeyControls(shortcut.shortcut);
// shortcut as name
if (keysArray !== null && keysArray !== undefined) {
for (let /** @type {?} */ keyCtrl of keysArray) {
if (this.isModifierKeyEqual(keyCtrl, keyEvent)) {
this.addHintKey(shortcut.hintAnchorElements, keyCtrl, shortcut.hintLabel);
}
/* open here if u want to show all */
// this.addHintKey(shortcut.hintAnchorElements, keyCtrl, shortcut.hintLabel);
}
}
else {
// keyCtrl as shortcut
let /** @type {?} */ keyCtrl = shortcut.shortcut;
this.addHintKey(shortcut.hintAnchorElements, keyCtrl, shortcut.hintLabel);
}
}
}
}
}, this.DEFAULT_KEYDOWN_MS);
}
});
$(document).on('keyup', () => {
if (this.keydownTimer !== null && typeof this.keydownTimer !== 'undefined') {
clearTimeout(this.keydownTimer);
}
// remove all hint key
for (let /** @type {?} */ keyHint in this.keyHintAnchor) {
let /** @type {?} */ shortcutArray = this.keyHintAnchor[keyHint];
for (let /** @type {?} */ shortcut of shortcutArray) {
this.removeHintKey(shortcut.hintAnchorElements);
}
}
this.keydownTimer = undefined;
});
}
/**
* @param {?} modKey
* @return {?}
*/
isModifierKey(modKey) {
if (modKey === null || modKey === undefined) {
return;
}
return KEY_MODIFIER.indexOf(modKey) >= 0;
}
/**
* @param {?} keyCtrl
* @param {?} keyEvent
* @return {?}
*/
isModifierKeyEqual(keyCtrl, keyEvent) {
if (keyEvent === undefined || keyCtrl === undefined) {
return false;
}
let /** @type {?} */ index = keyCtrl.indexOf('+');
if (index >= 0) {
// has +
let /** @type {?} */ split = keyCtrl.split("+");
let /** @type {?} */ singleKey = split[0].toLowerCase();
let /** @type {?} */ currentKey = (keyEvent.key !== undefined) ? keyEvent.key.toLowerCase() : undefined;
if (singleKey === 'ctrl') {
singleKey = "control";
}
else if (singleKey === 'cmd') {
singleKey = "command";
}
// check cmd btn
if (currentKey === 'meta' && (keyEvent.keyCode === 91 || keyEvent.keyCode === 93)) {
// for chrome
currentKey = "command";
}
else if (currentKey === 'meta' && (keyEvent.keyCode === 224)) {
// for firefox
currentKey = "command";
}
if (singleKey === currentKey) {
return true;
}
}
return false;
}
/**
* @param {?} value
* @return {?}
*/
capitalizeFirstLetter(value) {
if (value === null || value === undefined) {
return value;
}
return value.charAt(0).toUpperCase() + value.slice(1);
}
/**
* @param {?} shortcut
* @return {?}
*/
addNameHintAnchorMap(shortcut) {
if (shortcut === null || shortcut === undefined) {
return;
}
let /** @type {?} */ name = shortcut.shortcut;
if (name === null || name === undefined) {
return;
}
name = name.toLowerCase();
let /** @type {?} */ keysArray = this.getNameKeyControls(name);
if (keysArray !== null && keysArray !== undefined) {
for (let /** @type {?} */ keyCtrl of keysArray) {
this.addKeyHintAnchorMap(keyCtrl, shortcut);
}
}
}
/**
* @param {?} shortcut
* @return {?}
*/
removeNameHintAnchorMap(shortcut) {
if (shortcut === null || shortcut === undefined) {
return;
}
let /** @type {?} */ name = shortcut.shortcut;
if (name === null || name === undefined) {
return;
}
name = name.toLowerCase();
let /** @type {?} */ keysArray = this.getNameKeyControls(name);
if (keysArray !== null && keysArray !== undefined) {
for (let /** @type {?} */ keyCtrl of keysArray) {
this.removeKeyHintAnchorMap(keyCtrl, shortcut);
}
}
}
/**
* @param {?} keyCtrl
* @param {?} shortcut
* @return {?}
*/
addKeyHintAnchorMap(keyCtrl, shortcut) {
if (keyCtrl === null || keyCtrl === undefined) {
return;
}
keyCtrl = keyCtrl.toLowerCase();
if (shortcut === null || shortcut === undefined) {
return;
}
let /** @type {?} */ index = keyCtrl.indexOf('+');
if (index >= 0) {
// has +
let /** @type {?} */ split = keyCtrl.split("+");
for (let /** @type {?} */ sKey of split) {
if (this.isModifierKey(sKey)) {
// add hintAnchor
let /** @type {?} */ anchors = this.keyHintAnchor[sKey];
if (anchors === null || anchors === undefined) {
this.keyHintAnchor[sKey] = [];
}
this.keyHintAnchor[sKey].push(shortcut);
}
}
}
}
/**
* @param {?} keyCtrl
* @param {?} shortcut
* @return {?}
*/
removeKeyHintAnchorMap(keyCtrl, shortcut) {
if (keyCtrl === null || keyCtrl === undefined) {
return;
}
keyCtrl = keyCtrl.toLowerCase();
let /** @type {?} */ index = keyCtrl.indexOf('+');
if (index >= 0) {
// has +
let /** @type {?} */ split = keyCtrl.split("+");
let /** @type {?} */ handler = shortcut.handler;
for (let /** @type {?} */ sKey of split) {
if (this.isModifierKey(sKey)) {
// add hintAnchor
let /** @type {?} */ anchors = this.keyHintAnchor[sKey];
if (anchors === null || anchors === undefined) {
continue;
}
let /** @type {?} */ toDeleteObjs = [];
for (let /** @type {?} */ check of this.keyHintAnchor[sKey]) {
if ((check.shortcut === shortcut.shortcut) && (check.handler.toString() === handler.toString())) {
toDeleteObjs.push(check);
}
}
// remove
for (let /** @type {?} */ delObj of toDeleteObjs) {
let /** @type {?} */ index = this.keyHintAnchor[sKey].indexOf(delObj);
this.keyHintAnchor[sKey].splice(index, 1);
}
if (this.keyHintAnchor[sKey].length <= 0) {
delete this.keyHintAnchor[sKey];
}
}
}
}
}
/**
* @param {?} name
* @return {?}
*/
bindName(name) {
if (name === null || name === undefined) {
return;
}
name = name.toLowerCase();
let /** @type {?} */ keysArray = this.getNameKeyControls(name);
if (keysArray === null || keysArray === undefined || keysArray.length <= 0) {
return;
}
for (let /** @type {?} */ keyCtrl of keysArray) {
// no bind if key already bind overide nameHandler with key
if (this.keyHandler[keyCtrl] !== undefined) {
continue;
}
if (this.nameHandler[name] !== undefined) {
this.bind(keyCtrl, this.nameHandler[name]);
}
}
}
/**
* @param {?} keyCtrl
* @return {?}
*/
bindKey(keyCtrl) {
if (this.keyHandler[keyCtrl] !== undefined) {
this.bind(keyCtrl, this.keyHandler[keyCtrl]);
}
}
/**
* @param {?} keyCtrl
* @param {?} handlers
* @return {?}
*/
bind(keyCtrl, handlers) {
if (keyCtrl === null || keyCtrl === undefined) {
return;
}
keyCtrl = keyCtrl.toLowerCase();
key(keyCtrl, () => {
if (handlers !== null && handlers !== undefined) {
for (let /** @type {?} */ func of handlers) {
if (typeof func === 'function') {
func.call(this, this); // inject keyboard service
}
}
}
});
}
/**
* @param {?} name
* @return {?}
*/
unbindName(name) {
if (name === null || name === undefined) {
return;
}
let /** @type {?} */ keysArray = this.getNameKeyControls(name);
if (keysArray !== null && keysArray !== undefined) {
for (let /** @type {?} */ keyCtrl of keysArray) {
this.unbindKey(keyCtrl);
}
}
}
/**
* @param {?} keyCtrl
* @return {?}
*/
unbindKey(keyCtrl) {
if (keyCtrl === null || keyCtrl === undefined) {
return;
}
keyCtrl = keyCtrl.toLowerCase();
key.unbind(keyCtrl);
}
/**
* @param {?} hintAnchorElements
* @param {?} name
* @param {?} hintLabel
* @return {?}
*/
addHintName(hintAnchorElements, name, hintLabel) {
if (hintAnchorElements === null || hintAnchorElements === undefined) {
return;
}
if (name === null || name === undefined) {
return;
}
let /** @type {?} */ keysArray = this.getNameKeyControls(name);
if (keysArray !== null && keysArray !== undefined) {
for (let /** @type {?} */ keyCtrl of keysArray) {
this.addHintKey(hintAnchorElements, keyCtrl, hintLabel);
}
}
}
/**
* @param {?} hintAnchorElements
* @param {?} keyCtrl
* @param {?} hintLabel
* @return {?}
*/
addHintKey(hintAnchorElements, keyCtrl, hintLabel) {
if (hintAnchorElements === null || hintAnchorElements === undefined) {
return;
}
if (keyCtrl === null || keyCtrl === undefined) {
return;
}
keyCtrl = keyCtrl.toLowerCase();
let /** @type {?} */ elements = [];
if (Array.isArray(hintAnchorElements)) {
elements = hintAnchorElements;
}
else {
elements.push(hintAnchorElements);
}
let /** @type {?} */ title = hintLabel;
// default if no hintLabel
if (title === null || title === undefined) {
title = this.capitalizeFirstLetter(keyCtrl);
let /** @type {?} */ name = this.getKeyMappingName(keyCtrl);
if (name !== null && name !== undefined) {
title = this.capitalizeFirstLetter(name) + "</br>(" + title + ")";
}
}
for (let /** @type {?} */ anyElement of elements) {
let /** @type {?} */ badgeHTML = '<span class="badge scService">' + title + '</span>';
if (typeof anyElement === 'string') {
// jqSelector: String
let /** @type {?} */ width = $(anyElement).width() - this.DEFAULT_BADGE_SPACE;
let /** @type {?} */ badgeElement = $(badgeHTML);
badgeElement.css({ "max-width": width });
$(anyElement).append(badgeElement);
}
else if (anyElement !== undefined && typeof anyElement.innerHTML === 'function') {
// DOM/Native Element
let /** @type {?} */ width = $(anyElement).width() - this.DEFAULT_BADGE_SPACE;
let /** @type {?} */ badgeElement = $(badgeHTML);
badgeElement.css({ "max-width": width });
$(anyElement).append(badgeElement);
}
else if (anyElement !== undefined) {
// NgComp
if (typeof anyElement["getElementRef"] === 'function') {
let /** @type {?} */ eleRef = anyElement.getElementRef();
if (eleRef !== null && eleRef !== undefined) {
let /** @type {?} */ width = $(eleRef.nativeElement).width() - this.DEFAULT_BADGE_SPACE;
let /** @type {?} */ badgeElement = $(badgeHTML);
badgeElement.css({ "max-width": width });
$(eleRef.nativeElement).append(badgeElement);
}
}
}
}
}
/**
* @param {?} hintAnchorElements
* @return {?}
*/
removeHintKey(hintAnchorElements) {
if (hintAnchorElements === null || hintAnchorElements === undefined) {
return;
}
let /** @type {?} */ elements = [];
if (Array.isArray(hintAnchorElements)) {
elements = hintAnchorElements;
}
else {
elements.push(hintAnchorElements);
}
for (let /** @type {?} */ anyElement of elements) {
if (typeof anyElement === 'string') {
// jqSelector: String
$(anyElement).find(".scService").addClass("fadeout");
setTimeout(() => {
$(anyElement).find(".scService.fadeout").remove();
}, this.DEFAULT_FADEOUT_MS);
}
else if (anyElement !== undefined && typeof anyElement.innerHTML === 'function') {
// DOM/Native Element
$(anyElement).find(".scService").addClass("fadeout");
setTimeout(() => {
$(anyElement).find(".scService.fadeout").remove();
}, this.DEFAULT_FADEOUT_MS);
}
else if (anyElement !== undefined) {
// NgComp
if (typeof anyElement["getElementRef"] === 'function') {
let /** @type {?} */ eleRef = anyElement.getElementRef();
if (eleRef !== null && eleRef !== undefined) {
$(eleRef.nativeElement).find(".scService").addClass("fadeout");
setTimeout(() => {
$(eleRef.nativeElement).find(".scService.fadeout").remove();
}, this.DEFAULT_FADEOUT_MS);
}
}
}
}
}
/**
* @param {?} key
* @param {?} handler
* @return {?}
*/
_addKeyHandler(key, handler) {
if (key === null || key === undefined) {
return;
}
let /** @type {?} */ handlers = this.keyHandler[key];
if (handlers === null || handlers === undefined) {
handlers = [];
this.keyHandler[key] = handlers;
}
this.keyHandler[key].push(handler);
if (this.bindedKeys.indexOf(key) >= 0) {
// unbind then bind
this.unbindKey(key);
this.bindKey(key);
}
else {
// bind and add bindedKeys
this.bindKey(key);
this.bindedKeys.push(key);
}
}
/**
* @param {?} key
* @return {?}
*/
getKeyMappingName(key) {
for (let /** @type {?} */ name in this.nameMapping) {
let /** @type {?} */ keyArray = this.nameMapping[name];
if (keyArray.indexOf(key) >= 0) {
return name;
}
}
return null;
}
/**
* @param {?} name
* @param {?} key
* @return {?}
*/
setNameMapping(name, key) {
let /** @type {?} */ keysArray = this.nameMapping[name];
if (keysArray === null || keysArray === undefined) {
this.nameMapping[name] = [];
this.nameMapping[name].push(key);
}
else {
// if no key just push it
if (this.nameMapping[name].indexOf(key) < 0) {
this.nameMapping[name].push(key);
}
}
}
/**
* @param {?} name
* @return {?}
*/
getNameKeyControls(name) {
return this.nameMapping[name];
}
/**
* @param {?} mappings
* @return {?}
*/
mergeNameMappings(mappings) {
if (mappings === null || mappings === undefined) {
return;
}
for (let /** @type {?} */ name in mappings) {
let /** @type {?} */ val = mappings[name];
if (typeof val === 'string') {
this.setNameMapping(name, val);
}
else if (Array.isArray(val)) {
for (let /** @type {?} */ innerVal of val) {
this.setNameMapping(name, innerVal);
}
}
}
}
/**
* @return {?}
*/
getNameMapping() {
return this.nameMapping;
}
/**
* @return {?}
*/
getNames() {
let /** @type {?} */ result = [];
for (let /** @type {?} */ key in this.nameMapping) {
result.push(key);
}
return result;
}
/**
* @return {?}
*/
clearNameMappings() {
this.nameMapping = {};
}
/**
* @param {?} shortcut
* @return {?}
*/
addNameHandler(shortcut) {
if (shortcut === null || shortcut === undefined) {
return;
}
let /** @type {?} */ name = shortcut.shortcut;
if (name === null || name === undefined) {
return;
}
name = name.toLowerCase();
if (name === null || name === undefined) {
return;
}
let /** @type {?} */ handlers = this.nameHandler[name];
if (handlers === null || handlers === undefined) {
handlers = [];
this.nameHandler[name] = handlers;
}
this.nameHandler[name].push(shortcut.handler);
// add hint
this.addNameHintAnchorMap(shortcut);
this.bindName(name);
}
/**
* @param {?} shortcut
* @return {?}
*/
removeNameHandler(shortcut) {
if (shortcut === null || shortcut === undefined) {
return;
}
let /** @type {?} */ name = shortcut.shortcut;
let /** @type {?} */ handler = shortcut.handler;
if (name === null || name === undefined) {
return;
}
name = name.toLowerCase();
let /** @type {?} */ handlers = this.nameHandler[name];
if (handlers === null || handlers === undefined) {
return;
}
let /** @type {?} */ index = -1;
for (let /** @type {?} */ h of handlers) {
index += 1;
if (h.toString() === handler.toString()) {
break;
}
}
if (index >= 0) {
handlers.splice(index, 1);
}
// remove name hint
this.removeNameHintAnchorMap(shortcut);
this.unbindName(name);
if (handlers.length > 0) {
this.bindName(name);
}
}
/**
* @param {?} name
* @return {?}
*/
removeAllNameHandler(name) {
if (name === null || name === undefined) {
return;
}
delete this.nameHandler[name];
this.unbindName(name);
// remove binded Key
let /** @type {?} */ keysArray = this.getNameKeyControls(name);
if (keysArray !== null && keysArray !== undefined) {
for (let /** @type {?} */ keyCtrl of keysArray) {
if (keyCtrl !== null && keyCtrl !== undefined) {
if (this.bindedKeys.indexOf(keyCtrl) >= 0) {
this.bindedKeys.splice(this.bindedKeys.indexOf(keyCtrl), 1);
}
}
}
}
}
/**
* @param {?} name
* @return {?}
*/
getNameHandlers(name) {
if (name === null || name === undefined) {
return null;
}
return this.nameHandler[name];
}
/**
* @param {?} shortcut
* @return {?}
*/
addKeyHandler(shortcut) {
let /** @type {?} */ key = shortcut.shortcut;
let /** @type {?} */ handler = shortcut.handler;
let /** @type {?} */ hintAnchorElements = shortcut.hintAnchorElements;
this._addKeyHandler(key, handler);
// add hint
this.addKeyHintAnchorMap(key, shortcut);
}
/**
* @param {?} shortcut
* @return {?}
*/
removeKeyHandler(shortcut) {
if (shortcut === null || shortcut === undefined) {
return;
}
let /** @type {?} */ key = shortcut.shortcut;
let /** @type {?} */ handler = shortcut.handler;
let /** @type {?} */ hintAnchorElements = shortcut.hintAnchorElements;
if (key === null || key === undefined) {
return;
}
let /** @type {?} */ handlers = this.keyHandler[key];
if (handlers === null || handlers === undefined) {
return;
}
let /** @type {?} */ index = -1;
for (let /** @type {?} */ h of handlers) {
index += 1;
if (h.toString() === handler.toString()) {
break;
}
}
if (index >= 0) {
handlers.splice(index, 1);
}
// remove hint
this.removeKeyHintAnchorMap(key, shortcut);
this.unbindKey(key);
if (handlers.length > 0) {
this.bindKey(key);
}
}
/**
* @param {?} key
* @return {?}
*/
removeAllKeyHandler(key) {
if (key === null || key === undefined) {
return;
}
delete this.keyHandler[key];
delete this.keyHintAnchor[key];
this.unbindKey(key);
// remove binded Key
if (this.bindedKeys.indexOf(key) >= 0) {
this.bindedKeys.splice(this.bindedKeys.indexOf(key), 1);
}
}
/**
* @param {?} key
* @return {?}
*/
getKeyHandlers(key) {
if (key === null || key === undefined) {
return null;
}
return this.keyHandler[key];
}
}
KeyboardShortcutService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
KeyboardShortcutService.ctorParameters = () => [];
function KeyboardShortcutService_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
KeyboardShortcutService.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
KeyboardShortcutService.ctorParameters;
/** @type {?} */
KeyboardShortcutService.prototype.DEFAULT_KEYDOWN_MS;
/** @type {?} */
KeyboardShortcutService.prototype.DEFAULT_BADGE_SPACE;
/** @type {?} */
KeyboardShortcutService.prototype.DEFAULT_FADEOUT_MS;
/** @type {?} */
KeyboardShortcutService.prototype.nameMapping;
/** @type {?} */
KeyboardShortcutService.prototype.nameHandler;
/** @type {?} */
KeyboardShortcutService.prototype.keyHandler;
/** @type {?} */
KeyboardShortcutService.prototype.keyHintAnchor;
/** @type {?} */
KeyboardShortcutService.prototype.bindedKeys;
/** @type {?} */
KeyboardShortcutService.prototype.keydownTimer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiS2V5Ym9hcmRTaG9ydGN1dFNlcnZpY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2UvS2V5Ym9hcmRTaG9ydGN1dFNlcnZpY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFVLFVBQVUsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUs3RCx1QkFBTSxZQUFZLEdBQWEsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3hGLHVCQUFNLGlCQUFpQixHQUFhLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUc5RCxNQUFNO0lBWUo7a0NBVnFDLElBQUk7bUNBQ0gsQ0FBQztrQ0FDRixHQUFHO1FBU3RDLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDOztRQUdyQixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLFFBQWEsRUFBRSxFQUFFO1lBQzFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNsQyxHQUFHLENBQUMsQ0FBQyxxQkFBSSxPQUFPLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLHFCQUFJLGFBQWEs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