- Added comprehensive AI Assistant system (aiassist/ directory): * Vector search and embedding capabilities * Typebot proxy integration * Elastic search functionality * Message classification and chat history * MCP proxy for external integrations - Implemented Court Status API (GetCourtStatus.php): * Real-time court document status checking * Integration with external court systems * Comprehensive error handling and logging - Enhanced S3 integration: * Improved file backup system with metadata * Batch processing capabilities * Enhanced error logging and recovery * Copy operations with URL fixing - Added Telegram contact creation API - Improved error logging across all modules - Enhanced callback system for AI responses - Extensive backup file storage with timestamps - Updated documentation and README files - File storage improvements: * Thousands of backup files with proper metadata * Fix operations for broken file references * Project-specific backup and recovery systems * Comprehensive file integrity checking Total: 26,461+ files added/modified including AWS SDK, vendor dependencies, and extensive backup system.
2053 lines
101 KiB
Plaintext
2053 lines
101 KiB
Plaintext
(function ($) {
|
|
"use strict";
|
|
var ScopeName = 'Workflow2';
|
|
var Version = '2.4.1';
|
|
/**
|
|
* FlexUtils V2.4.1
|
|
* 2.4.1 - 23.05.2019
|
|
* - Fix bug related to modals, when first one is closed
|
|
* 2.4.0 - 25.07.2018
|
|
* - add createFileDrop function
|
|
* - add FlexForm component
|
|
* 2.3.1 - 18.07.2018
|
|
* - Fixed setFieldValue for picklists in VT7
|
|
* 2.3.0 - 12.07.2018
|
|
* - JSHint recommendations applied
|
|
* 2.2.1 - 21.05.2018
|
|
* - add onQuickCreate from VT6
|
|
* 2.2.0 - 26.04.2018
|
|
* - add FlexTranslate component
|
|
* 2.1.3 - 02.03.2018
|
|
* - improve compatibility with old RedooUtils
|
|
* 2.1.2 - 23.02.2018
|
|
* - add close callback to showModalBox
|
|
* 2.1.1 - 09.02.2018
|
|
* - add initial local cache handler
|
|
* 2.1.0 - 20.12.2017
|
|
* - Rename to FlexUtils
|
|
* - Add function showRecordInOverlay
|
|
* 2.0.13 - 18.11.2017
|
|
* - Implement Exception Output in postAction / postView
|
|
* 2.0.12 - 16.11.2017
|
|
* - add showModalBox replacement if already box is shown
|
|
* 2.0.11 - 08.11.2017
|
|
* - add convertComponents parameter to refreshContent to convert select2
|
|
* 2.0.10 - 04.11.2017
|
|
* - add showNotification
|
|
* - add Init console log
|
|
* 2.0.09 - 31.10.2017
|
|
* - add getCurrentDateFormat function
|
|
* 2.0.08 - 22.09.2017
|
|
* - add getContentMaxWidth / getContentMaxHeight functions
|
|
* 2.0.07 - 13.08.2017
|
|
* - add getMainRecordId function
|
|
* - add getCurrentCustomViewId
|
|
* - add onListChange
|
|
* 2.0.06 - 13.06.2017
|
|
* - getListFields fixed for VT6
|
|
* 2.0.05 - 12.06.2017
|
|
* - first version build with TypeScript
|
|
* - fix getFieldElement on SummaryView
|
|
* - Fix issues reported from TypeScript
|
|
* 2.0.04 - 11.16.2017
|
|
* - improve showModalBox Function
|
|
* - add hideModalBox Function
|
|
* - add FlexAjax.postSettingsView as wrapper for default function
|
|
* - add FlexAjax.postSettingsAction as wrapper for default function
|
|
* - add FlexUtils.refreshContent
|
|
* 2.0.03 - add getCurrentLayout Function
|
|
* - add layoutDependValue Function
|
|
* - add BlockUI
|
|
* 2.0.02 - add getQueryParams Function
|
|
* - Extend getMainModule by Query Params
|
|
* - Introduce RedooUtils Action on Server
|
|
* - add setFieldValue Function
|
|
* 2.0.01 - VT7 Compatibility
|
|
* - add FlexUtils.onFieldChange method
|
|
* - add FlexUtils.onRelatedListChange method
|
|
* - add FlexUtils.isVT7 method
|
|
* - add FlexUtils.Signal Implementation
|
|
* - add global RedooEvents
|
|
* 1.0.11 - Make postAction / postView settings flag optional
|
|
* Add wrong Ajax Response error output
|
|
* 1.0.10 - Add getRecordLabels function
|
|
* 1.0.9 - Add fillFieldSelect, loadStyles functions
|
|
* 1.0.8 - Add returnInput Parameter to getFieldElement function
|
|
* 1.0.7 - Add FlexUtils.loadScript
|
|
*//*globals confirm:false */
|
|
/**
|
|
* You must generate a FlexAjax Environment by useing FlexAjax(ScopeName)
|
|
* @example
|
|
* FlexAjax("ScopeName")
|
|
* @global
|
|
* @toc
|
|
* @namespace
|
|
**/
|
|
var FlexAjax = {
|
|
/**
|
|
* This function sends a POST request to a given Action.<br/>
|
|
* Module is get from ScopeName
|
|
*
|
|
* @example
|
|
* FlexAjax("ScopeName").postAction(
|
|
* "ActionName",
|
|
* {
|
|
* "param1": value1,
|
|
* "param2": value2
|
|
* },
|
|
* true,
|
|
* "json"
|
|
* ).then(function(responseJson) {
|
|
* // ... do something with JSON response
|
|
* });
|
|
* @param {string} actionName - Action to call
|
|
* @param {array} [params] - parameters to send
|
|
* @param {boolean|string} [settings] - (boolean) Is action within CRM Settings?<br/> (string) DataType
|
|
* @param {string} [dataType] - Datatype of response
|
|
* @returns {string|json}
|
|
*/
|
|
postAction: function (actionName, params, settings, dataType) {
|
|
if (typeof params == 'undefined') {
|
|
params = {};
|
|
}
|
|
params.module = ScopeName;
|
|
params.action = actionName;
|
|
if (typeof dataType == 'undefined' && typeof settings == 'string') {
|
|
dataType = settings;
|
|
settings = false;
|
|
}
|
|
if (typeof settings != 'undefined' && settings == true) {
|
|
params.parent = 'Settings';
|
|
}
|
|
return FlexAjax.post('index.php', params, dataType);
|
|
},
|
|
/**
|
|
* This function send a POST request to a given Action.
|
|
* Module is get from ScopeName
|
|
*
|
|
* @example
|
|
* FlexAjax("ScopeName").postAction(
|
|
* "ActionName",
|
|
* {
|
|
* "param1": value1,
|
|
* "param2": value2
|
|
* },
|
|
* true,
|
|
* "json"
|
|
* ).then(function(responseJson) {
|
|
* // ... do something with JSON response
|
|
* });
|
|
* @param viewName
|
|
* @param params
|
|
* @param dataType
|
|
* @returns {*}
|
|
*/
|
|
postSettingsView: function (viewName, params, dataType) {
|
|
return FlexAjax.postView(viewName, params, true, dataType);
|
|
},
|
|
/**
|
|
*
|
|
* @param actionName
|
|
* @param params
|
|
* @param dataType
|
|
* @returns {*}
|
|
*/
|
|
postSettingsAction: function (actionName, params, dataType) {
|
|
return FlexAjax.postAction(actionName, params, true, dataType);
|
|
},
|
|
/**
|
|
*
|
|
* @param viewName
|
|
* @param params
|
|
* @param settings
|
|
* @param dataType
|
|
* @returns {*}
|
|
*/
|
|
postView: function (viewName, params, settings, dataType) {
|
|
if (typeof params == 'undefined') {
|
|
params = {};
|
|
}
|
|
params.module = ScopeName;
|
|
params.view = viewName;
|
|
if (typeof dataType == 'undefined' && typeof settings == 'string') {
|
|
dataType = settings;
|
|
settings = false;
|
|
}
|
|
if (typeof settings != 'undefined' && settings == true) {
|
|
params.parent = 'Settings';
|
|
}
|
|
return FlexAjax.post('index.php', params, dataType);
|
|
},
|
|
/**
|
|
*
|
|
* @param url URL to call
|
|
* @param params Object with POST parameters
|
|
* @param dataType Single value of datatype if not set in params
|
|
* @returns {*}
|
|
*/
|
|
post: function (url, params, dataType) {
|
|
var aDeferred = jQuery.Deferred();
|
|
if (typeof url == 'object') {
|
|
params = url;
|
|
url = 'index.php';
|
|
}
|
|
if (typeof params == 'undefined') {
|
|
params = {};
|
|
}
|
|
if (typeof dataType == 'undefined' && typeof params.dataType != 'undefined') {
|
|
dataType = params.dataType;
|
|
}
|
|
var options = {
|
|
url: url,
|
|
data: params
|
|
};
|
|
if (typeof dataType != 'undefined') {
|
|
options.dataType = dataType;
|
|
}
|
|
//options.dataType = undefined;
|
|
options.dataType = 'text';
|
|
options.type = 'POST';
|
|
jQuery.ajax(options)
|
|
.always(function (data) {
|
|
if (typeof dataType != 'undefined' && dataType == 'json') {
|
|
try {
|
|
data = jQuery.parseJSON(data);
|
|
}
|
|
catch (e) {
|
|
FlexUtils.unblockUI();
|
|
console.error('FlexAjax Error - Should: JSON Response:');
|
|
console.log('Request: ', options);
|
|
console.log(data);
|
|
var height = 10;
|
|
jQuery('.RedooAjaxError').each(function (index, ele) {
|
|
height += jQuery(ele).height() + 30;
|
|
});
|
|
var id = 'error_' + (Math.floor(Math.random() * 1000000));
|
|
var content = data.substr(0, 500).replace(/</g, '<').replace(/\\(.?)/g, function (s, n1) {
|
|
switch (n1) {
|
|
case '\\':
|
|
return '\\';
|
|
case '0':
|
|
return '\u0000';
|
|
case '':
|
|
return '';
|
|
default:
|
|
return n1;
|
|
}
|
|
});
|
|
if (data.length > 500) {
|
|
content += ' .....<em>shortened</em>....... ' + data.substr(-500).replace(/</g, '<').replace(/\\(.?)/g, function (s, n1) {
|
|
switch (n1) {
|
|
case '\\':
|
|
return '\\';
|
|
case '0':
|
|
return '\u0000';
|
|
case '':
|
|
return '';
|
|
default:
|
|
return n1;
|
|
}
|
|
});
|
|
}
|
|
var html = '<div class="RedooAjaxError" style="word-wrap:break-word;position:fixed;bottom:' + height + 'px;box-sizing:border-box;left:10px;padding:10px;width:25%;background-color:#ffffff;z-index:90000;border:2px solid #C9331E;background-color:#D29D96;" id="' + id + '"><i class="icon-ban-circle" style="margin-top:2px;margin-right:5px;"></i><span style="color:#C9331E;font-weight:bold;">ERROR:</span> ' + e + '<br/><span style="color:#C9331E;font-weight:bold;">Response:</span>' + content + '</div>';
|
|
jQuery('body').append(html);
|
|
jQuery('#' + id).on('click', function () {
|
|
jQuery(this).fadeOut('fast', function () {
|
|
jQuery(this).remove();
|
|
});
|
|
});
|
|
/*
|
|
window.setTimeout(function() {
|
|
jQuery('#' + id).hide(function() {
|
|
jQuery(this).remove();
|
|
})
|
|
});
|
|
*/
|
|
//app.showModalWindow(response);
|
|
return;
|
|
}
|
|
}
|
|
if (typeof data.success != 'undefined') {
|
|
if (data.success == false && (data.error.code.indexOf('request') != -1)) {
|
|
if (confirm('Request Error. Reload of Page is required.')) {
|
|
window.location.reload();
|
|
}
|
|
|
|
FlexUtils.showNotification(data.error.message, false);
|
|
return;
|
|
}
|
|
}
|
|
aDeferred.resolve(data);
|
|
//callback(data)
|
|
});
|
|
return aDeferred.promise();
|
|
},
|
|
/**
|
|
*
|
|
* @param url
|
|
* @param params
|
|
* @param dataType
|
|
*/
|
|
get: function (url, params, dataType) {
|
|
console.error('Vtiger do not support GET Requests');
|
|
return;
|
|
},
|
|
/**
|
|
* Drop In Replacement for AppConnector.request
|
|
*
|
|
* @param params object
|
|
* @returns {*}
|
|
*/
|
|
request: function (params) {
|
|
return FlexAjax.post('index.php', params);
|
|
}
|
|
};/**
|
|
* You must generate a FlexCache Environment by useing FlexCache(ScopeName)
|
|
* @example
|
|
* FlexCache("ScopeName")
|
|
* @global
|
|
* @namespace
|
|
**/
|
|
var FlexCache = {
|
|
get: function (key, defaultValue) {
|
|
if (typeof _FlexCache[key] != 'undefined') {
|
|
return _FlexCache[key];
|
|
}
|
|
return defaultValue;
|
|
},
|
|
set: function (key, value) {
|
|
_FlexCache[key] = value;
|
|
}
|
|
};
|
|
/**
|
|
* You must generate a FlexForm Environment by useing FlexForm(ScopeName)
|
|
* @example
|
|
* FlexForm("ScopeName")
|
|
* @global
|
|
* @namespace
|
|
**/
|
|
var FlexForm = {
|
|
/**
|
|
*
|
|
* @param params
|
|
* @returns {FlexFormObj}
|
|
*/
|
|
getInstance:function(params) {
|
|
var FlexFormObj = function(parameters) {
|
|
this.parameters = parameters;
|
|
this.fields = [];
|
|
this.events = $({});
|
|
|
|
this.on = function(event, callbackFunction) {
|
|
this.events.on(event, callbackFunction);
|
|
};
|
|
|
|
this.addField = function(label, name, type, value, options) {
|
|
var field = new FlexFormField(name, type, label);
|
|
|
|
if(typeof options !== 'undefined') {
|
|
field.setOptions(options);
|
|
}
|
|
if(typeof value !== 'undefined') {
|
|
field.setValue(value);
|
|
}
|
|
|
|
var row = [];
|
|
row.push(field);
|
|
this.fields.push(row);
|
|
};
|
|
|
|
this.initCSS = function() {
|
|
var html = '<style type="text/css">' +
|
|
'.FlexFormContainer .materialstyle{border:1px solid transparent}' +
|
|
'.FlexFormContainer .materialstyle.group{position:relative;margin-bottom:15px;margin-top:10px}' +
|
|
'.FlexFormContainer .materialstyle.prefix-icon .fa{position:absolute;top:8px;font-size:14px}' +
|
|
'.FlexFormContainer .materialstyle.prefix-icon label{left:19px}' +
|
|
'.FlexFormContainer .materialstyle.prefix-icon input{padding-left:20px}' +
|
|
'.FlexFormContainer .materialstyle input{font-size:14px;padding:10px 10px 10px 0;display:block;width:100%;border:none;height:30px;border-bottom:1px solid #757575;border-top:none!important;border-left:none!important;border-right:none!important;box-shadow:none!important}' +
|
|
'.FlexFormContainer .materialstyle input[type=file]{border-bottom:none!important}' +
|
|
'.FlexFormContainer .materialstyle select{font-size:14px;padding:5px 10px 5px 0;display:block;width:100%;border:none;height:38px;border-bottom:1px solid #757575}' +
|
|
'.FlexFormContainer .materialstyle textarea{font-size:14px;padding:3px 5px;display:block;width:100%;height:150px;border:1px solid #757575}' +
|
|
'.FlexFormContainer .materialstyle .select2-container{width:100%}' +
|
|
'.FlexFormContainer .materialstyle .select2-container .select2-choice,.materialstyle .select2-container .select2-choices,.materialstyle .select2-container .select2-choices .select2-search-field input{-webkit-box-shadow:none;box-shadow:none}' +
|
|
'.FlexFormContainer .materialstyle input:focus,.materialstyle select:focus,.materialstyle textarea:focus{outline:0}' +
|
|
'.FlexFormContainer .materialstyle label{color:#bbb;font-size:16px;font-weight:400;position:absolute;pointer-events:none;left:5px;top:5px;transition:.2s ease all;-moz-transition:.2s ease all;-webkit-transition:.2s ease all}' +
|
|
'.FlexFormContainer .materialstyle input.fixedUsed~label,.materialstyle input.used~label,.materialstyle input:focus~label,.materialstyle select.fixedUsed~label,.materialstyle select.used~label,.materialstyle select:focus~label,.materialstyle textarea.fixedUsed~label,.materialstyle textarea.used~label,.materialstyle textarea:focus~label,.materialstyle.fixedUsed>label{top:-18px;left:0;font-size:12px;color:#5264AE}' +
|
|
'.FlexFormContainer .materialstyle .bar{position:relative;display:block;width:100%}' +
|
|
'.FlexFormContainer .materialstyle .bar:after,.materialstyle .bar:before{content:\'\';height:2px;width:0;bottom:1px;position:absolute;background:#5264AE;transition:.2s ease all;-moz-transition:.2s ease all;-webkit-transition:.2s ease all}' +
|
|
'.FlexFormContainer .materialstyle .bar:before{left:50%}' +
|
|
'.FlexFormContainer .materialstyle .bar:after{right:50%}' +
|
|
'.FlexFormContainer .ReqValRow .materialstyle { padding:5px 0; }' +
|
|
'.FlexFormContainer .materialstyle input:focus~.bar:after,.materialstyle input:focus~.bar:before{width:50%}' +
|
|
'</style>';
|
|
var checksumFkt = function(s) {
|
|
var hash = 0,
|
|
i, char;
|
|
if (s.length == 0) {
|
|
return hash;
|
|
}
|
|
var l = s.length;
|
|
|
|
for (i = 0; i < l; i++) {
|
|
char = s.charCodeAt(i);
|
|
hash = ((hash << 5) - hash) + char;
|
|
hash |= 0; // Convert to 32bit integer
|
|
}
|
|
return hash;
|
|
};
|
|
var checksum = checksumFkt(html);
|
|
var className = 'flexformmodalcss' + checksum;
|
|
if($('style.' + className).length === 0) {
|
|
var htmlele = $(html).addClass(className);
|
|
$('head').append(htmlele);
|
|
}
|
|
};
|
|
|
|
this.renderModal = function(widthPx, headline, successText, cancelText) {
|
|
this.initCSS();
|
|
|
|
if(typeof widthPx === 'undefined') {
|
|
widthPx = 600;
|
|
}
|
|
if(typeof headline === 'undefined') {
|
|
headline = '';
|
|
}
|
|
if(typeof successText === 'undefined') {
|
|
successText = 'Save';
|
|
}
|
|
if(typeof cancelText === 'undefined') {
|
|
cancelText = 'Cancel';
|
|
}
|
|
|
|
var html = '';
|
|
html += '<div class="modal-dialog modelContainer" style="width:' + widthPx + 'px;">';
|
|
html += '<div class="modal-content" style="width:100%;">';
|
|
|
|
// Header
|
|
html += '<div class="modal-header"><div class="clearfix"><div class="pull-right"><button type="button" class="close" aria-label="Close" data-dismiss="modal"><span aria-hidden="true" class="fa fa-close"></span></button></div><h4 class="pull-left">' + headline + '</h4></div></div>';
|
|
|
|
html += '<div class="modal-body FlexFormContainer">';
|
|
|
|
jQuery.each(this.fields, function(index, fields) {
|
|
html += '<div class="ReqValRow">';
|
|
jQuery.each(fields, function(fieldIndex, field) {
|
|
html += field.render();
|
|
});
|
|
html += '</div>';
|
|
});
|
|
|
|
html += '</div>';
|
|
// Footer
|
|
html += '<div class="modal-footer "><center><button class="btn btn-success" type="submit" name="saveButton"><strong>' + successText + '</strong></button><a href="#" class="cancelLink" type="reset" data-dismiss="modal">' + cancelText + '</a></center></div>';
|
|
|
|
html += '</div>';
|
|
html += '</div>';
|
|
|
|
FlexUtils.showModalBox(html).then($.proxy(function(window, data) {
|
|
|
|
jQuery.each(this.fields, function(index, fields) {
|
|
jQuery.each(fields, function(fieldIndex, field) {
|
|
field.init();
|
|
});
|
|
});
|
|
|
|
$('.btn-success', window).on('click', $.proxy(function() {
|
|
|
|
var data = {};
|
|
|
|
jQuery.each(this.fields, function(index, fields) {
|
|
jQuery.each(fields, function(fieldIndex, field) {
|
|
data[field.getFieldName()] = field.getValue();
|
|
});
|
|
});
|
|
this.events.trigger('save', data);
|
|
}, this));
|
|
|
|
jQuery('.materialstyle input, .materialstyle select, .materialstyle textarea', window).on('blur', function() {
|
|
// check if the input has any value (if we've typed into it)
|
|
|
|
if (jQuery(this).val()) {
|
|
jQuery(this).addClass('used');
|
|
} else {
|
|
jQuery(this).removeClass('used');
|
|
}
|
|
|
|
}).trigger('blur');
|
|
|
|
jQuery('.materialstyle .select2-container, .materialstyle input[type="file"]', window).each(function (index, ele) {
|
|
// console.log(ele, jQuery(ele).closest('.materialstyle'));
|
|
jQuery(ele).closest('.materialstyle').addClass('fixedUsed');
|
|
});
|
|
|
|
}, this));
|
|
};
|
|
};
|
|
|
|
var FlexFormField = function(field_name, field_type, field_label) {
|
|
var defaultOptions = {
|
|
'selfdecorate': false
|
|
};
|
|
|
|
this.field_options = defaultOptions;
|
|
this.field_value = null;
|
|
this.field_type = field_type;
|
|
this.field_name = field_name;
|
|
this.field_label = field_label;
|
|
this.rendered = false;
|
|
|
|
this.containerId = 'cfid' + Math.round(Math.random(999999) * 100000) + Math.round(Math.random(999999) * 100000);
|
|
this.fieldclass = 'cf' + Math.round(Math.random() * 100000) + Math.round(Math.random() * 100000);
|
|
|
|
this.typedata = FlexForm.getType(field_type);
|
|
|
|
|
|
this.setOptions = function(options) {
|
|
this.field_options = $.extend(true, defaultOptions, options);
|
|
};
|
|
this.getOptions = function() {
|
|
return this.field_options;
|
|
};
|
|
|
|
this.setValue = function(value) {
|
|
this.field_value = value;
|
|
|
|
if(this.rendered === true) {
|
|
this.typedata.setter(this.field_value, this);
|
|
}
|
|
};
|
|
|
|
this.init = function() {
|
|
if(typeof this.typedata.init === 'function') {
|
|
this.typedata.init(this);
|
|
}
|
|
};
|
|
|
|
this.getValue = function() {
|
|
return this.typedata.getter(this);
|
|
};
|
|
|
|
this.getFieldName = function() {
|
|
return this.field_name;
|
|
};
|
|
|
|
this.render = function() {
|
|
var html = '<div class="group materialstyle" id="' + this.containerId + '">';
|
|
|
|
html += this.typedata.render(this);
|
|
html += '<label>' + this.field_label+ '</label>';
|
|
html += '</div>';
|
|
|
|
this.rendered = true;
|
|
return html;
|
|
};
|
|
|
|
this.getContainer = function() {
|
|
return $('#' + this.containerId);
|
|
};
|
|
|
|
};
|
|
|
|
return new FlexFormObj(params);
|
|
},
|
|
|
|
registerType:function(type, renderFunction, initFunction, validateFunction, getterFunction, setterFunction, options) {
|
|
FlexForm._types[type] = {
|
|
'init': initFunction,
|
|
'render': renderFunction,
|
|
'validate': validateFunction,
|
|
'setter': getterFunction,
|
|
'getter': setterFunction,
|
|
'options': options
|
|
};
|
|
},
|
|
getType:function(type) {
|
|
if(typeof FlexForm._types[type] === 'undefined') {
|
|
throw "[" + ScopeName +"] FlexForm: " + type + " is undefined";
|
|
}
|
|
|
|
return FlexForm._types[type];
|
|
},
|
|
_types:{
|
|
'text' : {
|
|
'options': {
|
|
|
|
},
|
|
'render': function(fieldInstance) {
|
|
return '<input type="text" class="inputEle input-fullwidth ' + fieldInstance.fieldclass + '" value="' + (fieldInstance.field_value !== null ? fieldInstance.field_value : '') + '" />';
|
|
},
|
|
'validate': function(value, fieldInstance) {
|
|
return true;
|
|
},
|
|
'getter': function(fieldInstance) {
|
|
return fieldInstance.getContainer().find('.' + fieldInstance.fieldclass).val();
|
|
},
|
|
'setter': function(value, fieldInstance) {
|
|
fieldInstance.getContainer().find('.' + fieldInstance.fieldclass).val(value);
|
|
}
|
|
},
|
|
'textarea' : {
|
|
'options': {
|
|
// 'selfdecorate': false,
|
|
},
|
|
'render': function(fieldInstance) {
|
|
return '<textarea class="inputEle input-fullwidth ' + fieldInstance.fieldclass + '">' + (fieldInstance.field_value !== null ? fieldInstance.field_value : '') + '</textarea>';
|
|
},
|
|
'validate': function(value, fieldInstance) {
|
|
return true;
|
|
},
|
|
'getter': function(fieldInstance) {
|
|
return fieldInstance.getContainer().find('.' + fieldInstance.fieldclass).val();
|
|
},
|
|
'setter': function(value, fieldInstance) {
|
|
fieldInstance.getContainer().find('.' + fieldInstance.fieldclass).val(value);
|
|
}
|
|
},
|
|
'picklist' : {
|
|
'options': {
|
|
// 'selfdecorate': false,
|
|
},
|
|
'render': function(fieldInstance) {
|
|
var options = fieldInstance.getOptions();
|
|
var html = '<select class="select2 ' + fieldInstance.fieldclass + '">';
|
|
$.each(options.options, function(key, value) {
|
|
html += '<option value="' + key + '" ' + (fieldInstance.field_value == key ? 'selected="selected"' : '') + '>' + value + '</option>';
|
|
});
|
|
html += '</select>';
|
|
|
|
return html;
|
|
},
|
|
'init': function(fieldInstance) {
|
|
|
|
},
|
|
'validate': function(value, fieldInstance) {
|
|
return true;
|
|
},
|
|
'getter': function(fieldInstance) {
|
|
return fieldInstance.getContainer().find('.' + fieldInstance.fieldclass).select2('val');
|
|
},
|
|
'setter': function(value, fieldInstance) {
|
|
fieldInstance.getContainer().find('.' + fieldInstance.fieldclass).select2('val', value);
|
|
}
|
|
},
|
|
}
|
|
};/**
|
|
* You must generate a FlexTranslate Environment by useing FlexTranslate(ScopeName)
|
|
* @example
|
|
* FlexTranslate("ScopeName")
|
|
* @global
|
|
* @namespace
|
|
**/
|
|
var FlexTranslate = {
|
|
init:function(language, translations) {
|
|
FlexCache.set('__translations_' + language, translations);
|
|
},
|
|
getTranslator:function() {
|
|
return function(string) {
|
|
return FlexTranslate.__(string);
|
|
};
|
|
},
|
|
__:function(string) {
|
|
var language = app.getUserLanguage();
|
|
var translations = FlexCache.get('__translations_' + language, {});
|
|
|
|
if(typeof translations === 'function') {
|
|
FlexTranslate.init(language, translations());
|
|
return FlexTranslate.__(string);
|
|
}
|
|
|
|
if(typeof translations[string] !== 'undefined') {
|
|
return translations[string];
|
|
}
|
|
|
|
return string;
|
|
}
|
|
};
|
|
/*globals Vtiger_Edit_Js:false,Vtiger_Detail_Js:false,Vtiger_Popup_Js:false */
|
|
/**
|
|
* You must generate a FlexUtils Environment by useing FlexUtils(ScopeName)
|
|
* @example
|
|
* FlexUtils("ScopeName")
|
|
* @global
|
|
* @namespace
|
|
**/
|
|
var FlexUtils = {
|
|
layout: null,
|
|
currentLVRow: null,
|
|
listViewFields: false,
|
|
isVT7: function () {
|
|
return typeof app.helper !== 'undefined';
|
|
},
|
|
createFileDrop: function(options) {
|
|
if(typeof options === 'undefined') {
|
|
options = {};
|
|
}
|
|
if(typeof options.hovertext === 'undefined') {
|
|
options.hovertext = 'Drop File';
|
|
}
|
|
if(typeof options.container === 'undefined') {
|
|
options.container = 'body';
|
|
}
|
|
if(typeof options.container === 'undefined') {
|
|
options.container = 'body';
|
|
}
|
|
if(typeof options.data === 'undefined') {
|
|
options.data = {};
|
|
}
|
|
|
|
if($(options.container).prop('tagName') !== 'BODY' && $(options.container).css('position') == 'static') {
|
|
$(options.container).css('position', 'relative');
|
|
}
|
|
$(options.container).addClass('RegisteredFileDrop');
|
|
var containerHeight = $(options.container).height();
|
|
|
|
if(typeof options.url === 'undefined') {
|
|
if(typeof options.action === 'undefined') {
|
|
throw 'URL or action is mandatory for FileDrop Component';
|
|
} else {
|
|
options.url = 'index.php?module=' + ScopeName + '&action=' + options.action;
|
|
|
|
if(typeof options.settings !== 'undefined' && options.settings === true) {
|
|
options.url += '&parent=Settings';
|
|
}
|
|
}
|
|
}
|
|
|
|
if($('style#FlexFileDropStyles').length === 0) {
|
|
var fontSize = 20;
|
|
var showIcon = true;
|
|
var positionText = '40%';
|
|
if(containerHeight < 200) {
|
|
fontSize = 12;
|
|
showIcon = false;
|
|
positionText = '10%';
|
|
}
|
|
|
|
var html = '<style type="text/css" id="FlexFileDropStyles">div.FlexFileDropOverlay {\n' +
|
|
' position: absolute;\n' +
|
|
' top: 0;\n' +
|
|
' left: 0;\n' +
|
|
' height: 100%;\n' +
|
|
' width: 100%;\n' +
|
|
' z-index: 2000;\n' +
|
|
' background-color: rgba(0, 0, 0, 0.7);\n' +
|
|
' color: #ffffff;\n' +
|
|
' font-weight: bold;\n' +
|
|
' letter-spacing: 1px;\n' +
|
|
' text-transform: uppercase;\n' +
|
|
' font-size: ' + fontSize + 'px;\n' +
|
|
' overflow:hidden; ' +
|
|
' text-align: center;\n' +
|
|
' font-family: "Arial Black", Gadget, sans-serif;\n' +
|
|
'}\n' +
|
|
'div.FlexFileDropOverlay * {\n' +
|
|
' pointer-events: none;\n' +
|
|
'}\n' +
|
|
'div.FlexFileDropOverlay span#uploadHint {\n' +
|
|
' position: relative;\n' +
|
|
' top: '+positionText+';\n' +
|
|
'}\n' +
|
|
'div.FlexFileDropOverlay span#uploadHint i {\n' +
|
|
(showIcon == false? 'display:none;' : '') +
|
|
' font-size: 64px;\n' +
|
|
' margin-bottom: 30px;\n' +
|
|
'}</style>';
|
|
$('head').append(html);
|
|
}
|
|
|
|
if($('.FlexFileDropOverlay', options.container).length === 0) {
|
|
var html = '<div class="FlexFileDropOverlay" style="display:none;"><span id="uploadHint"><i class="fa fa-upload" aria-hidden="true"></i><br>' + options.hovertext + '</span></div>';
|
|
$(options.container).append(html);
|
|
}
|
|
|
|
var Overlay = $('.FlexFileDropOverlay', options.container);
|
|
|
|
$(options.container).on('dragenter', $.proxy(function (e) {
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
}, this));
|
|
|
|
$(options.container).on('dragover', $.proxy(function (e) {
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
}, this));
|
|
$(options.container).on('drop', $.proxy(function (e) {
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
}, this));
|
|
|
|
var aSignal = new FlexUtils.Signal();
|
|
|
|
$(options.container).append('<input type="file" style="display:none;" class="fileselector" />');
|
|
$(options.container).find('.fileselector').on('change', function(e) {
|
|
var target = $(e.currentTarget);
|
|
|
|
if(target.prop('files').length > 0) {
|
|
uploadFile(target.prop('files')[0]);
|
|
}
|
|
});
|
|
$(options.container).find('.fileselector').on('click', function(e) {
|
|
e.stopPropagation();
|
|
});
|
|
|
|
$(options.container).on('click', function() {
|
|
$(options.container).find('.fileselector').trigger('click');
|
|
});
|
|
|
|
var DragContainer = $(options.container);
|
|
DragContainer.on('dragenter', function (e) {
|
|
Overlay.fadeIn('fast');
|
|
} );
|
|
Overlay.on('dragleave', function (e) {
|
|
Overlay.fadeOut('fast');
|
|
});
|
|
|
|
function uploadFile(file) {
|
|
var fd = new FormData();
|
|
fd.append('file', file);
|
|
|
|
var uploadURL = options.url;
|
|
var extraData = options.data;
|
|
|
|
$.each(options.data, function(key, value) {
|
|
fd.append(key, value);
|
|
});
|
|
|
|
var jqXHR = jQuery.ajax({
|
|
url: uploadURL,
|
|
type: "POST",
|
|
contentType:false,
|
|
processData: false,
|
|
cache: false,
|
|
data: fd,
|
|
success: function(data){
|
|
aSignal.dispatch(data);
|
|
}
|
|
});
|
|
}
|
|
|
|
Overlay.on('drop', function (e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
Overlay.fadeOut('fast');
|
|
|
|
var fileList = e.originalEvent.dataTransfer.files;
|
|
|
|
$.each(fileList, jQuery.proxy(function(index, file) {
|
|
uploadFile(file);
|
|
}, this));
|
|
});
|
|
|
|
return aSignal;
|
|
},
|
|
showRecordInOverlay:function(setype, crmid) {
|
|
window.open('index.php?module=' + setype + '&view=Detail&record=' + crmid);
|
|
},
|
|
showNotification:function(message, isSuccess, options) {
|
|
if(typeof isSuccess == 'undefined') {
|
|
isSuccess = true;
|
|
}
|
|
if(typeof options == 'undefined') {
|
|
options = {};
|
|
}
|
|
|
|
if(FlexUtils.isVT7()) {
|
|
options.message = message;
|
|
|
|
if(isSuccess === true) {
|
|
app.helper.showSuccessNotification(options);
|
|
} else {
|
|
app.helper.showErrorNotification(options);
|
|
}
|
|
}
|
|
},
|
|
cacheSet:function(key, value) {
|
|
if(FlexUtils.isVT7()) {
|
|
return app.storage.set(key, value);
|
|
}
|
|
},
|
|
cacheGet:function(key, defaultValue) {
|
|
if(FlexUtils.isVT7()) {
|
|
return app.storage.get(key, defaultValue);
|
|
}
|
|
},
|
|
cacheClear:function(key) {
|
|
if(FlexUtils.isVT7()) {
|
|
return app.storage.clear(key);
|
|
}
|
|
},
|
|
cacheFlush:function() {
|
|
if(FlexUtils.isVT7()) {
|
|
return app.storage.flush();
|
|
}
|
|
},
|
|
getCurrentDateFormat:function(type) {
|
|
type = type.toLowerCase();
|
|
if(FlexCache.get('__CurrentDateFormat_' + type, false) !== false) {
|
|
return FlexCache.get('__CurrentDateFormat_' + type, false);
|
|
}
|
|
|
|
var replacement = {};
|
|
|
|
switch(type) {
|
|
case 'php':
|
|
replacement = {
|
|
'yyyy' : '%Y',
|
|
'yy' : '%y',
|
|
'dd' : '%d',
|
|
'mm' : '%m'
|
|
};
|
|
break;
|
|
case 'moment':
|
|
replacement = {
|
|
'yyyy' : 'YYYY',
|
|
'yy' : 'YY',
|
|
'dd' : 'DD',
|
|
'mm' : 'MM'
|
|
};
|
|
break;
|
|
}
|
|
|
|
var currentFormat;
|
|
|
|
if(FlexUtils.isVT7()) {
|
|
currentFormat = app.getDateFormat();
|
|
}
|
|
|
|
$.each(replacement, function(oldPart, newPart) {
|
|
currentFormat = currentFormat.replace(oldPart, newPart);
|
|
});
|
|
|
|
FlexCache.set('__CurrentDateFormat_' + type, currentFormat);
|
|
|
|
return currentFormat;
|
|
},
|
|
getCurrentCustomViewId: function() {
|
|
if(FlexUtils.isVT7() === true) {
|
|
return $('input[name="cvid"]').val();
|
|
} else {
|
|
return jQuery('#customFilter').val();
|
|
}
|
|
},
|
|
selectRecordPopup: function (params, multiple) {
|
|
var aDeferred = jQuery.Deferred();
|
|
var popupInstance = Vtiger_Popup_Js.getInstance();
|
|
|
|
if (FlexUtils.isVT7()) {
|
|
if(typeof params == 'string') {
|
|
params = {
|
|
'module':params,
|
|
'view':'Popup',
|
|
'src_module':'Emails', // module=Documents&view=&src_module=Emails&src_field=testfield&multi_select=1
|
|
'src_field':'testfield'
|
|
};
|
|
}
|
|
if(typeof multiple != 'undefined' && multiple === true) {
|
|
params.multi_select = 1;
|
|
}
|
|
|
|
app.event.off('FlexUtils.SelectRecord');
|
|
app.event.one('FlexUtils.SelectRecord', function (e, data) {
|
|
aDeferred.resolveWith(window, [jQuery.parseJSON(data)]);
|
|
});
|
|
|
|
|
|
popupInstance.showPopup(params, 'FlexUtils.SelectRecord', function (data2) { /* Callback when visible **/ });
|
|
}
|
|
else {
|
|
if(typeof params == 'string') {
|
|
params = {
|
|
'module':params,
|
|
'view':'Popup',
|
|
'src_module':'Emails', // module=Documents&view=&src_module=Emails&src_field=testfield&multi_select=1
|
|
'src_field':'testfield'
|
|
};
|
|
}
|
|
if(typeof multiple != 'undefined' && multiple === true) {
|
|
params.multi_select = 1;
|
|
}
|
|
|
|
popupInstance.show(params, function (data) {
|
|
aDeferred.resolveWith(data);
|
|
});
|
|
}
|
|
|
|
return aDeferred.promise();
|
|
},
|
|
getCurrentLayout: function () {
|
|
if (FlexUtils.layout !== null) {
|
|
return FlexUtils.layout;
|
|
}
|
|
var skinpath = jQuery('body').data('skinpath');
|
|
var matches = skinpath.match(/layouts\/([^/]+)/);
|
|
if (matches.length >= 2) {
|
|
FlexUtils.layout = matches[1];
|
|
return matches[1];
|
|
}
|
|
FlexUtils.layout = 'vlayout';
|
|
return 'vlayout';
|
|
},
|
|
getQueryParams: function (paramName) {
|
|
var sURL = window.document.URL.toString();
|
|
if (sURL.indexOf("?") > 0) {
|
|
var arrParams = sURL.split("?");
|
|
var arrURLParams = arrParams[1].split("&");
|
|
var arrParamNames = new Array(arrURLParams.length);
|
|
var arrParamValues = new Array(arrURLParams.length);
|
|
var i = 0;
|
|
for (i = 0; i < arrURLParams.length; i++) {
|
|
var sParam = arrURLParams[i].split("=");
|
|
arrParamNames[i] = sParam[0];
|
|
if (sParam[1] != "") {
|
|
arrParamValues[i] = decodeURI(sParam[1]);
|
|
} else {
|
|
arrParamValues[i] = "No Value";
|
|
}
|
|
}
|
|
for (i = 0; i < arrURLParams.length; i++) {
|
|
if (arrParamNames[i] == paramName) {
|
|
//alert("Parameter:" + arrParamValues[i]);
|
|
return arrParamValues[i];
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
onListChange: function() {
|
|
if (FlexCache.get('__onListChangeSignal', false) == false) {
|
|
var aSignal = new FlexUtils.Signal();
|
|
app.event.on("post.listViewFilter.click", function (e, container) {
|
|
aSignal.dispatch(container);
|
|
});
|
|
FlexCache.set('__onListChangeSignal', aSignal);
|
|
}
|
|
return FlexCache.get('__onListChangeSignal');
|
|
},
|
|
onRelatedListChange: function () {
|
|
if (FlexCache.get('__onRelatedListChangeSignal', false) == false) {
|
|
var aSignal = new FlexUtils.Signal();
|
|
app.event.on("post.relatedListLoad.click", function (e, container) {
|
|
aSignal.dispatch(container);
|
|
});
|
|
FlexCache.set('__onRelatedListChangeSignal', aSignal);
|
|
}
|
|
return FlexCache.get('__onRelatedListChangeSignal');
|
|
},
|
|
UUIDCounter: 1,
|
|
FieldChangeEventInit: false,
|
|
// Will register an event, when a field is changed
|
|
onFieldChange: function (parentEle) {
|
|
if(typeof parentEle === 'undefined') {
|
|
parentEle = 'div#page';
|
|
}
|
|
|
|
// Only register one signal for FieldChanges
|
|
if (jQuery(parentEle).data('fielduid') === undefined) {
|
|
jQuery(parentEle).data('fielduid', 'parentEle' + FlexUtils.UUIDCounter);
|
|
FlexUtils.UUIDCounter++;
|
|
}
|
|
var Fielduid = jQuery(parentEle).data('fielduid');
|
|
jQuery(parentEle).addClass('RedooFieldChangeTracker');
|
|
var aSignal;
|
|
if (FlexCache.get('__onFieldChangeSignal' + Fielduid, false) == false) {
|
|
aSignal = new FlexUtils.Signal();
|
|
if (FlexUtils.isVT7()) {
|
|
if (FlexUtils.FieldChangeEventInit === false) {
|
|
if(typeof Vtiger_Detail_Js !== 'undefined') {
|
|
app.event.on(Vtiger_Detail_Js.PostAjaxSaveEvent, function (e, fieldBasicData, postSaveRecordDetails, contentHolder) {
|
|
var fieldElement = fieldBasicData.closest('.RedooFieldChangeTracker');
|
|
var Fielduid = fieldElement.data('fielduid');
|
|
aSignal = FlexCache.get('__onFieldChangeSignal' + Fielduid);
|
|
aSignal.dispatch({
|
|
name: fieldBasicData.data('name'),
|
|
"new": postSaveRecordDetails[fieldBasicData.data('name')].value
|
|
}, fieldBasicData, postSaveRecordDetails, contentHolder);
|
|
});
|
|
FlexUtils.FieldChangeEventInit = true;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if(FlexUtils.getViewMode() !== "listview" && typeof Vtiger_Detail_Js !== "undefined") {
|
|
var thisInstance = Vtiger_Detail_Js.getInstance();
|
|
var detailContentsHolder = thisInstance.getContentHolder();
|
|
detailContentsHolder.on(thisInstance.fieldUpdatedEvent, function(e, values) {
|
|
var target = $(e.target);
|
|
var fieldName = target.attr('name');
|
|
var fieldElement = target.closest('.RedooFieldChangeTracker');
|
|
var Fielduid = fieldElement.data('fielduid');
|
|
|
|
aSignal = FlexCache.get('__onFieldChangeSignal' + Fielduid);
|
|
aSignal.dispatch({
|
|
name: fieldName,
|
|
"new": values.new
|
|
}, values, {}, detailContentsHolder);
|
|
|
|
});
|
|
}
|
|
|
|
}
|
|
FlexCache.set('__onFieldChangeSignal' + Fielduid, aSignal);
|
|
}
|
|
else {
|
|
aSignal = FlexCache.get('__onFieldChangeSignal' + Fielduid);
|
|
}
|
|
return FlexCache.get('__onFieldChangeSignal' + Fielduid);
|
|
},
|
|
getRecordLabels: function (ids) {
|
|
var aDeferred = jQuery.Deferred();
|
|
var newIds = [];
|
|
var LabelCache = FlexCache.get('LabelCache', {});
|
|
jQuery.each(ids, function (index, value) {
|
|
if (typeof LabelCache[value] == 'undefined') {
|
|
newIds.push(value);
|
|
}
|
|
});
|
|
if (newIds.length > 0) {
|
|
FlexAjax.postAction('RecordLabel', {
|
|
ids: newIds,
|
|
'dataType': 'json'
|
|
}).then(function (response) {
|
|
jQuery.each(response.result, function (id, value) {
|
|
LabelCache[id] = value;
|
|
});
|
|
FlexCache.set('LabelCache', LabelCache);
|
|
aDeferred.resolveWith({}, [LabelCache]);
|
|
});
|
|
}
|
|
else {
|
|
aDeferred.resolveWith({}, [LabelCache]);
|
|
}
|
|
return aDeferred.promise();
|
|
},
|
|
getFieldList: function (moduleName) {
|
|
var aDeferred = jQuery.Deferred();
|
|
if (typeof _FlexCache.FieldLoadQueue[moduleName] != 'undefined') {
|
|
return _FlexCache.FieldLoadQueue[moduleName];
|
|
}
|
|
_FlexCache.FieldLoadQueue[moduleName] = aDeferred;
|
|
if (typeof _FlexCache.FieldCache[moduleName] != 'undefined') {
|
|
aDeferred.resolve(_FlexCache.FieldCache[moduleName]);
|
|
return aDeferred.promise();
|
|
}
|
|
FlexAjax.post('index.php', {
|
|
'module': ScopeName,
|
|
'mode': 'GetFieldList',
|
|
'action': 'RedooUtils',
|
|
'module_name': moduleName
|
|
}, 'json').then(function (data) {
|
|
_FlexCache.FieldCache[moduleName] = data;
|
|
aDeferred.resolve(data.fields);
|
|
});
|
|
return aDeferred.promise();
|
|
},
|
|
filterFieldListByFieldtype: function (fields, fieldtype) {
|
|
var result = {};
|
|
jQuery.each(fields, function (blockLabel, fields) {
|
|
var block = [];
|
|
jQuery.each(fields, function (fieldName, fieldData) {
|
|
if (fieldData.type == fieldtype) {
|
|
block.push(fieldData);
|
|
}
|
|
});
|
|
if (block.length > 0) {
|
|
result[blockLabel] = block;
|
|
}
|
|
});
|
|
return result;
|
|
},
|
|
fillFieldSelect: function (fieldId, selected, module, fieldtype) {
|
|
if (typeof fieldtype == 'undefined') {
|
|
fieldtype = '';
|
|
}
|
|
if (typeof module == 'undefined' && typeof window.moduleName !== 'undefined') {
|
|
module = window.moduleName;
|
|
}
|
|
if (typeof selected == 'string') {
|
|
selected = [selected];
|
|
}
|
|
|
|
FlexUtils.getFieldList(module, fieldtype).then(function (fields) {
|
|
if (fieldtype != '') {
|
|
fields = FlexUtils.filterFieldListByFieldtype(fields, fieldtype);
|
|
}
|
|
var html = '';
|
|
jQuery.each(fields, function (blockLabel, fields) {
|
|
html += '<optgroup label="' + blockLabel + '">';
|
|
jQuery.each(fields, function (index, field) {
|
|
html += '<option value="' + field.name + '" ' + (jQuery.inArray(field.name, selected) != -1 ? 'selected="selected"' : '') + '>' + field.label + '</option>';
|
|
});
|
|
html += '</optgroup>';
|
|
jQuery('#' + fieldId).html(html);
|
|
if (jQuery('#' + fieldId).hasClass('select2')) {
|
|
jQuery('#' + fieldId).select2('val', selected);
|
|
}
|
|
jQuery('#' + fieldId).trigger('FieldsLoaded');
|
|
});
|
|
});
|
|
},
|
|
_getDefaultParentEle: function () {
|
|
return 'div#page';
|
|
},
|
|
getMainModule: function (parentEle) {
|
|
if (FlexUtils.isVT7()) {
|
|
return FlexUtils._getMainModuleVT7(parentEle);
|
|
}
|
|
else {
|
|
return FlexUtils._getMainModuleVT6(parentEle);
|
|
}
|
|
},
|
|
_getMainModuleVT6: function (parentEle) {
|
|
if (typeof parentEle == 'undefined') {
|
|
parentEle = FlexUtils._getDefaultParentEle();
|
|
}
|
|
var viewMode = FlexUtils.getViewMode(parentEle);
|
|
if (viewMode == 'detailview' || viewMode == 'summaryview') {
|
|
return $('#module', parentEle).val();
|
|
}
|
|
else if (viewMode == 'editview' || viewMode == 'quickcreate') {
|
|
return $('[name="module"]', parentEle).val();
|
|
}
|
|
else if (viewMode == 'listview') {
|
|
return $('#module', parentEle).val();
|
|
}
|
|
else if (viewMode == 'relatedview') {
|
|
if ($('[name="relatedModuleName"]', parentEle).length > 0) {
|
|
return $('[name="relatedModuleName"]', parentEle).val();
|
|
}
|
|
if ($('#module', parentEle).length > 0) {
|
|
return $('#module', parentEle).val();
|
|
}
|
|
}
|
|
var QueryModule = FlexUtils.getQueryParams('module');
|
|
if (QueryModule !== false) {
|
|
return QueryModule;
|
|
}
|
|
return '';
|
|
},
|
|
_getMainModuleVT7: function (parentEle) {
|
|
if (typeof parentEle == 'undefined') {
|
|
parentEle = FlexUtils._getDefaultParentEle();
|
|
}
|
|
var viewMode = FlexUtils.getViewMode(parentEle);
|
|
if ($(parentEle).data('forcerecordmodule') !== undefined) {
|
|
return $(parentEle).data('forcerecordmodule');
|
|
}
|
|
if (parentEle != '#overlayPageContent.in' && $('#overlayPageContent.in').length > 0) {
|
|
return FlexUtils._getMainModuleVT7('#overlayPageContent.in');
|
|
}
|
|
if (typeof _META != 'undefined' &&
|
|
(viewMode == 'detailview' ||
|
|
viewMode == 'summaryview' ||
|
|
viewMode == 'commentview' ||
|
|
viewMode == 'historyview' ||
|
|
viewMode == 'editview' ||
|
|
viewMode == 'listview') &&
|
|
($(parentEle).hasClass('modal') == false)) {
|
|
return _META.module;
|
|
}
|
|
else {
|
|
if (viewMode == 'detailview' || viewMode == 'summaryview') {
|
|
return $('#module', parentEle).val();
|
|
}
|
|
else if (viewMode == 'editview' || viewMode == 'quickcreate') {
|
|
if ($('#module', parentEle).length > 0) {
|
|
return $('#module', parentEle).val();
|
|
}
|
|
else {
|
|
return $('[name="module"]', parentEle).val();
|
|
}
|
|
}
|
|
else if (viewMode == 'listview') {
|
|
return $('#module', parentEle).val();
|
|
}
|
|
else if (viewMode == 'relatedview') {
|
|
if ($('[name="relatedModuleName"]', parentEle).length > 0) {
|
|
return $('[name="relatedModuleName"]', parentEle).val();
|
|
}
|
|
if ($('#module', parentEle).length > 0) {
|
|
return $('#module', parentEle).val();
|
|
}
|
|
}
|
|
}
|
|
var QueryModule = FlexUtils.getQueryParams('module');
|
|
if (QueryModule !== false) {
|
|
return QueryModule;
|
|
}
|
|
return '';
|
|
},
|
|
getMainRecordId: function () {
|
|
var parentEle = 'div#page';
|
|
|
|
if (typeof parentEle == 'undefined') {
|
|
parentEle = FlexUtils._getDefaultParentEle();
|
|
}
|
|
|
|
var recordId = false;
|
|
var viewMode = FlexUtils.getViewMode(parentEle);
|
|
|
|
// if (viewMode == 'detailview' || viewMode == 'summaryview') {
|
|
recordId= $('#recordId', parentEle).val();
|
|
// }
|
|
|
|
return recordId;
|
|
},
|
|
getRecordIds: function (parentEle) {
|
|
if (typeof parentEle == 'undefined') {
|
|
parentEle = FlexUtils._getDefaultParentEle();
|
|
}
|
|
var recordIds = [];
|
|
var viewMode = FlexUtils.getViewMode(parentEle);
|
|
if (viewMode == 'detailview' || viewMode == 'summaryview') {
|
|
recordIds.push($('#recordId', parentEle).val());
|
|
}
|
|
else if (viewMode == 'quickcreate') {
|
|
// do nothing
|
|
}
|
|
else if (viewMode == 'editview') {
|
|
recordIds.push($('[name="record"]').val());
|
|
}
|
|
else if (viewMode == 'listview') {
|
|
$('.listViewEntries').each(function (index, value) {
|
|
recordIds.push($(value).data('id'));
|
|
});
|
|
}
|
|
else if (viewMode == 'relatedview') {
|
|
$('.listViewEntries').each(function (index, value) {
|
|
recordIds.push($(value).data('id'));
|
|
});
|
|
}
|
|
return recordIds;
|
|
},
|
|
onQuickCreate: function(callback) {
|
|
jQuery('.quickCreateModule, .addButton[data-url*="QuickCreate"]').on('click', function __checkQC() {
|
|
if (jQuery('.quickCreateContent', '.modelContainer').length == 0) {
|
|
window.setTimeout(__checkQC, 200);
|
|
} else {
|
|
var form = jQuery('.modelContainer');
|
|
console.log('onQuickCreate Done');
|
|
|
|
callback(form.find('input[name="module"]').val(), form);
|
|
}
|
|
});
|
|
},
|
|
getViewMode: function (parentEle) {
|
|
if (FlexUtils.isVT7()) {
|
|
return FlexUtils._getViewModeVT7(parentEle);
|
|
}
|
|
else {
|
|
return FlexUtils._getViewModeVT6(parentEle);
|
|
}
|
|
},
|
|
_getViewModeVT6: function (parentEle) {
|
|
if (typeof parentEle == 'undefined') {
|
|
parentEle = FlexUtils._getDefaultParentEle();
|
|
}
|
|
var viewEle = $("#view", parentEle);
|
|
_FlexCache.viewMode = false;
|
|
if (viewEle.length > 0 && viewEle[0].value == "List") {
|
|
_FlexCache.viewMode = "listview";
|
|
}
|
|
if ($(".detailview-table", parentEle).length > 0) {
|
|
_FlexCache.viewMode = "detailview";
|
|
}
|
|
else if ($(".summaryView", parentEle).length > 0) {
|
|
_FlexCache.viewMode = "summaryview";
|
|
}
|
|
else if ($(".recordEditView", parentEle).length > 0) {
|
|
if ($('.quickCreateContent', parentEle).length == 0) {
|
|
_FlexCache.viewMode = "editview";
|
|
}
|
|
else {
|
|
_FlexCache.viewMode = "quickcreate";
|
|
}
|
|
}
|
|
if ($('.relatedContents', parentEle).length > 0) {
|
|
_FlexCache.viewMode = "relatedview";
|
|
if ($('td[data-field-type]', parentEle).length > 0) {
|
|
_FlexCache.popUp = false;
|
|
}
|
|
else {
|
|
_FlexCache.popUp = true;
|
|
}
|
|
}
|
|
if (_FlexCache.viewMode === false) {
|
|
if ($('#view', parentEle).length > 0) {
|
|
if ($('#view', parentEle).val() == 'Detail') {
|
|
_FlexCache.viewMode = 'detailview';
|
|
}
|
|
}
|
|
}
|
|
return _FlexCache.viewMode;
|
|
},
|
|
_getViewModeVT7: function (parentEle) {
|
|
if (typeof parentEle == 'undefined') {
|
|
parentEle = FlexUtils._getDefaultParentEle();
|
|
}
|
|
_FlexCache.viewMode = false;
|
|
if ($(".detailview-table", parentEle).length > 0) {
|
|
_FlexCache.viewMode = "detailview";
|
|
}
|
|
else if ($(".summaryView", parentEle).length > 0) {
|
|
_FlexCache.viewMode = "summaryview";
|
|
}
|
|
else if ($(".recordEditView", parentEle).length > 0) {
|
|
if ($('.quickCreateContent', parentEle).length == 0) {
|
|
_FlexCache.viewMode = "editview";
|
|
}
|
|
else {
|
|
_FlexCache.viewMode = "quickcreate";
|
|
}
|
|
}
|
|
else if ($(".commentsRelatedContainer", parentEle).length > 0) {
|
|
_FlexCache.viewMode = "commentview";
|
|
}
|
|
else if ($(".HistoryContainer", parentEle).length > 0) {
|
|
_FlexCache.viewMode = "historyview";
|
|
}
|
|
else if (jQuery('.relatedContainer', parentEle).find('.relatedModuleName').length > 0) {
|
|
_FlexCache.viewMode = "relatedview";
|
|
}
|
|
else if (jQuery('.listViewContentHeader', parentEle).length > 0 && typeof _META != 'undefined' && _META.view == 'List') {
|
|
_FlexCache.viewMode = "listview";
|
|
}
|
|
if (_FlexCache.viewMode === false) {
|
|
if ($('#view', parentEle).length > 0) {
|
|
if ($('#view', parentEle).val() == 'Detail') {
|
|
_FlexCache.viewMode = 'detailview';
|
|
}
|
|
}
|
|
}
|
|
return _FlexCache.viewMode;
|
|
},
|
|
getContentMaxHeight: function() {
|
|
if(FlexUtils.isVT7() == false) {
|
|
switch(FlexUtils.getCurrentLayout()) {
|
|
case 'begbie':
|
|
return jQuery('.mainContainer').height();
|
|
default:
|
|
return jQuery('#leftPanel').height() - 50;
|
|
}
|
|
|
|
} else {
|
|
return jQuery('#page').height();
|
|
}
|
|
},
|
|
getContentMaxWidth: function() {
|
|
if(FlexUtils.isVT7() == false) {
|
|
return jQuery('#rightPanel').width();
|
|
}
|
|
},
|
|
hideModalBox: function (content) {
|
|
if (FlexUtils.isVT7() === true) {
|
|
app.helper.hideModal();
|
|
}
|
|
else {
|
|
app.hideModalWindow();
|
|
}
|
|
},
|
|
showModalBox: function (content,params) {
|
|
var aDeferred = jQuery.Deferred();
|
|
|
|
if (FlexUtils.isVT7() === false) {
|
|
app.showModalWindow(content, function (data) {
|
|
aDeferred.resolveWith(window, data);
|
|
});
|
|
} else {
|
|
if(typeof params == 'undefined') {
|
|
params = { close:function() { }};
|
|
}
|
|
if(typeof params.close == 'undefined') {
|
|
params.close = function() { };
|
|
}
|
|
|
|
FlexCache.set('__onModalClose', params.close);
|
|
|
|
if(jQuery('.myModal .modal-dialog').length > 0 && jQuery('.modal.in').length > 0) {
|
|
|
|
jQuery('.myModal .modal-dialog').replaceWith(content);
|
|
aDeferred.resolveWith(window, jQuery('.modal.myModal')[0]);
|
|
|
|
} else {
|
|
|
|
var container = app.helper.showModal(content, {
|
|
cb: function (data) {
|
|
aDeferred.resolveWith(window, data);
|
|
}
|
|
});
|
|
container.off('hidden.bs.modal').on('hidden.bs.modal', function() {
|
|
params.close();
|
|
});
|
|
}
|
|
|
|
}
|
|
return aDeferred.promise();
|
|
},
|
|
showContentOverlay: function(data, params) {
|
|
if(FlexUtils.isVT7()) {
|
|
return app.helper.loadPageContentOverlay(data, params);
|
|
} else {
|
|
if($('#overlayPageContent').length == 0) {
|
|
$('body').append('<div id=\'overlayPageContent\' style="margin:0;" class=\'fade modal content-area overlayPageContent overlay-container-60\' tabindex=\'-1\' role=\'dialog\' aria-hidden=\'true\'>\n' +
|
|
' <div class="data">\n' +
|
|
' </div>\n' +
|
|
' <div class="modal-dialog">\n' +
|
|
' </div>\n' +
|
|
' </div>');
|
|
}
|
|
|
|
var aDeferred = new jQuery.Deferred();
|
|
var defaultParams = {
|
|
backdrop:true,
|
|
show:true,
|
|
keyboard: false
|
|
};
|
|
params = jQuery.extend(defaultParams, params);
|
|
|
|
var overlayPageContent = $('#overlayPageContent');
|
|
|
|
//if(jQuery(".content-area").length && jQuery(".content-area").hasClass('full-width')|| (jQuery('.settingsgroup').length === 0 && jQuery('#modules-menu').length === 0)){
|
|
overlayPageContent.addClass('full-width');
|
|
//}
|
|
var alreadyShown = false;
|
|
if(overlayPageContent.hasClass('in')) {
|
|
alreadyShown = true;
|
|
}
|
|
overlayPageContent.one('shown.bs.modal',function(){
|
|
aDeferred.resolve($('#overlayPageContent'));
|
|
});
|
|
|
|
overlayPageContent.one('hidden.bs.modal',function(){
|
|
overlayPageContent.find('.data').html('');
|
|
});
|
|
|
|
overlayPageContent.find('.data').html(data);
|
|
//vtUtils.applyFieldElementsView(overlayPageContent);
|
|
overlayPageContent.modal(params);
|
|
|
|
if(alreadyShown) {
|
|
aDeferred.resolve(jQuery('#overlayPageContent'));
|
|
}
|
|
|
|
return aDeferred.promise();
|
|
|
|
}
|
|
},
|
|
hideContentOverlay: function() {
|
|
if(FlexUtils.isVT7()) {
|
|
app.helper.hidePageContentOverlay();
|
|
} else {
|
|
var aDeferred = new jQuery.Deferred();
|
|
var overlayPageContent = $('#overlayPageContent');
|
|
overlayPageContent.one('hidden.bs.modal', function() {
|
|
overlayPageContent.find('.data').html('');
|
|
aDeferred.resolve();
|
|
});
|
|
$('#overlayPageContent').modal('hide');
|
|
return aDeferred.promise();
|
|
}
|
|
},
|
|
setFieldValue: function (fieldName, fieldValue, parentEle) {
|
|
if (typeof parentEle == 'undefined' || parentEle == null) {
|
|
parentEle = FlexUtils._getDefaultParentEle();
|
|
}
|
|
var fieldElement = FlexUtils.getFieldElement(fieldName, parentEle, true);
|
|
switch (fieldElement.prop('tagName')) {
|
|
case 'INPUT':
|
|
switch (fieldElement.attr('type')) {
|
|
case 'text':
|
|
if (fieldElement.hasClass('dateField')) {
|
|
if(FlexUtils.isVT7()) {
|
|
fieldElement.datepicker('update', fieldValue);
|
|
} else {
|
|
if(fieldValue !== '') {
|
|
fieldElement.val(fieldValue).DatePickerSetDate(fieldValue, true);
|
|
} else {
|
|
fieldElement.val(fieldValue).DatePickerClear();
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
fieldElement.val(fieldValue);
|
|
}
|
|
break;
|
|
case 'hidden':
|
|
if (fieldElement.hasClass('sourceField')) {
|
|
var obj = Vtiger_Edit_Js.getInstance();
|
|
var container = fieldElement.closest('td');
|
|
if (fieldValue.id != '') {
|
|
obj.setReferenceFieldValue(container, { id: fieldValue.id, name: fieldValue.label });
|
|
}
|
|
else {
|
|
$('.clearReferenceSelection', container).trigger('click');
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case 'SELECT':
|
|
fieldElement.val(fieldValue);
|
|
if(FlexUtils.isVT7() === false) {
|
|
if (fieldElement.hasClass('chzn-select')) {
|
|
fieldElement.trigger('liszt:updated');
|
|
}
|
|
} else {
|
|
if (fieldElement.hasClass('select2')) {
|
|
fieldElement.trigger('change.select2');
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
},
|
|
layoutDependValue: function (value, defaultValue) {
|
|
var currentLayout = FlexUtils.getCurrentLayout();
|
|
if (typeof value[currentLayout] !== 'undefined') {
|
|
return value[currentLayout];
|
|
}
|
|
return defaultValue;
|
|
},
|
|
getFieldElement: function (fieldName, parentEle, returnInput) {
|
|
if (typeof parentEle == 'undefined' || parentEle == null) {
|
|
parentEle = FlexUtils._getDefaultParentEle();
|
|
}
|
|
if (typeof returnInput == 'undefined') {
|
|
returnInput = false;
|
|
}
|
|
if (typeof fieldName == "object") {
|
|
return fieldName;
|
|
}
|
|
var fieldElement = false;
|
|
if (FlexUtils.getViewMode(parentEle) == "detailview") {
|
|
if ($('#' + FlexUtils.getMainModule(parentEle) + '_detailView_fieldValue_' + fieldName, parentEle).length > 0 || $('#Events_detailView_fieldValue_' + fieldName, parentEle).length > 0) {
|
|
fieldElement = $('#' + FlexUtils.getMainModule(parentEle) + '_detailView_fieldValue_' + fieldName);
|
|
if (FlexUtils.getMainModule(parentEle) == 'Calendar' && fieldElement.length == 0) {
|
|
fieldElement = $('#Events_detailView_fieldValue_' + fieldName, parentEle);
|
|
}
|
|
}
|
|
else if ($('#_detailView_fieldValue_' + fieldName, parentEle).length > 0) {
|
|
fieldElement = $('#_detailView_fieldValue_' + fieldName, parentEle);
|
|
}
|
|
}
|
|
else if (FlexUtils.getViewMode(parentEle) == "summaryview") {
|
|
var ele_1;
|
|
if (FlexUtils.isVT7()) {
|
|
ele_1 = jQuery('[data-name="' + fieldName + '"]', this.parentEle);
|
|
}
|
|
else {
|
|
ele_1 = jQuery('[name="' + fieldName + '"]', this.parentEle);
|
|
}
|
|
if (ele_1.length == 0) {
|
|
return false;
|
|
/*
|
|
if(typeof this.summaryFields[fieldName] != 'undefined') {
|
|
fieldElement = jQuery(jQuery(FlexUtils.getCurrentLayout() == 'vlayout' ? '.summary-table td.fieldValue' : '.summary-table div.mycdivfield')[this.summaryFields[fieldName] - 1]);
|
|
} else {
|
|
return false;
|
|
}*/
|
|
}
|
|
else {
|
|
fieldElement = $(ele_1[0]).closest(FlexUtils.layoutDependValue({
|
|
'vlayout': 'td',
|
|
'v7': '.row',
|
|
'begbie': 'div.mycdivfield',
|
|
'responsive': '.row',
|
|
}, 'td'));
|
|
}
|
|
}
|
|
else if (FlexUtils.getViewMode(parentEle) == "editview" || FlexUtils.getViewMode(parentEle) == 'quickcreate') {
|
|
var ele = $('[name="' + fieldName + '"]', parentEle);
|
|
if (ele.length == 0) {
|
|
return false;
|
|
}
|
|
if (returnInput == true) {
|
|
return ele;
|
|
}
|
|
fieldElement = $(ele[0]).closest(FlexUtils.layoutDependValue({
|
|
'vlayout': '.fieldValue',
|
|
'v7': '.fieldValue',
|
|
'begbie': 'div.mycdivfield',
|
|
'responsive': '.fieldValue'
|
|
}, '.fieldValue'));
|
|
}
|
|
else if (FlexUtils.getViewMode(parentEle) == 'listview') {
|
|
if (FlexUtils.listViewFields === false) {
|
|
FlexUtils.listViewFields = FlexUtils.getListFields(parentEle);
|
|
}
|
|
if (FlexUtils.currentLVRow !== null) {
|
|
if (typeof FlexUtils.listViewFields[fieldName] != 'undefined') {
|
|
if (FlexUtils.listViewFields[fieldName] >= 0) {
|
|
fieldElement = $($('td.listViewEntryValue', FlexUtils.currentLVRow)[FlexUtils.listViewFields[fieldName]]);
|
|
}
|
|
else {
|
|
fieldElement = $($('td.listViewEntryValue', FlexUtils.currentLVRow)[Number(FlexUtils.listViewFields[fieldName] + 100) * -1]);
|
|
}
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
}
|
|
else if (FlexUtils.getViewMode(parentEle) == 'relatedview') {
|
|
if (FlexUtils.listViewFields === false) {
|
|
FlexUtils.listViewFields = FlexUtils.getListFields(parentEle);
|
|
}
|
|
if ($('td[data-field-type]', FlexUtils.currentLVRow).length > 0) {
|
|
fieldElement = $($('td[data-field-type]', FlexUtils.currentLVRow)[FlexUtils.listViewFields[fieldName]]);
|
|
}
|
|
else {
|
|
fieldElement = $($('td.listViewEntryValue', FlexUtils.currentLVRow)[FlexUtils.listViewFields[fieldName]]);
|
|
}
|
|
}
|
|
return fieldElement;
|
|
},
|
|
refreshContent: function (viewName, isSettings, params, convertComponents) {
|
|
if (typeof params === 'undefined') {
|
|
convertComponents = false;
|
|
}
|
|
if (typeof params === 'undefined') {
|
|
params = {};
|
|
}
|
|
if (typeof isSettings === 'undefined') {
|
|
isSettings = false;
|
|
}
|
|
|
|
params.module = ScopeName;
|
|
params.view = viewName;
|
|
if (isSettings === true) {
|
|
params.parent = 'Settings';
|
|
}
|
|
var aDeferred = jQuery.Deferred();
|
|
if (FlexUtils.isVT7()) {
|
|
FlexAjax.request(params).then(function (data) {
|
|
var target;
|
|
if(jQuery('.settingsPageDiv').length > 0) {
|
|
jQuery(".settingsPageDiv").html(data);
|
|
|
|
target = jQuery(".settingsPageDiv");
|
|
} else {
|
|
jQuery(".ContentReplacement").html(data);
|
|
|
|
target = jQuery(".ContentReplacement");
|
|
}
|
|
|
|
if(convertComponents === true) {
|
|
jQuery(".select2", target).select2();
|
|
}
|
|
|
|
aDeferred.resolve();
|
|
});
|
|
}
|
|
else {
|
|
FlexAjax.request(params).then(function (data) {
|
|
jQuery(jQuery(".contentsDiv")[0]).html(data);
|
|
if(convertComponents === true) {
|
|
jQuery(jQuery(".contentsDiv")[0]).find('.select2').select2();
|
|
}
|
|
|
|
aDeferred.resolve();
|
|
});
|
|
}
|
|
return aDeferred.promise();
|
|
},
|
|
getListFields: function (parentEle) {
|
|
var cols;
|
|
if(FlexUtils.isVT7()) {
|
|
cols = jQuery(".listview-table .listViewContentHeaderValues", parentEle);
|
|
} else {
|
|
cols = jQuery(".listViewEntriesTable .listViewHeaderValues", parentEle);
|
|
}
|
|
var listViewFields = {};
|
|
for (var colIndex in cols) {
|
|
if (cols.hasOwnProperty(colIndex) && jQuery.isNumeric(colIndex)) {
|
|
var value = cols[colIndex];
|
|
if (jQuery(value).data("columnname") == undefined) {
|
|
listViewFields[jQuery(value).data("fieldname")] = colIndex;
|
|
}
|
|
else {
|
|
listViewFields[jQuery(value).data("columnname")] = colIndex;
|
|
}
|
|
}
|
|
}
|
|
return listViewFields;
|
|
},
|
|
loadStyles: function (urls, nocache) {
|
|
if (typeof urls == 'string') {
|
|
urls = [urls];
|
|
}
|
|
var aDeferred = jQuery.Deferred();
|
|
if (typeof nocache == 'undefined') {
|
|
nocache = false; // default don't refresh
|
|
}
|
|
$.when.apply($, $.map(urls, function (url) {
|
|
if (nocache) {
|
|
url += '?_ts=' + new Date().getTime(); // refresh?
|
|
}
|
|
return $.get(url, function () {
|
|
$('<link>', { rel: 'stylesheet', type: 'text/css', 'href': url }).appendTo('head');
|
|
});
|
|
})).then(function () {
|
|
aDeferred.resolve();
|
|
});
|
|
return aDeferred.promise();
|
|
},
|
|
loadScript: function (url, options) {
|
|
var aDeferred = jQuery.Deferred();
|
|
if (typeof FlexCache.loadedScript == 'undefined') {
|
|
FlexCache.loadedScript = {};
|
|
}
|
|
if (typeof FlexCache.loadedScript[url] != 'undefined') {
|
|
aDeferred.resolve();
|
|
return aDeferred;
|
|
}
|
|
// Allow user to set any option except for dataType, cache, and url
|
|
options = jQuery.extend(options || {}, {
|
|
dataType: "script",
|
|
cache: true,
|
|
url: url
|
|
});
|
|
// Use $.ajax() since it is more flexible than $.getScript
|
|
// Return the jqXHR object so we can chain callbacks
|
|
return jQuery.ajax(options);
|
|
}
|
|
};var _FlexCache = {
|
|
'FieldCache': {},
|
|
'FieldLoadQueue': {},
|
|
'viewMode': false,
|
|
'popUp': false
|
|
};
|
|
|
|
if(typeof console != 'undefined' && typeof console.log != 'undefined') {
|
|
console.log('Initialize FlexUtils ' + ScopeName + " V" + Version);
|
|
}
|
|
|
|
if (typeof window.FlexStore == 'undefined') {
|
|
window.FlexStore = {};
|
|
}
|
|
if (typeof window.RedooStore == 'undefined') {
|
|
window.RedooStore = {};
|
|
}
|
|
window.RedooStore[ScopeName] = window.FlexStore[ScopeName] = {
|
|
'Ajax': FlexAjax,
|
|
'Utils': FlexUtils,
|
|
'Cache': FlexCache,
|
|
'Form': FlexForm,
|
|
'Translate': FlexTranslate
|
|
};
|
|
|
|
if (typeof window.FlexAjax == 'undefined') {
|
|
/**
|
|
* @ignore
|
|
* @param {string} ScopeName
|
|
* @returns {FlexAjax}
|
|
*/
|
|
window.FlexAjax = function (ScopeName) {
|
|
if (typeof window.FlexStore[ScopeName] != 'undefined') {
|
|
return window.FlexStore[ScopeName].Ajax;
|
|
}
|
|
if (typeof window.RedooStore[ScopeName] != 'undefined') {
|
|
return window.RedooStore[ScopeName].Ajax;
|
|
}
|
|
console.error('FlexAjax ' + ScopeName + ' Scope not found');
|
|
};
|
|
}
|
|
|
|
if (typeof window.RedooAjax == 'undefined') {
|
|
window.RedooAjax = window.FlexAjax;
|
|
}
|
|
|
|
if (typeof window.FlexUtils == 'undefined') {
|
|
/**
|
|
* @ignore
|
|
* @param ScopeName
|
|
* @returns FlexUtils
|
|
* @constructor
|
|
*/
|
|
window.FlexUtils = function (ScopeName) {
|
|
if (typeof window.FlexStore[ScopeName] != 'undefined') {
|
|
return window.FlexStore[ScopeName].Utils;
|
|
}
|
|
if (typeof window.RedooStore[ScopeName] != 'undefined') {
|
|
return window.RedooStore[ScopeName].Utils;
|
|
}
|
|
console.error('FlexUtils ' + ScopeName + ' Scope not found');
|
|
};
|
|
}
|
|
if (typeof window.RedooUtils == 'undefined') {
|
|
window.RedooUtils = window.FlexUtils;
|
|
}
|
|
|
|
if (typeof window.FlexCache == 'undefined') {
|
|
/**
|
|
* @ignore
|
|
* @param ScopeName
|
|
* @returns FlexCache
|
|
* @constructor
|
|
*/
|
|
window.FlexCache = function (ScopeName) {
|
|
if (typeof window.RedooStore[ScopeName] != 'undefined') {
|
|
return window.RedooStore[ScopeName].Cache;
|
|
}
|
|
if (typeof window.FlexStore[ScopeName] != 'undefined') {
|
|
return window.FlexStore[ScopeName].Cache;
|
|
}
|
|
console.error('FlexCache ' + ScopeName + ' Scope not found');
|
|
};
|
|
}
|
|
if (typeof window.RedooCache == 'undefined') {
|
|
window.RedooCache = window.FlexCache;
|
|
}
|
|
if (typeof window.FlexForm == 'undefined') {
|
|
/**
|
|
* @ignore
|
|
* @param ScopeName
|
|
* @returns FlexCache
|
|
* @constructor
|
|
*/
|
|
window.FlexForm = function (ScopeName) {
|
|
if (typeof window.FlexStore[ScopeName] != 'undefined') {
|
|
return window.FlexStore[ScopeName].Form;
|
|
}
|
|
console.error('FlexForm ' + ScopeName + ' Scope not found');
|
|
};
|
|
}
|
|
if (typeof window.FlexTranslate == 'undefined') {
|
|
/**
|
|
* @ignore
|
|
* @param ScopeName
|
|
* @returns FlexCache
|
|
* @constructor
|
|
*/
|
|
window.FlexTranslate = function (ScopeName) {
|
|
if (typeof window.FlexStore[ScopeName] != 'undefined') {
|
|
return window.FlexStore[ScopeName].Translate;
|
|
}
|
|
console.error('FlexTranslate ' + ScopeName + ' Scope not found');
|
|
};
|
|
}
|
|
|
|
if (typeof window.FlexEvents == 'undefined') {
|
|
/**
|
|
* @ignore
|
|
* @returns jQuery Eventhandler
|
|
* @constructor
|
|
*/
|
|
window.FlexEvents = $({});
|
|
}// Dependency
|
|
/* jshint ignore:start */
|
|
/*
|
|
JS Signals <http://millermedeiros.github.com/js-signals/>
|
|
Released under the MIT license
|
|
Author: Miller Medeiros
|
|
Version: 1.0.0 - Build: 268 (2012/11/29 05:48 PM)
|
|
*/
|
|
function h(a, b, c, d, e) { this._listener = b; this._isOnce = c; this.context = d; this._signal = a; this._priority = e || 0; }
|
|
function g(a, b) { if (typeof a !== "function")
|
|
throw Error("listener is a required param of {fn}() and should be a Function.".replace("{fn}", b)); }
|
|
function e() { this._bindings = []; this._prevParams = null; var a = this; this.dispatch = function () { e.prototype.dispatch.apply(a, arguments); }; }
|
|
h.prototype = { active: !0, params: null, execute: function (a) {
|
|
var b;
|
|
this.active && this._listener && (a = this.params ? this.params.concat(a) :
|
|
a, b = this._listener.apply(this.context, a), this._isOnce && this.detach());
|
|
return b;
|
|
}, detach: function () { return this.isBound() ? this._signal.remove(this._listener, this.context) : null; }, isBound: function () { return !!this._signal && !!this._listener; }, isOnce: function () { return this._isOnce; }, getListener: function () { return this._listener; }, getSignal: function () { return this._signal; }, _destroy: function () { delete this._signal; delete this._listener; delete this.context; }, toString: function () {
|
|
return "[SignalBinding isOnce:" + this._isOnce +
|
|
", isBound:" + this.isBound() + ", active:" + this.active + "]";
|
|
} };
|
|
e.prototype = { VERSION: "1.0.0", memorize: !1, _shouldPropagate: !0, active: !0, _registerListener: function (a, b, c, d) { var e = this._indexOfListener(a, c); if (e !== -1) {
|
|
if (a = this._bindings[e], a.isOnce() !== b)
|
|
throw Error("You cannot add" + (b ? "" : "Once") + "() then add" + (!b ? "" : "Once") + "() the same listener without removing the relationship first.");
|
|
}
|
|
else
|
|
a = new h(this, a, b, c, d), this._addBinding(a); this.memorize && this._prevParams && a.execute(this._prevParams); return a; },
|
|
_addBinding: function (a) { var b = this._bindings.length; do
|
|
--b;
|
|
while (this._bindings[b] && a._priority <= this._bindings[b]._priority); this._bindings.splice(b + 1, 0, a); }, _indexOfListener: function (a, b) { for (var c = this._bindings.length, d; c--;)
|
|
if (d = this._bindings[c], d._listener === a && d.context === b)
|
|
return c; return -1; }, has: function (a, b) { return this._indexOfListener(a, b) !== -1; }, add: function (a, b, c) { g(a, "add"); return this._registerListener(a, !1, b, c); }, addOnce: function (a, b, c) {
|
|
g(a, "addOnce");
|
|
return this._registerListener(a, !0, b, c);
|
|
}, remove: function (a, b) { g(a, "remove"); var c = this._indexOfListener(a, b); c !== -1 && (this._bindings[c]._destroy(), this._bindings.splice(c, 1)); return a; }, removeAll: function () { for (var a = this._bindings.length; a--;)
|
|
this._bindings[a]._destroy(); this._bindings.length = 0; }, getNumListeners: function () { return this._bindings.length; }, halt: function () { this._shouldPropagate = !1; }, dispatch: function (a) {
|
|
if (this.active) {
|
|
var b = Array.prototype.slice.call(arguments), c = this._bindings.length, d;
|
|
if (this.memorize)
|
|
this._prevParams =
|
|
b;
|
|
if (c) {
|
|
d = this._bindings.slice();
|
|
this._shouldPropagate = !0;
|
|
do
|
|
c--;
|
|
while (d[c] && this._shouldPropagate && d[c].execute(b) !== !1);
|
|
}
|
|
}
|
|
}, forget: function () { this._prevParams = null; }, dispose: function () { this.removeAll(); delete this._bindings; delete this._prevParams; }, toString: function () { return "[Signal active:" + this.active + " numListeners:" + this.getNumListeners() + "]"; } };
|
|
var f = e;
|
|
f.Signal = e;
|
|
FlexUtils.Signal = f.Signal;
|
|
/*
|
|
* jQuery BlockUI; v20141123
|
|
* http://jquery.malsup.com/block/
|
|
* Copyright (c) 2014 M. Alsup; Dual licensed: MIT/GPL
|
|
*/
|
|
(function () {
|
|
"use strict";
|
|
function e(e) { function o(o, i) { var s, h, k = o == window, v = i && void 0 !== i.message ? i.message : void 0; if (i = e.extend({}, FlexUtils.blockUI.defaults, i || {}), !i.ignoreIfBlocked || !e(o).data("blockUI.isBlocked")) {
|
|
if (i.overlayCSS = e.extend({}, FlexUtils.blockUI.defaults.overlayCSS, i.overlayCSS || {}), s = e.extend({}, FlexUtils.blockUI.defaults.css, i.css || {}), i.onOverlayClick && (i.overlayCSS.cursor = "pointer"), h = e.extend({}, FlexUtils.blockUI.defaults.themedCSS, i.themedCSS || {}), v = void 0 === v ? i.message : v, k && b && t(window, { fadeOut: 0 }), v && "string" != typeof v && (v.parentNode || v.jquery)) {
|
|
var y = v.jquery ? v[0] : v, m = {};
|
|
e(o).data("blockUI.history", m), m.el = y, m.parent = y.parentNode, m.display = y.style.display, m.position = y.style.position, m.parent && m.parent.removeChild(y);
|
|
}
|
|
e(o).data("blockUI.onUnblock", i.onUnblock);
|
|
var g, I, w, U, x = i.baseZ;
|
|
g = r || i.forceIframe ? e('<iframe class="blockUI" style="z-index:' + x++ + ';display:none;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0" src="' + i.iframeSrc + '"></iframe>') : e('<div class="blockUI" style="display:none"></div>'), I = i.theme ? e('<div class="blockUI blockOverlay ui-widget-overlay" style="z-index:' + x++ + ';display:none"></div>') : e('<div class="blockUI blockOverlay" style="z-index:' + x++ + ';display:none;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0"></div>'), i.theme && k ? (U = '<div class="blockUI ' + i.blockMsgClass + ' blockPage ui-dialog ui-widget ui-corner-all" style="z-index:' + (x + 10) + ';display:none;position:fixed">', i.title && (U += '<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">' + (i.title || " ") + "</div>"), U += '<div class="ui-widget-content ui-dialog-content"></div>', U += "</div>") : i.theme ? (U = '<div class="blockUI ' + i.blockMsgClass + ' blockElement ui-dialog ui-widget ui-corner-all" style="z-index:' + (x + 10) + ';display:none;position:absolute">', i.title && (U += '<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">' + (i.title || " ") + "</div>"), U += '<div class="ui-widget-content ui-dialog-content"></div>', U += "</div>") : U = k ? '<div class="blockUI ' + i.blockMsgClass + ' blockPage" style="z-index:' + (x + 10) + ';display:none;position:fixed"></div>' : '<div class="blockUI ' + i.blockMsgClass + ' blockElement" style="z-index:' + (x + 10) + ';display:none;position:absolute"></div>', w = e(U), v && (i.theme ? (w.css(h), w.addClass("ui-widget-content")) : w.css(s)), i.theme || I.css(i.overlayCSS), I.css("position", k ? "fixed" : "absolute"), (r || i.forceIframe) && g.css("opacity", 0);
|
|
var C = [g, I, w], S = k ? e("body") : e(o);
|
|
e.each(C, function () { this.appendTo(S); }), i.theme && i.draggable && e.fn.draggable && w.draggable({ handle: ".ui-dialog-titlebar", cancel: "li" });
|
|
var O = f && (!e.support.boxModel || e("object,embed", k ? null : o).length > 0);
|
|
if (u || O) {
|
|
if (k && i.allowBodyStretch && e.support.boxModel && e("html,body").css("height", "100%"), (u || !e.support.boxModel) && !k)
|
|
var E = d(o, "borderTopWidth"), T = d(o, "borderLeftWidth"), M = E ? "(0 - " + E + ")" : 0, B = T ? "(0 - " + T + ")" : 0;
|
|
e.each(C, function (e, o) { var t = o[0].style; if (t.position = "absolute", 2 > e)
|
|
k ? t.setExpression("height", "Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:" + i.quirksmodeOffsetHack + ') + "px"') : t.setExpression("height", 'this.parentNode.offsetHeight + "px"'), k ? t.setExpression("width", 'jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"') : t.setExpression("width", 'this.parentNode.offsetWidth + "px"'), B && t.setExpression("left", B), M && t.setExpression("top", M);
|
|
else if (i.centerY)
|
|
k && t.setExpression("top", '(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"'), t.marginTop = 0;
|
|
else if (!i.centerY && k) {
|
|
var n = i.css && i.css.top ? parseInt(i.css.top, 10) : 0, s = "((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + " + n + ') + "px"';
|
|
t.setExpression("top", s);
|
|
} });
|
|
}
|
|
if (v && (i.theme ? w.find(".ui-widget-content").append(v) : w.append(v), (v.jquery || v.nodeType) && e(v).show()), (r || i.forceIframe) && i.showOverlay && g.show(), i.fadeIn) {
|
|
var j = i.onBlock ? i.onBlock : c, H = i.showOverlay && !v ? j : c, z = v ? j : c;
|
|
i.showOverlay && I._fadeIn(i.fadeIn, H), v && w._fadeIn(i.fadeIn, z);
|
|
}
|
|
else
|
|
i.showOverlay && I.show(), v && w.show(), i.onBlock && i.onBlock.bind(w)();
|
|
if (n(1, o, i), k ? (b = w[0], p = e(i.focusableElements, b), i.focusInput && setTimeout(l, 20)) : a(w[0], i.centerX, i.centerY), i.timeout) {
|
|
var W = setTimeout(function () { k ? e.unblockUI(i) : e(o).unblock(i); }, i.timeout);
|
|
e(o).data("blockUI.timeout", W);
|
|
}
|
|
} } function t(o, t) { var s, l = o == window, a = e(o), d = a.data("blockUI.history"), c = a.data("blockUI.timeout"); c && (clearTimeout(c), a.removeData("blockUI.timeout")), t = e.extend({}, FlexUtils.blockUI.defaults, t || {}), n(0, o, t), null === t.onUnblock && (t.onUnblock = a.data("blockUI.onUnblock"), a.removeData("blockUI.onUnblock")); var r; r = l ? e("body").children().filter(".blockUI").add("body > .blockUI") : a.find(">.blockUI"), t.cursorReset && (r.length > 1 && (r[1].style.cursor = t.cursorReset), r.length > 2 && (r[2].style.cursor = t.cursorReset)), l && (b = p = null), t.fadeOut ? (s = r.length, r.stop().fadeOut(t.fadeOut, function () { 0 === --s && i(r, d, t, o); })) : i(r, d, t, o); } function i(o, t, i, n) { var s = e(n); if (!s.data("blockUI.isBlocked")) {
|
|
o.each(function () { this.parentNode && this.parentNode.removeChild(this); }), t && t.el && (t.el.style.display = t.display, t.el.style.position = t.position, t.el.style.cursor = "default", t.parent && t.parent.appendChild(t.el), s.removeData("blockUI.history")), s.data("blockUI.static") && s.css("position", "static"), "function" == typeof i.onUnblock && i.onUnblock(n, i);
|
|
var l = e(document.body), a = l.width(), d = l[0].style.width;
|
|
l.width(a - 1).width(a), l[0].style.width = d;
|
|
} } function n(o, t, i) { var n = t == window, l = e(t); if ((o || (!n || b) && (n || l.data("blockUI.isBlocked"))) && (l.data("blockUI.isBlocked", o), n && i.bindEvents && (!o || i.showOverlay))) {
|
|
var a = "mousedown mouseup keydown keypress keyup touchstart touchend touchmove";
|
|
o ? e(document).bind(a, i, s) : e(document).unbind(a, s);
|
|
} } function s(o) { if ("keydown" === o.type && o.keyCode && 9 == o.keyCode && b && o.data.constrainTabKey) {
|
|
var t = p, i = !o.shiftKey && o.target === t[t.length - 1], n = o.shiftKey && o.target === t[0];
|
|
if (i || n)
|
|
return setTimeout(function () { l(n); }, 10), !1;
|
|
} var s = o.data, a = e(o.target); return a.hasClass("blockOverlay") && s.onOverlayClick && s.onOverlayClick(o), a.parents("div." + s.blockMsgClass).length > 0 ? !0 : 0 === a.parents().children().filter("div.blockUI").length; } function l(e) { if (p) {
|
|
var o = p[e === !0 ? p.length - 1 : 0];
|
|
o && o.focus();
|
|
} } function a(e, o, t) { var i = e.parentNode, n = e.style, s = (i.offsetWidth - e.offsetWidth) / 2 - d(i, "borderLeftWidth"), l = (i.offsetHeight - e.offsetHeight) / 2 - d(i, "borderTopWidth"); o && (n.left = s > 0 ? s + "px" : "0"), t && (n.top = l > 0 ? l + "px" : "0"); } function d(o, t) { return parseInt(e.css(o, t), 10) || 0; } e.fn._fadeIn = e.fn.fadeIn; var c = e.noop || function () { }, r = /MSIE/.test(navigator.userAgent), u = /MSIE 6.0/.test(navigator.userAgent) && !/MSIE 8.0/.test(navigator.userAgent); document.documentMode || 0; var f = e.isFunction(document.createElement("div").style.setExpression); FlexUtils.blockUI = function (e) { o(window, e); }; FlexUtils.unblockUI = function (e) { t(window, e); }, e.growlUI = function (o, t, i, n) { var s = e('<div class="growlUI"></div>'); o && s.append("<h1>" + o + "</h1>"), t && s.append("<h2>" + t + "</h2>"), void 0 === i && (i = 3e3); var l = function (o) { o = o || {}, e.blockUI({ message: s, fadeIn: o.fadeIn !== void 0 ? o.fadeIn : 700, fadeOut: o.fadeOut !== void 0 ? o.fadeOut : 1e3, timeout: o.timeout !== void 0 ? o.timeout : i, centerY: !1, showOverlay: !1, onUnblock: n, css: FlexUtils.blockUI.defaults.growlCSS }); }; l(), s.css("opacity"), s.mouseover(function () { l({ fadeIn: 0, timeout: 3e4 }); var o = e(".blockMsg"); o.stop(), o.fadeTo(300, 1); }).mouseout(function () { e(".blockMsg").fadeOut(1e3); }); }, e.fn.block = function (t) { if (this[0] === window)
|
|
return e.blockUI(t), this; var i = e.extend({}, FlexUtils.blockUI.defaults, t || {}); return this.each(function () { var o = e(this); i.ignoreIfBlocked && o.data("blockUI.isBlocked") || o.unblock({ fadeOut: 0 }); }), this.each(function () { "static" == e.css(this, "position") && (this.style.position = "relative", e(this).data("blockUI.static", !0)), this.style.zoom = 1, o(this, t); }); }, e.fn.unblock = function (o) { return this[0] === window ? (e.unblockUI(o), this) : this.each(function () { t(this, o); }); }, FlexUtils.blockUI.version = 2.7, FlexUtils.blockUI.defaults = { message: "<h1>Please wait...</h1>", title: null, draggable: !0, theme: !1, css: { padding: 0, margin: 0, width: "30%", top: "40%", left: "35%", textAlign: "center", color: "#000", border: "3px solid #aaa", backgroundColor: "#fff", cursor: "wait" }, themedCSS: { width: "30%", top: "40%", left: "35%" }, overlayCSS: { backgroundColor: "#000", opacity: 0.6, cursor: "wait" }, cursorReset: "default", growlCSS: { width: "350px", top: "10px", left: "", right: "10px", border: "none", padding: "5px", opacity: 0.6, cursor: "default", color: "#fff", backgroundColor: "#000", "-webkit-border-radius": "10px", "-moz-border-radius": "10px", "border-radius": "10px" }, iframeSrc: /^https/i.test(window.location.href || "") ? "javascript:false" : "about:blank", forceIframe: !1, baseZ: 2e3, centerX: !0, centerY: !0, allowBodyStretch: !0, bindEvents: !0, constrainTabKey: !0, fadeIn: 200, fadeOut: 400, timeout: 0, showOverlay: !0, focusInput: !0, focusableElements: ":input:enabled:visible", onBlock: null, onUnblock: null, onOverlayClick: null, quirksmodeOffsetHack: 4, blockMsgClass: "blockMsg", ignoreIfBlocked: !1 }; var b = null, p = []; }
|
|
"function" == typeof define && define.amd && define.amd.jQuery ? define(["jquery"], e) : e(jQuery);
|
|
})();
|
|
/* jshint ignore:end */
|
|
})(jQuery);
|
|
|
|
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZsZXhVdGlscy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJGbGV4VXRpbHMuanMiLCJzb3VyY2VzQ29udGVudCI6W119
|