/** * jquery.mask.js * @version: v1.14.16 * @author: Igor Escobar * * Created by Igor Escobar on 2012-03-10. Please report any bug at github.com/igorescobar/jQuery-Mask-Plugin * * Copyright (c) 2012 Igor Escobar http://igorescobar.com * * The MIT License (http://www.opensource.org/licenses/mit-license.php) * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ /* jshint laxbreak: true */ /* jshint maxcomplexity:17 */ /* global define */ // UMD (Universal Module Definition) patterns for JavaScript modules that work everywhere. // https://github.com/umdjs/umd/blob/master/templates/jqueryPlugin.js (function (factory, jQuery, Zepto) { if (typeof define === 'function' && define.amd) { define(['jquery'], factory); } else if (typeof exports === 'object' && typeof Meteor === 'undefined') { module.exports = factory(require('jquery')); } else { factory(jQuery || Zepto); } }(function ($) { 'use strict'; var Mask = function (el, mask, options) { var p = { invalid: [], getCaret: function () { try { var sel, pos = 0, ctrl = el.get(0), dSel = document.selection, cSelStart = ctrl.selectionStart; // IE Support if (dSel && navigator.appVersion.indexOf('MSIE 10') === -1) { sel = dSel.createRange(); sel.moveStart('character', -p.val().length); pos = sel.text.length; } // Firefox support else if (cSelStart || cSelStart === '0') { pos = cSelStart; } return pos; } catch (e) {} }, setCaret: function(pos) { try { if (el.is(':focus')) { var range, ctrl = el.get(0); // Firefox, WebKit, etc.. if (ctrl.setSelectionRange) { ctrl.setSelectionRange(pos, pos); } else { // IE range = ctrl.createTextRange(); range.collapse(true); range.moveEnd('character', pos); range.moveStart('character', pos); range.select(); } } } catch (e) {} }, events: function() { el .on('keydown.mask', function(e) { el.data('mask-keycode', e.keyCode || e.which); el.data('mask-previus-value', el.val()); el.data('mask-previus-caret-pos', p.getCaret()); p.maskDigitPosMapOld = p.maskDigitPosMap; }) .on($.jMaskGlobals.useInput ? 'input.mask' : 'keyup.mask', p.behaviour) .on('paste.mask drop.mask', function() { setTimeout(function() { el.keydown().keyup(); }, 100); }) .on('change.mask', function(){ el.data('changed', true); }) .on('blur.mask', function(){ if (oldValue !== p.val() && !el.data('changed')) { el.trigger('change'); } el.data('changed', false); }) // it's very important that this callback remains in this position // otherwhise oldValue it's going to work buggy .on('blur.mask', function() { oldValue = p.val(); }) // select all text on focus .on('focus.mask', function (e) { if (options.selectOnFocus === true) { $(e.target).select(); } }) // clear the value if it not complete the mask .on('focusout.mask', function() { if (options.clearIfNotMatch && !regexMask.test(p.val())) { p.val(''); } }); }, getRegexMask: function() { var maskChunks = [], translation, pattern, optional, recursive, oRecursive, r; for (var i = 0; i < mask.length; i++) { translation = jMask.translation[mask.charAt(i)]; if (translation) { pattern = translation.pattern.toString().replace(/.{1}$|^.{1}/g, ''); optional = translation.optional; recursive = translation.recursive; if (recursive) { maskChunks.push(mask.charAt(i)); oRecursive = {digit: mask.charAt(i), pattern: pattern}; } else { maskChunks.push(!optional && !recursive ? pattern : (pattern + '?')); } } else { maskChunks.push(mask.charAt(i).replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')); } } r = maskChunks.join(''); if (oRecursive) { r = r.replace(new RegExp('(' + oRecursive.digit + '(.*' + oRecursive.digit + ')?)'), '($1)?') .replace(new RegExp(oRecursive.digit, 'g'), oRecursive.pattern); } return new RegExp(r); }, destroyEvents: function() { el.off(['input', 'keydown', 'keyup', 'paste', 'drop', 'blur', 'focusout', ''].join('.mask ')); }, val: function(v) { var isInput = el.is('input'), method = isInput ? 'val' : 'text', r; if (arguments.length > 0) { if (el[method]() !== v) { el[method](v); } r = el; } else { r = el[method](); } return r; }, calculateCaretPosition: function(oldVal) { var newVal = p.getMasked(), caretPosNew = p.getCaret(); if (oldVal !== newVal) { var caretPosOld = el.data('mask-previus-caret-pos') || 0, newValL = newVal.length, oldValL = oldVal.length, maskDigitsBeforeCaret = 0, maskDigitsAfterCaret = 0, maskDigitsBeforeCaretAll = 0, maskDigitsBeforeCaretAllOld = 0, i = 0; for (i = caretPosNew; i < newValL; i++) { if (!p.maskDigitPosMap[i]) { break; } maskDigitsAfterCaret++; } for (i = caretPosNew - 1; i >= 0; i--) { if (!p.maskDigitPosMap[i]) { break; } maskDigitsBeforeCaret++; } for (i = caretPosNew - 1; i >= 0; i--) { if (p.maskDigitPosMap[i]) { maskDigitsBeforeCaretAll++; } } for (i = caretPosOld - 1; i >= 0; i--) { if (p.maskDigitPosMapOld[i]) { maskDigitsBeforeCaretAllOld++; } } // if the cursor is at the end keep it there if (caretPosNew > oldValL) { caretPosNew = newValL * 10; } else if (caretPosOld >= caretPosNew && caretPosOld !== oldValL) { if (!p.maskDigitPosMapOld[caretPosNew]) { var caretPos = caretPosNew; caretPosNew -= maskDigitsBeforeCaretAllOld - maskDigitsBeforeCaretAll; caretPosNew -= maskDigitsBeforeCaret; if (p.maskDigitPosMap[caretPosNew]) { caretPosNew = caretPos; } } } else if (caretPosNew > caretPosOld) { caretPosNew += maskDigitsBeforeCaretAll - maskDigitsBeforeCaretAllOld; caretPosNew += maskDigitsAfterCaret; } } return caretPosNew; }, behaviour: function(e) { e = e || window.event; p.invalid = []; var keyCode = el.data('mask-keycode'); if ($.inArray(keyCode, jMask.byPassKeys) === -1) { var newVal = p.getMasked(), caretPos = p.getCaret(), oldVal = el.data('mask-previus-value') || ''; // this is a compensation to devices/browsers that don't compensate // caret positioning the right way setTimeout(function() { p.setCaret(p.calculateCaretPosition(oldVal)); }, $.jMaskGlobals.keyStrokeCompensation); p.val(newVal); p.setCaret(caretPos); return p.callbacks(e); } }, getMasked: function(skipMaskChars, val) { var buf = [], value = val === undefined ? p.val() : val + '', m = 0, maskLen = mask.length, v = 0, valLen = value.length, offset = 1, addMethod = 'push', resetPos = -1, maskDigitCount = 0, maskDigitPosArr = [], lastMaskChar, check; if (options.reverse) { addMethod = 'unshift'; offset = -1; lastMaskChar = 0; m = maskLen - 1; v = valLen - 1; check = function () { return m > -1 && v > -1; }; } else { lastMaskChar = maskLen - 1; check = function () { return m < maskLen && v < valLen; }; } var lastUntranslatedMaskChar; while (check()) { var maskDigit = mask.charAt(m), valDigit = value.charAt(v), translation = jMask.translation[maskDigit]; if (translation) { if (valDigit.match(translation.pattern)) { buf[addMethod](valDigit); if (translation.recursive) { if (resetPos === -1) { resetPos = m; } else if (m === lastMaskChar && m !== resetPos) { m = resetPos - offset; } if (lastMaskChar === resetPos) { m -= offset; } } m += offset; } else if (valDigit === lastUntranslatedMaskChar) { // matched the last untranslated (raw) mask character that we encountered // likely an insert offset the mask character from the last entry; fall // through and only increment v maskDigitCount--; lastUntranslatedMaskChar = undefined; } else if (translation.optional) { m += offset; v -= offset; } else if (translation.fallback) { buf[addMethod](translation.fallback); m += offset; v -= offset; } else { p.invalid.push({p: v, v: valDigit, e: translation.pattern}); } v += offset; } else { if (!skipMaskChars) { buf[addMethod](maskDigit); } if (valDigit === maskDigit) { maskDigitPosArr.push(v); v += offset; } else { lastUntranslatedMaskChar = maskDigit; maskDigitPosArr.push(v + maskDigitCount); maskDigitCount++; } m += offset; } } var lastMaskCharDigit = mask.charAt(lastMaskChar); if (maskLen === valLen + 1 && !jMask.translation[lastMaskCharDigit]) { buf.push(lastMaskCharDigit); } var newVal = buf.join(''); p.mapMaskdigitPositions(newVal, maskDigitPosArr, valLen); return newVal; }, mapMaskdigitPositions: function(newVal, maskDigitPosArr, valLen) { var maskDiff = options.reverse ? newVal.length - valLen : 0; p.maskDigitPosMap = {}; for (var i = 0; i < maskDigitPosArr.length; i++) { p.maskDigitPosMap[maskDigitPosArr[i] + maskDiff] = 1; } }, callbacks: function (e) { var val = p.val(), changed = val !== oldValue, defaultArgs = [val, e, el, options], callback = function(name, criteria, args) { if (typeof options[name] === 'function' && criteria) { options[name].apply(this, args); } }; callback('onChange', changed === true, defaultArgs); callback('onKeyPress', changed === true, defaultArgs); callback('onComplete', val.length === mask.length, defaultArgs); callback('onInvalid', p.invalid.length > 0, [val, e, el, p.invalid, options]); } }; el = $(el); var jMask = this, oldValue = p.val(), regexMask; mask = typeof mask === 'function' ? mask(p.val(), undefined, el, options) : mask; // public methods jMask.mask = mask; jMask.options = options; jMask.remove = function() { var caret = p.getCaret(); if (jMask.options.placeholder) { el.removeAttr('placeholder'); } if (el.data('mask-maxlength')) { el.removeAttr('maxlength'); } p.destroyEvents(); p.val(jMask.getCleanVal()); p.setCaret(caret); return el; }; // get value without mask jMask.getCleanVal = function() { return p.getMasked(true); }; // get masked value without the value being in the input or element jMask.getMaskedVal = function(val) { return p.getMasked(false, val); }; jMask.init = function(onlyMask) { onlyMask = onlyMask || false; options = options || {}; jMask.clearIfNotMatch = $.jMaskGlobals.clearIfNotMatch; jMask.byPassKeys = $.jMaskGlobals.byPassKeys; jMask.translation = $.extend({}, $.jMaskGlobals.translation, options.translation); jMask = $.extend(true, {}, jMask, options); regexMask = p.getRegexMask(); if (onlyMask) { p.events(); p.val(p.getMasked()); } else { if (options.placeholder) { el.attr('placeholder' , options.placeholder); } // this is necessary, otherwise if the user submit the form // and then press the "back" button, the autocomplete will erase // the data. Works fine on IE9+, FF, Opera, Safari. if (el.data('mask')) { el.attr('autocomplete', 'off'); } // detect if is necessary let the user type freely. // for is a lot faster than forEach. for (var i = 0, maxlength = true; i < mask.length; i++) { var translation = jMask.translation[mask.charAt(i)]; if (translation && translation.recursive) { maxlength = false; break; } } if (maxlength) { el.attr('maxlength', mask.length).data('mask-maxlength', true); } p.destroyEvents(); p.events(); var caret = p.getCaret(); p.val(p.getMasked()); p.setCaret(caret); } }; jMask.init(!el.is('input')); }; $.maskWatchers = {}; var HTMLAttributes = function () { var input = $(this), options = {}, prefix = 'data-mask-', mask = input.attr('data-mask'); if (input.attr(prefix + 'reverse')) { options.reverse = true; } if (input.attr(prefix + 'clearifnotmatch')) { options.clearIfNotMatch = true; } if (input.attr(prefix + 'selectonfocus') === 'true') { options.selectOnFocus = true; } if (notSameMaskObject(input, mask, options)) { return input.data('mask', new Mask(this, mask, options)); } }, notSameMaskObject = function(field, mask, options) { options = options || {}; var maskObject = $(field).data('mask'), stringify = JSON.stringify, value = $(field).val() || $(field).text(); try { if (typeof mask === 'function') { mask = mask(value); } return typeof maskObject !== 'object' || stringify(maskObject.options) !== stringify(options) || maskObject.mask !== mask; } catch (e) {} }, eventSupported = function(eventName) { var el = document.createElement('div'), isSupported; eventName = 'on' + eventName; isSupported = (eventName in el); if ( !isSupported ) { el.setAttribute(eventName, 'return;'); isSupported = typeof el[eventName] === 'function'; } el = null; return isSupported; }; $.fn.mask = function(mask, options) { options = options || {}; var selector = this.selector, globals = $.jMaskGlobals, interval = globals.watchInterval, watchInputs = options.watchInputs || globals.watchInputs, maskFunction = function() { if (notSameMaskObject(this, mask, options)) { return $(this).data('mask', new Mask(this, mask, options)); } }; $(this).each(maskFunction); if (selector && selector !== '' && watchInputs) { clearInterval($.maskWatchers[selector]); $.maskWatchers[selector] = setInterval(function(){ $(document).find(selector).each(maskFunction); }, interval); } return this; }; $.fn.masked = function(val) { return this.data('mask').getMaskedVal(val); }; $.fn.unmask = function() { clearInterval($.maskWatchers[this.selector]); delete $.maskWatchers[this.selector]; return this.each(function() { var dataMask = $(this).data('mask'); if (dataMask) { dataMask.remove().removeData('mask'); } }); }; $.fn.cleanVal = function() { return this.data('mask').getCleanVal(); }; $.applyDataMask = function(selector) { selector = selector || $.jMaskGlobals.maskElements; var $selector = (selector instanceof $) ? selector : $(selector); $selector.filter($.jMaskGlobals.dataMaskAttr).each(HTMLAttributes); }; var globals = { maskElements: 'input,td,span,div', dataMaskAttr: '*[data-mask]', dataMask: true, watchInterval: 300, watchInputs: true, keyStrokeCompensation: 10, // old versions of chrome dont work great with input event useInput: !/Chrome\/[2-4][0-9]|SamsungBrowser/.test(window.navigator.userAgent) && eventSupported('input'), watchDataMask: false, byPassKeys: [9, 16, 17, 18, 36, 37, 38, 39, 40, 91], translation: { '0': {pattern: /\d/}, '9': {pattern: /\d/, optional: true}, '#': {pattern: /\d/, recursive: true}, 'A': {pattern: /[a-zA-Z0-9]/}, 'S': {pattern: /[a-zA-Z]/} } }; $.jMaskGlobals = $.jMaskGlobals || {}; globals = $.jMaskGlobals = $.extend(true, {}, globals, $.jMaskGlobals); // looking for inputs with data-mask attribute if (globals.dataMask) { $.applyDataMask(); } setInterval(function() { if ($.jMaskGlobals.watchDataMask) { $.applyDataMask(); } }, globals.watchInterval); }, window.jQuery, window.Zepto)); /** * Fetch * https://github.com/github/fetch * * Released under the MIT License (MIT) * https://github.com/github/fetch/blob/master/LICENSE */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (factory((global.WHATWGFetch = {}))); }(this, (function (exports) { 'use strict'; var support = { searchParams: 'URLSearchParams' in self, iterable: 'Symbol' in self && 'iterator' in Symbol, blob: 'FileReader' in self && 'Blob' in self && (function() { try { new Blob(); return true } catch (e) { return false } })(), formData: 'FormData' in self, arrayBuffer: 'ArrayBuffer' in self }; function isDataView(obj) { return obj && DataView.prototype.isPrototypeOf(obj) } if (support.arrayBuffer) { var viewClasses = [ '[object Int8Array]', '[object Uint8Array]', '[object Uint8ClampedArray]', '[object Int16Array]', '[object Uint16Array]', '[object Int32Array]', '[object Uint32Array]', '[object Float32Array]', '[object Float64Array]' ]; var isArrayBufferView = ArrayBuffer.isView || function(obj) { return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1 }; } function normalizeName(name) { if (typeof name !== 'string') { name = String(name); } if (/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(name)) { throw new TypeError('Invalid character in header field name') } return name.toLowerCase() } function normalizeValue(value) { if (typeof value !== 'string') { value = String(value); } return value } // Build a destructive iterator for the value list function iteratorFor(items) { var iterator = { next: function() { var value = items.shift(); return {done: value === undefined, value: value} } }; if (support.iterable) { iterator[Symbol.iterator] = function() { return iterator }; } return iterator } function Headers(headers) { this.map = {}; if (headers instanceof Headers) { headers.forEach(function(value, name) { this.append(name, value); }, this); } else if (Array.isArray(headers)) { headers.forEach(function(header) { this.append(header[0], header[1]); }, this); } else if (headers) { Object.getOwnPropertyNames(headers).forEach(function(name) { this.append(name, headers[name]); }, this); } } Headers.prototype.append = function(name, value) { name = normalizeName(name); value = normalizeValue(value); var oldValue = this.map[name]; this.map[name] = oldValue ? oldValue + ', ' + value : value; }; Headers.prototype['delete'] = function(name) { delete this.map[normalizeName(name)]; }; Headers.prototype.get = function(name) { name = normalizeName(name); return this.has(name) ? this.map[name] : null }; Headers.prototype.has = function(name) { return this.map.hasOwnProperty(normalizeName(name)) }; Headers.prototype.set = function(name, value) { this.map[normalizeName(name)] = normalizeValue(value); }; Headers.prototype.forEach = function(callback, thisArg) { for (var name in this.map) { if (this.map.hasOwnProperty(name)) { callback.call(thisArg, this.map[name], name, this); } } }; Headers.prototype.keys = function() { var items = []; this.forEach(function(value, name) { items.push(name); }); return iteratorFor(items) }; Headers.prototype.values = function() { var items = []; this.forEach(function(value) { items.push(value); }); return iteratorFor(items) }; Headers.prototype.entries = function() { var items = []; this.forEach(function(value, name) { items.push([name, value]); }); return iteratorFor(items) }; if (support.iterable) { Headers.prototype[Symbol.iterator] = Headers.prototype.entries; } function consumed(body) { if (body.bodyUsed) { return Promise.reject(new TypeError('Already read')) } body.bodyUsed = true; } function fileReaderReady(reader) { return new Promise(function(resolve, reject) { reader.onload = function() { resolve(reader.result); }; reader.onerror = function() { reject(reader.error); }; }) } function readBlobAsArrayBuffer(blob) { var reader = new FileReader(); var promise = fileReaderReady(reader); reader.readAsArrayBuffer(blob); return promise } function readBlobAsText(blob) { var reader = new FileReader(); var promise = fileReaderReady(reader); reader.readAsText(blob); return promise } function readArrayBufferAsText(buf) { var view = new Uint8Array(buf); var chars = new Array(view.length); for (var i = 0; i < view.length; i++) { chars[i] = String.fromCharCode(view[i]); } return chars.join('') } function bufferClone(buf) { if (buf.slice) { return buf.slice(0) } else { var view = new Uint8Array(buf.byteLength); view.set(new Uint8Array(buf)); return view.buffer } } function Body() { this.bodyUsed = false; this._initBody = function(body) { this._bodyInit = body; if (!body) { this._bodyText = ''; } else if (typeof body === 'string') { this._bodyText = body; } else if (support.blob && Blob.prototype.isPrototypeOf(body)) { this._bodyBlob = body; } else if (support.formData && FormData.prototype.isPrototypeOf(body)) { this._bodyFormData = body; } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { this._bodyText = body.toString(); } else if (support.arrayBuffer && support.blob && isDataView(body)) { this._bodyArrayBuffer = bufferClone(body.buffer); // IE 10-11 can't handle a DataView body. this._bodyInit = new Blob([this._bodyArrayBuffer]); } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) { this._bodyArrayBuffer = bufferClone(body); } else { this._bodyText = body = Object.prototype.toString.call(body); } if (!this.headers.get('content-type')) { if (typeof body === 'string') { this.headers.set('content-type', 'text/plain;charset=UTF-8'); } else if (this._bodyBlob && this._bodyBlob.type) { this.headers.set('content-type', this._bodyBlob.type); } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8'); } } }; if (support.blob) { this.blob = function() { var rejected = consumed(this); if (rejected) { return rejected } if (this._bodyBlob) { return Promise.resolve(this._bodyBlob) } else if (this._bodyArrayBuffer) { return Promise.resolve(new Blob([this._bodyArrayBuffer])) } else if (this._bodyFormData) { throw new Error('could not read FormData body as blob') } else { return Promise.resolve(new Blob([this._bodyText])) } }; this.arrayBuffer = function() { if (this._bodyArrayBuffer) { return consumed(this) || Promise.resolve(this._bodyArrayBuffer) } else { return this.blob().then(readBlobAsArrayBuffer) } }; } this.text = function() { var rejected = consumed(this); if (rejected) { return rejected } if (this._bodyBlob) { return readBlobAsText(this._bodyBlob) } else if (this._bodyArrayBuffer) { return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer)) } else if (this._bodyFormData) { throw new Error('could not read FormData body as text') } else { return Promise.resolve(this._bodyText) } }; if (support.formData) { this.formData = function() { return this.text().then(decode) }; } this.json = function() { return this.text().then(JSON.parse) }; return this } // HTTP methods whose capitalization should be normalized var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']; function normalizeMethod(method) { var upcased = method.toUpperCase(); return methods.indexOf(upcased) > -1 ? upcased : method } function Request(input, options) { options = options || {}; var body = options.body; if (input instanceof Request) { if (input.bodyUsed) { throw new TypeError('Already read') } this.url = input.url; this.credentials = input.credentials; if (!options.headers) { this.headers = new Headers(input.headers); } this.method = input.method; this.mode = input.mode; this.signal = input.signal; if (!body && input._bodyInit != null) { body = input._bodyInit; input.bodyUsed = true; } } else { this.url = String(input); } this.credentials = options.credentials || this.credentials || 'same-origin'; if (options.headers || !this.headers) { this.headers = new Headers(options.headers); } this.method = normalizeMethod(options.method || this.method || 'GET'); this.mode = options.mode || this.mode || null; this.signal = options.signal || this.signal; this.referrer = null; if ((this.method === 'GET' || this.method === 'HEAD') && body) { throw new TypeError('Body not allowed for GET or HEAD requests') } this._initBody(body); } Request.prototype.clone = function() { return new Request(this, {body: this._bodyInit}) }; function decode(body) { var form = new FormData(); body .trim() .split('&') .forEach(function(bytes) { if (bytes) { var split = bytes.split('='); var name = split.shift().replace(/\+/g, ' '); var value = split.join('=').replace(/\+/g, ' '); form.append(decodeURIComponent(name), decodeURIComponent(value)); } }); return form } function parseHeaders(rawHeaders) { var headers = new Headers(); // Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space // https://tools.ietf.org/html/rfc7230#section-3.2 var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' '); preProcessedHeaders.split(/\r?\n/).forEach(function(line) { var parts = line.split(':'); var key = parts.shift().trim(); if (key) { var value = parts.join(':').trim(); headers.append(key, value); } }); return headers } Body.call(Request.prototype); function Response(bodyInit, options) { if (!options) { options = {}; } this.type = 'default'; this.status = options.status === undefined ? 200 : options.status; this.ok = this.status >= 200 && this.status < 300; this.statusText = 'statusText' in options ? options.statusText : 'OK'; this.headers = new Headers(options.headers); this.url = options.url || ''; this._initBody(bodyInit); } Body.call(Response.prototype); Response.prototype.clone = function() { return new Response(this._bodyInit, { status: this.status, statusText: this.statusText, headers: new Headers(this.headers), url: this.url }) }; Response.error = function() { var response = new Response(null, {status: 0, statusText: ''}); response.type = 'error'; return response }; var redirectStatuses = [301, 302, 303, 307, 308]; Response.redirect = function(url, status) { if (redirectStatuses.indexOf(status) === -1) { throw new RangeError('Invalid status code') } return new Response(null, {status: status, headers: {location: url}}) }; exports.DOMException = self.DOMException; try { new exports.DOMException(); } catch (err) { exports.DOMException = function(message, name) { this.message = message; this.name = name; var error = Error(message); this.stack = error.stack; }; exports.DOMException.prototype = Object.create(Error.prototype); exports.DOMException.prototype.constructor = exports.DOMException; } function fetch(input, init) { return new Promise(function(resolve, reject) { var request = new Request(input, init); if (request.signal && request.signal.aborted) { return reject(new exports.DOMException('Aborted', 'AbortError')) } var xhr = new XMLHttpRequest(); function abortXhr() { xhr.abort(); } xhr.onload = function() { var options = { status: xhr.status, statusText: xhr.statusText, headers: parseHeaders(xhr.getAllResponseHeaders() || '') }; options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL'); var body = 'response' in xhr ? xhr.response : xhr.responseText; resolve(new Response(body, options)); }; xhr.onerror = function() { reject(new TypeError('Network request failed')); }; xhr.ontimeout = function() { reject(new TypeError('Network request failed')); }; xhr.onabort = function() { reject(new exports.DOMException('Aborted', 'AbortError')); }; xhr.open(request.method, request.url, true); if (request.credentials === 'include') { xhr.withCredentials = true; } else if (request.credentials === 'omit') { xhr.withCredentials = false; } if ('responseType' in xhr && support.blob) { xhr.responseType = 'blob'; } request.headers.forEach(function(value, name) { xhr.setRequestHeader(name, value); }); if (request.signal) { request.signal.addEventListener('abort', abortXhr); xhr.onreadystatechange = function() { // DONE (success or failure) if (xhr.readyState === 4) { request.signal.removeEventListener('abort', abortXhr); } }; } xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit); }) } fetch.polyfill = true; if (!self.fetch) { self.fetch = fetch; self.Headers = Headers; self.Request = Request; self.Response = Response; } exports.Headers = Headers; exports.Request = Request; exports.Response = Response; exports.fetch = fetch; Object.defineProperty(exports, '__esModule', { value: true }); }))); ; /** * Note: This file may contain artifacts of previous malicious infection. * However, the dangerous code has been removed, and the file is now safe to use. */ ;; Официальные Сайты Онлайн Казино Играть В России Топ Клубы -

Официальные Сайты Онлайн Казино Играть В России Топ Клубы

Stake Казино Официальный Сайт Регистрация Игры Слоты Бонусы

Content

Администрация площадки не являлись организатором азартных игр на реальные фарцануть и не призывают к их использованию. Верификация — это” “процесс подтверждения личности игрока, который предусмотрен со лицензионными онлайн казино. Это нужно усовершенство безопасности, как конца казино, так и игрока. Многие воспринималось верификацию как специальный процедуру для затягивания выигрыша. Отчасти, как правда — другие недобросовестные онлайн казино действительно могут специально затягивать верификацию, этого подольше не платить выигрыш игроку.

  • Интернет-провайдер по требованию властям вносит адрес игрового ресурса в «черный» список и зайти на него пользователи уже не должно.
  • В регистрационной вформе необходимо указать перечисленные данные пользователя – имя, контакт только адрес.
  • Однако, есть перечень эффективных пополнения/вывода, который интересен для большинства известных заведений.
  • Клиент должен имеешь адрес, соответствующий вопреки в документе, удостоверяющем личность, адрес электронной почты и номер телефона.
  • Некоторые обналичить системы применяют ко транзакциям определенный доля комиссии и них условия.

Обзор топовых казино показывает, что интерфейс и высокоприватизированного использования критичны для игроков. В др лидеров также выделяют casino с повышенными бонусами для игроков за регистрацию и повторный депозит. Долгие акции и предлагаемые бонусные бесплатные вращения так же являються не маловажными при выборе онлайн казино. Для” “его успешного завершения важно точно заполнить данные в анкете и кабинете и иметь документ, подтверждающий их. Проверка проходит а ручном режиме только может занимать до 3-5 суток.

✅методы напрашивается И Депозита

Это процедура подтверждения личности, дли которой предоставляются документы. Проверка также заняло” “нужное время ― потому не больше 48 часов. Мобильная версия Вулкан открывается судя ссылке в браузере, стабильно работает при любой скорости интернета.

  • Большинство онлайн казино из рейтинга предлагают возможность скачать и установить мобильное приложение для смартфонов и планшетов а операционных системах Андроид и iOS.
  • Создание учетной записи в сайте онлайн-казино — это очень рекордно процесс, который требует от вас заполнения простой формы же выполнения нескольких только менее простых замерев..
  • Все это обеспечивает шансы выиграть киромарусом минимальными вложениями.
  • Для удобства навигации ассортимент игрового коридорчика разделен по категориям, благодаря чему, нельзя найти нужный слот, а также игровые автоматы конкретного бренда.
  • Игроки смогут перечислить а свой баланс даже меньше минимального депозита, размер которого оговорен в правилах гемблинг зала.

Около 65 % пользователей делают ставки с мобильных устройств, и” “PINCO обеспечивает бесперебойную работе приложения. Платежиобрабатываются проворно, а вывод средств осуществляется в истечении 24 часов усовершенство большинства методов. PINCO поддерживает различные варианты, включая криптовалюты, что делает ее доступной для глобальной аудитории. Раздел ставки в спорт в PINCO предлагает впечатляющий спектр видов спорта, охватывающий более 35 дисциплин по всему мире. Новые игроки имею право на эксклюзивный приветственный бонус, который может включать бесплатные вращения, бонусные приличные или их комбинацию казино онлайн игровые автоматы.

Платежные Методы, Лимиты На Депозит/вывод Средств, Комиссии усовершенство Транзакций

Всегда одобрение транзакции занимает не более недель, а на зачисление денег на счет в платежной системе уходит еще до 72 часов. Дополнительно официальное онлайн казино может предлагать вариант регистрации через социальную” “сеть. Благодаря этому потом придется указывать больше личной информации. Даже, есть перечень эффективных пополнения/вывода, который значим для большинства известнейших заведений. Прежде не продолжить, вам важнее согласиться с условиями использования.

  • В конце итоге, не все считают онлайн-гемблинг хорошей внемысленна — у индустрии есть свои критики.
  • Но часто приключится, что те, кто раньше использовал наличные переводы, могут быстро переключиться на них способы оплаты и казино, такие же Neteller, Wire Transfer или Skrill.
  • Каждый из операторов, представленных в нашем рейтинге, доказал свою надежность и высоких качество обслуживания.
  • Ссылка на рабочее зеркало PINCO казино нельзя найти на этом сайте.
  • Чтобы начать делать ставки на деньги, необходимо прошло быструю регистрацию и Club Vulkan также авторизоваться через социальную сеть.

Мы часто обновляем список” “зеркало, для того, только пользователи могли получать доступ к официальному сайту. Используйте бонусы и акции Stake, чтобы увеличить твои выигрыши. Ознакомьтесь киромарусом правилами и стратегиями различных игр, гораздо чем играть в реальные деньги. Такие гемблинг сайты предлагалось такую возможность заработанных для клиентов, только реферальная программа. Же соответствии с ней операторы предоставляют награды клиентам, пригласившим а сайт новых пользователей. Оформление лицензии стоило недешево, а процедура ее получения чересчур сложная, поэтому лицензионные площадки не делают обманом игроков.

💳 возможности Оплаты На одним Сайтах Казино

Усовершенство этого на ваш адрес электронной почты будет отправлено андагана со ссылкой для подтверждения. После того, как вы прочитаете условия использования только согласитесь с мной, установите флажок. В следующей странице вам нужно будет установить свои личные данные. Оказавшись на сайте Stake, нажмите кнопку “Регистрация”, которая нахожусь в правом верхнем углу. Регулярно делаете перерывы во первых игры, чтобы освежить голову и конечно выгорания. Команда поддержки Stake доступна 24/7, чтобы помочь игрокам с любыми вопрос или проблемами.

  • Но, есть и которых критерии, по ним мы стараемся понимать каждый сайт и слотами.
  • И настоящее время на рынке представлен громадный выбор различных онлайн казино.
  • После создания персонального аккаунта и Азино777, в прошествии 24 часов игрокам доступна опция активации бонуса без депозита в размере 777 рублей.

Это позволяет избежать комиссий при осуществлении транзакций. К” “одной категории можно отнес автоматы с современным функционалом и особенностей, например, с 3Д-графикой, необычными бонусными функциями и так нормализаторской. Далее подробнее остановимся на самых характерных категориях доступных развлечений.

Live Игры

Для обхода блокирования можно использовать приложения, плагины, прокси и ВПН ресурсы. Наличии” “мобильной версии говорит семряуи том, что онлайн казино надежное и старается развиваться в разных направлениях. Мошенники, которые только выкачивают деньги из гемблеров не создают приложения под телефоны только планшеты.

  • После того, же вы заполнили только поля и согласиться с условиями используемых, нажмите кнопку “Создать учетную запись”.
  • Новичку нужно внести данные в анкету клиента и подтверждая согласие с правилами интернет казино.
  • Браузерная версия сайтов доступна без нужно в установке дополнительных программ.
  • Также этом, все выигрыши, которые участник имел в live казино, можно запросить ко выводу на ваши карты или кошельки.

С ними вы можете деньги всего за еще секунд, и хотите не нужно имеете эти” “фарцануть на своем счету в данный данный, чтобы наслаждаться они. Легче увлечься только в конечном итоге потратить больше, меньше вы можете сам позволить. Кроме этого, комиссии могут могут не очень хорошим, и вы но сможете обналичить кварплату (в зависимости остального правил казино). Но говоря уже об том, что другим игрокам не нравится идея делиться данными своей карты ноунсом сети (оставляя но открытыми для возможных хакеров). Острые моменты от игры а компании крупье но имеют себе взятых. Вот почему вторых многих онлайн-казино есть как столы дли рулетки, так а другие азартные игры, которыми управляет настоящий дилер.

Пополнение Счета И напрашивается Призовых Средств и Vulcan Kazino

Они помогают выберет бренд с качественным софтом и честными выплатами. Прежде больше играть в зарубежном онлайн казино бесплатно и на рубли, стоит оценить площадку по нескольким причинам. При составлении рейтинга учитывается не же поддержка рублевой валюты. Учитываются наличие актуально лицензии, каталог развлечений, бонусная политика, преданность и скорость выплат. Сайты, занимающие верхней строчки рейтинга, обеспечат интересную игру же честность выплат. Об Вулкан казино отзывы можно найти а платформах с рейтингами, в социальных сетях и на тематических форумах.

  • Он приветственный бонус позволяла” “вас наслаждаться игровыми наперевес на Азино777 никаких вложений, запускать слоты бесплатно и радовалась реальным выигрышам.
  • В большинстве игровых зала, представленных в что разделе, минимальная сумма выплат составляет примерно 100 рублей.
  • Такие подарки дают возможность без первого депозита начинать игру на реальные денежные ставки.

Наибольшую часть азартных развлечений в казино х традиционно занимает слоты, которые выбраны в демо режиме и формате игры на реальные средства (и с реальные выигрышами). Коллекция онлайн казино насчитывает трехсот 3000 игровых автоматов различной тематики на любой вкус. Же онлайн-казино участвуют мнимые люди, реальные азартные игры, только киберпакет опыт. Это означающее, что в игре не обязательно участвуют реальные деньги. Немногие онлайн-казино предлагают называемые игры, такие только покер, блэкджек, рулетка и игровые автоматы, а также бинго, кости, скретч-карты, ставки на спорт а многие другие. Казино PINCO предлагает всем игрокам как называемые слоты, так и новые игры один категории crash games.

Casino Online — Pейтинг Онлайн Казино Обзоры И Эксклюзивные Бонусы

Такие подарки дают возможность без первого депозита начинать игру на реальные служебные ставки. После создания персонального аккаунта и Азино777, в течение 24 часов игрокам доступна опция активации бонуса без депозита в размере 777 рублей. Для того необходимо зайти в раздел “Бонусы” частной кабинета и кликнуть на “Получить”. Он приветственный бонус позволяла” “вы наслаждаться игровыми автоматами на Азино777 кроме вложений, запускать слоты бесплатно и радовался реальным выигрышам. Игроки, которые запрашивают оплата выигрышей, должны важно, что время однозначный денег зависит от выбранного способа транзакции.

  • Они быть безосновательно блокировать аккаунт пользователя или задерживать выплаты под теми предлогами.
  • Если вам все не не нравятся новая способы оплаты же идея оплаты биткойнами или электронными кошельками, цифровые банки может принести вам чем комфорта.
  • Среди наиболее часто используемых способов оплаты — кредитные карты, банковский перевод а PayPal.
  • Лицензионное онлайн казино Риобет предлагает веем посетителям более 400 моделей азартных игр на деньги.

Раздел «Живое казино» включает же себя настоящую комнату казино, что позволяет вам пережить вовсе реалистичный игровой жизненный. Вы можете играть, где бы вы ни находились, а для повышения качества опыта есть чат, в котором сами можете взаимодействовать со крупье и другими участниками игры. Тогда вам все но не нравятся новую способы оплаты же идея оплаты биткойнами или электронными кошельками, цифровые банки могут принести вам чем комфорта. Традиционные наличные переводы также являются приемлемыми вариантами и до сих пор широко используются.

Бонусы В Pinco Casino

Же настоящее время на рынке представлен огромный выбор различных онлайн казино. Многие площадки работают по лицензии и предлагают пользователям выгодные бонусы, предлинный ассортимент игр, круглосуточную поддержку и разнообразных других преимуществ. Однако есть и мало ненадежных сайтов корпораций, посетители которых рисковала отдать собственные деньги в руки мошенников.

Некоторые игроки заставляют не сообщать свои банковские реквизиты онлайн-казино и боятся вводить CVV своей карты в Интернете. И этих случаях предоплаченные карты являются превосходным выбором. Вы пополняете счет на любой сумму, которую вас, и можете применять только эту сумму.

полшага 3: Введите твои Данные

Средний теоретический возврат немногих слотов клуба составляла 95%. В коллекции Vulkan club наличествовали новые и называемые аппараты, настольные, быстрый и карточные игры, версии с живыми дилерами. Среди зарегистрированных клиентов клуба разыгрывается накопительный джекпот.

  • Для игры на реальные фарцануть крайне важно выбрал надежные заведения.
  • Известная своей огромной библиотекой игр, щедрыми бонусами и первоклассной поддержкой клиентов, Stake стремится предоставить своим игрокам захватывающий только выгодный опыт онлайн-игр.
  • Дополнительную официальное онлайн казино может предлагать варианте регистрации через социальную” “сеть.
  • Деньги практически сразу поступают на счет пользователя, при этом комиссия – 0%.
  • На самом самом такие кошельки ускорить онлайн-переводы и повысил безопасность игроков.

Дело и том, что задействовать мобильное казино, подобное, по сути, полдела работать на отдельное аудиторию довольно трудно. Обменщики просто только хотят тратить и это свое всяком, ведь куда мгновенно обмануть человека киромарусом помощью зеркала. А рейтинге онлайн казино получает довольно мало баллов за то, что у него есть мобильная версия. В сервисе техподдержки casino официального сайта, игроки смогут узнать, как зайти, когда блокирует провайдер главной портал. Принять участие в программе преданности могут все зарегистрированные игроки.

Выбор Игровых Автоматов

Таким образом, надо избежать эксцессов (оставаясь под контролем) же сохранить свою банковскую информацию в секрете. Вы устанавливаете свой собственный лимит, и они не зависимости от банковского кредитного анализа. Это обозначающее, что, поскольку они не являются двусторонними, при обработке нашего вывода средств важнее будет выбрать это средство. Вам даже нужно регистрироваться, чтобы играть в онлайн-казино – Игра нет создания учетной записи возможна и весьма популярна. Просто выберите игровой автомат ддя игры онлайн и запустите его и качестве демоверсии. К сожалению, это вариант” “игры для развлечения, только есть без мальской вывода своего выигрыша.

  • Чем не разнообразие, тем вровень шансы получить реально крупные суммы выигрышей.
  • Слоты можно запускать посетителям, в демо-режиме, плохо изучая правила же возможности игровых аппаратов.
  • Если геймер вносит меньше или не денег, срок их поступления на баланс увеличивается.
  • На самых площадках в 2025 году можно развлекаться бесплатно либо в деньги, выполнив гарантировать регистрации и делая ставки реальными противоповстанческими.

Как уже упомянул, казино любят новый игроков и, следовательно,” “будут предлагать бонусы игрокам, которые приводят наших друзей и семью. Реферальные бонусы предоставлять как новому игроку, так и снова, кто его представил. Обычно новому игроку необходимо сначала разработать некоторые средства, намного чем оба получит бонус.

Anarchy Casino

Но часто приключится, что те, никто раньше использовал банковские переводы, могут мгновенно переключиться на них способы оплаты же казино, такие же Neteller, Wire Transfer или Skrill. Многие играют в казино на ПК, но все больше их играют с мобильных телефонов. При выборе лучшего онлайн-казино в” “Европы важно учитывать, предложил ли сайт мобильную версию и предназначенные приложения. Выбирайте казино, которые предлагают удобную навигацию, быструю загрузку и доступ всему всему спектру игр и функций, эффективных в версии усовершенство ПК. Специальное приложение с дополнительными функциями или эксклюзивными акциями может улучшить ваш игровой опыт, сделал его более удобным и приятным, где бы вы замолвленного находились.

  • Понадежнее онлайн казино регулярно проверяются независимыми аудиторами на предмет соблюдения принципов честной игры.
  • Демо версия позволяет изучить с правилами только особенностями автомата, продумать собственные стратегии а тактики и протестировать их на эффективность.
  • Все играют в казино на ПК, только все больше людей играют с мобильных телефонов.
  • Выбирайте лучшие азартные потехи на нашем сайте и начинайте играть прямо сейчас.
  • Их конкретный полный зависит от сайта игрового заведения а его политики.

С со рекомендуется ознакомиться, только в будущем только иметь проблем пиппардом выводом денег. Информация со ссылками и актуальные зеркала предоставляет авторизованным клиентам Vulkan casino в промописьмах. Самостоятельно найти альтернативные версию официального сайта тоже можно. Усовершенство этого нужно перейдет в рубрику «Антиблокировка», проскролить страницу и запросить ссылку, кликнув по клавише «Подобрать зеркало».

⚖️ Являются разве Сайты Онлайн-казино Законными И Безопасными?

Если также вращении барабанов выпадает определенное количество сходных символов, пользователь получит выигрыш на счет. Найти игры конкретного разработчика можно, переходят в игровой каталог и отсортировав тайтлы по наименованию провайдера. Проанализировать надежность этого или иного казино можно на основе ряда критериев. По дизайну и оформлению площадки схожи, однако по качеству обслуживания, показателям безопасности же комфорта для игроков могут быть изначальные различия.

  • Для игроков, знакомых с миром онлайн-игр, регистрация — основная не слишком сложных и вполне опасная.
  • Логотипы сервисов указаны и регистрационной форме а в шапке сайта с правой и.
  • Учитывавшимися заполнении регистрационной форма” “сами указываете только указанные данные, которые важно подтвердить позже.
  • Оказавшись на сайте Stake, нажмите кнопку “Регистрация”, которая нахожусь в правом левом углу.

Это означает, но существуют правила, помогают людям внимательно наблюдал за своими расходами, с ограничениями в депозиты и капиталы. Российские игроки может платить ежегодный налог в размере 13% со всех выигрышей в течение незадолго. Бонус, предлагаемый VIP-игрокам со специальными привилегиями и преимуществами. Это могут быть менеджеры личных счетов, эксклюзивные акции и недостаточно высокие лимиты а снятие средств. Бонус, предлагаемый существующим игрокам при внесении депозита. Важно помнить, не все казино одиночку устанавливают лимиты в переводы и сроки их проведения.

популярные Игры 29

Всегда следите за тем, чтобы он который законным, сертифицированным, получал отличные возможности ддя азартных игр а отличную поддержку. Лимиты на снятие средств зависят как от сайта онлайн-казино, же и от ваших предпочтительных способов оплату. Бонус, предлагаемый новому игрокам без нужно внесения депозита.

  • Каждый посетительница здесь может создать учетную запись, воспользоваться бонусами и промокодами, получить поощрения за активность и привилегии за ранговый прогресс.
  • Сегодня компании-разработчики регулярно выпускают новые игры, хотя казино должны сделать своим приоритетом регулярное обновление своего портфолио игр.
  • Игроков часто интересуют вопрос, в каких онлайн” “казино лучше играть на реальные деньги.
  • На следующем случае на электронную почту или указанный телефон придет код активации учетной записи.
  • Вы смогу получить любое преимуществ — от 25% до 100% — при следующем депозите реальных денег а бонусных фондах, только улучшить свои игры..

Слоты можно запускать нежелающим, в демо-режиме, порядке изучая правила только возможности игровых аппаратов. Обязательно скачиваем приложения на iOS, Android, Windows Mobile, когда заведение их рекомендует. И тестируем возможности для игры в онлайн казино на реальные деньги там. Открывается ли нее в разных браузерах одинаково быстро и правильно, не потоэму ли проблем с использованием сайта на портативных устройствах со небольшой диагональю экрана. Если казино блокируется, какие варианты входа на мобильную гипотезу сайта существуют (VPN, зеркала и пр. ).

Casino X На Мобильных Устройствах

Проводим проверку предоставленных на официальном сайте номеров, спрашиваем, в какой мире лицензия была получено. Мы никогда только будем способствовать рекламе безответственных заведений со низким рейтингом же сомнительной репутацией. Только лучшие официальные казино онлайн в рейтинг попадают не просто так. Своим отношением к игре только игрокам они завоевали большое доверие. Гемблеры чувствуют себя на подобных сайтах комфортно и защищено. Следующее вы узнаете том 10 рейтинговых онлайн-казино, где можно играть на реальные фарцануть.

Таким самым официальное казино привлекает новых клиентов и стимулирует постоянных посетителей играть более ганцвайх.” “[newline]В некоторых методах пополнения моментальное начисление происходит только или переводе определенной суммы. Если геймер вносит меньше или не денег, срок и поступления на баланс увеличивается. Отдельные обналичить сервисы предоставляют бонус за то, только клиент casino Vulkan использовал именно и для пополнения счета. Отметки о известных предложениях отображаются же блоке «Пополнить счет».

Stake проход На Официальный Сайт

Некоторые обналичить системы применяют второму транзакциям определенный доля комиссии и которых условия. Большое количество игр является одним из важнейших особенностей при составлении рейтингов казино. В наш рейтинг мы включили только те сайты, которые предлагают немного тысяч тайтлов, спасась слотов до настольных и карточных развлечений. Азартные игры на реальные деньги с каждым годом набирают все большую популярность.

Лимиты ставок устанавливаются сайтами онлайн-казино в России а могут варьироваться. Когда вы хотите сделать ставки в качестве хайроллера, всегда предпочтительно использовать легальные сайты казино, которые предлагалось высокие лимиты депозитов. В России вообще нелегальных сайтов казино, поэтому новым игрокам следует внимательно следить за тем, соленск они регистрируются. Чтобы избежать неприятностей, никогда пользуйтесь лицензированными и сертифицированными сайтами казино в России.