').css({ visibility: 'hidden', position: 'absolute', top: '-300px', width: '1px', height: '1px', overflow: 'hidden' }); if( $('html').attr('dir') == 'rtl' ){ elem.css({ right: '-300px' }); } else { elem.css({ left: '-300px' }); } elem.append( $('').addClass('ipsLoading ipsLoading_noAnim').css({ display: 'block' }) ); $('body').append( elem ); }, /** * Sets up our global ajax handlers * * @returns {void} */ _setAjaxConfig = function () { var data = { csrfKey: ips.getSetting('csrfKey') }; $.ajaxSetup({ data: data, cache: true }); // Add global loading indicator ability var count = 0; $( document ) .ajaxSend( function (event, request, settings) { if( !_.isUndefined( settings ) && settings.showLoading === true ){ if( !$('#elAjaxLoading').length ){ getContainer().append( templates.render('core.general.ajax') ); } count++; ips.utils.anim.go( 'fadeIn fast', $('#elAjaxLoading') ); } }) .ajaxComplete( function (event, request, settings) { if( !_.isUndefined( settings ) && settings.showLoading === true ){ count--; if( count === 0 ){ ips.utils.anim.go( 'fadeOut fast', $('#elAjaxLoading') ); } } // Check for redirect response if( !_.isUndefined( settings ) && !settings.bypassRedirect ){ var responseJson = null; if( !_.isUndefined( request.responseJSON ) && !_.isUndefined( request.responseJSON.redirect ) ) { responseJson = request.responseJSON; } else if( !_.isUndefined( request.responseText ) ) { try { var jsonResponse = $.parseJSON( request.responseText ); if( jsonResponse && !_.isUndefined( jsonResponse.redirect ) ) { responseJson = jsonResponse; } } catch( err ){} } if( responseJson ){ // Do we have a flash message to show? if( !_.isUndefined( responseJson.message ) && responseJson.message != '' ){ ips.utils.cookie.set( 'flmsg', responseJson.message ); } if ( responseJson.redirect.match( /#/ ) ) { window.location.href = responseJson.redirect; window.location.reload(); } else { window.location = responseJson.redirect; } } } // Re-parse cookies ips.utils.cookie.init(); }); }, /** * Config getter * * @param {string} key Setting key to return * @returns {mixed} Config setting, or undefined if it doesn't exist */ getSetting = function (key) { return _settings[ key ]; }, /** * Return full settings object * * @returns {object} Settings object */ getAllSettings = function () { return _settings; }, /** * Config setter * * @param {string} key Key to set * @param {mixed} value Setting value * @returns {void} */ setSetting = function (key, value) { _settings[ key ] = value; }, /** * Adds strings to our language object * * @param {mixed} strings Either an {object} of key/values, or a {string} as a key * @param {string} [...] If strings is a string, this param is the value * @returns {void} */ setString = function (strings) { if( _.isString( strings ) && arguments.length == 2 && _.isString( arguments[1] ) ){ strings = {}; strings[ arguments[0] ] = arguments[1]; } else if( !_.isObject( strings ) ){ Debug.warn("Invalid strings object passed to addString"); return; } $.each( strings, function (key, value ){ _strings[ key ] = value; }); }, /** * Detect if a language string exists * * @param {mixed} key The key * @returns {bool} */ haveString = function (key) { return !_.isUndefined( _strings[ key ] ); }, /** * Retrieves a string from storage, and interpolates values if needed * * @param {mixed} strings Either an {object} of key/values, or a {string} as a key * @param {string} [...] If strings is a string, this param is the value * @returns {string} The interpolated string (empty if the key does not exist) */ getString = function (key, values) { if( _.isUndefined( _strings[ key ] ) ){ Debug.warn("The string '" + key + "' doesn't exist"); return ''; } var thisString = _strings[ key ], values = values || {}; // Do we have special values to parse? if( !_.indexOf( thisString, '{{' ) ){ return thisString; } // Add some vars into the values _.extend( values, { baseURL: ips.getSetting('baseURL') }); try { return _.template( thisString )( values ); } catch (err) { return ( Debug.isEnabled() ) ? "[Error using language string " + key + "]" : ""; } }, /** * GraphQL Response setter * * @param {string} key Key to set * @param {mixed} value Response value * @returns {void} */ setGraphQlData = function (key, value) { _graphData[ key ] = value; }, /** * GraphQL Responses getter * * @param {string} key Key to return * @returns {mixed} Data, or undefined if it doesn't exist */ getGraphQlData = function (key) { return _graphData[ key ]; }, /** * Returns the location in which we're running * * @returns {string} Location key */ getLocation = function () { return _location; }, /** * Create a module, checking that each namespace is ready to accept * modules. If the init method exists on the given module, it is added * to the document.ready queue. * * @param {string} name The full module path to create * @param {function} fn The module definition * @returns {void} */ createModule = function (name, fn) { var bits = name.split('.'), currentPath = window; var tmpName = []; // Loop through the path pieces and ensure they exist if( bits.length ){ for( var i = 0; i < bits.length; i++ ){ if( _.isUndefined( currentPath[ bits[i] ] ) ){ currentPath[ bits[i] ] = {}; } currentPath = currentPath[ bits[i] ]; } } else { return false; } // Assign our module to the path currentPath = _.extend( currentPath, fn.call( currentPath ) ); // Set up init if it exists if( _.isFunction( currentPath.init ) ){ // support external loading. If the script is embedded in another webpage after it loads, the document is already 'ready'. We will instead listen for a 'ipsScriptsReady' event if (window.ipsScriptsExternallyLoaded) { $(document.body).on('ipsScriptsReady', function () { currentPath.init.call(currentPath); }) } else { $(document).ready(function () { currentPath.init.call(currentPath); }); } } $( document ).trigger( 'moduleCreated', [ name ] ); }, /** * Provides a pluralized version of a string based on the supplied value * * @param {string} stringKey The key of the language string containing the pluralization tag * @param {number} value The value to be pluralized * @returns {void} */ pluralize = function (stringKey, params) { // Get the string we'll work with var word = stringKey; // Get the pluralization tags from it var i = 0; if( !_.isArray( params ) ){ params = [ params ]; } word = word.replace( /\{(!|\d+?)?#(.*?)\}/g, function (a,b,c,d) { // {# [1:count][?:counts]} if( !b || b == '!' ){ b = i; i++; } var value; var fallback; var output = ''; var replacement = params[ b ] + ''; c.replace( /\[(.+?):(.+?)\]/g, function (w,x,y,z) { var xLen = x.length * -1; if( x == '?' ){ fallback = y.replace( '#', replacement ); } else if( x.charAt(0) == '%' && x.substring( 1 ) == replacement.substring( 0, x.substring( 1 ).length ) ){ value = y.replace( '#', replacement ); } else if( x.charAt(0) == '*' && x.substring( 1 ) == replacement.substr( -x.substring( 1 ).length ) ){ value = y.replace( '#', replacement ); } else if( x == replacement ) { value = y.replace( '#', replacement ); } }); output = a.replace( /^\{/, '' ).replace(/\}$/, '' ).replace( '!#', '' ); output = output.replace( b + '#', replacement ).replace( '#', replacement ); output = output.replace( /\[.+\]/, value == null ? fallback : value ).trim(); return output; }); return word; }, testConsole = function () { if( window.atob && window.console ){ console.log( window.atob("ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgd293ICAgICAgICAgICAgICAgICAgICAgICAgICAgI\ CAgIAogICAgICAgICAgICAgICAgICAgICAgICBzdWNoIGZvcnVtICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAga\ G93IGFqYXggICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICB2ZXJ5IGNvbW11bml0eSAgICAgIC\ AgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWNoIG1lbWJlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\ ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCg==") ); } return ''; }; var templates = function () { var _templateStore = {}; /** * Sets a mustache template * * @param {string} key Key name for this template * @param {mixed} template Template, as string or function which returns a string * @returns {void} */ var set = function (key, template) { _templateStore[ key ] = template; }, /** * Return a mustache template * * @param {string} key Key name for the template to retrieve * @returns {string} Template contents */ get = function (key) { if( _templateStore[ key ] ){ if( _.isFunction( _templateStore[ key ] ) ){ return _templateStore[ key ](); } else { return _templateStore[ key ]; } } return ''; }, /** * Renders a mustache template * * @param {string} key Key name for this template * @param {object} obj Object of values with which to render the template * @returns {string} The rendered contents */ render = function (key, obj) { // Add some common vars obj = _.extend( obj || {}, { baseURL: ips.getSetting('baseURL'), lang: _lang, blankImg: ips.getSetting('blankImg') || '' }); return Mustache.render( get( key ), obj ); }, /** * Returns a compile mustache template ready for us * * @param {string} key Key name for this template * @returns {function} A compiled template function */ compile = function (key) { if( _templateStore[ key ] ){ return Mustache.parse( get( key ) ); } return $.noop; }, /** * Returns a function that Mustache can use to swap out language strings * Allows {{#lang}}key{{/lang}} to be used in the templates * * @returns {function} A closure */ _lang = function () { return function (text, render) { return render( ips.getString( text ) ); } }; return { set: set, get: get, render: render, compile: compile }; }(); return { boot: boot, createModule: createModule, getSetting: getSetting, getAllSettings: getAllSettings, setSetting: setSetting, getGraphQlData: getGraphQlData, setGraphQlData: setGraphQlData, getAjax: getAjax, getContainer: getContainer, setString: setString, haveString: haveString, getString: getString, pluralize: pluralize, getLocation: getLocation, templates: templates, testConsole: testConsole }; }()); ips.boot( ipsSettings ); // Extend some core objects with useful methods String.prototype.startsWith = function (pattern) { return this.lastIndexOf(pattern, 0) === 0; }; }(jQuery, _)); // Polyfill for event.submitter not existing in safari // Taken from https://gist.github.com/nuxodin/3ae174f2a6a112df3ccad22459237a91 !function(){ var lastBtn = null document.addEventListener('click',function(e){ if (!e.target.closest) return; lastBtn = e.target.closest('button, input[type=submit]'); }, true); document.addEventListener('submit',function(e){ if ('submitter' in e) return; var canditates = [document.activeElement, lastBtn]; lastBtn = null; for (var i=0; i < canditates.length; i++) { var candidate = canditates[i]; if (!candidate) continue; if (!candidate.form) continue; if (!candidate.matches('button, input[type=button], input[type=image]')) continue; e.submitter = candidate; return; } e.submitter = e.target.querySelector('button, input[type=button], input[type=image]'); }, true); }();]]> = options.level && options.adapters.length ){ for( var i = 0; i < options.adapters.length; i++ ){ options.adapters[ i ].write( level, message ); } } return Debug; }, /** * Sets the enabled/disabled status of logging * * @param {boolean} enabled Whether logging should be enabled * @returns {object} Returns Debug */ setEnabled = function (enabled) { options.enabled = ( enabled === false ) ? false : true; return Debug; }, /** * See whether debugging is enabled * * @returns {boolean} */ isEnabled = function () { return options.enabled; }, /** * Sets the debugging severity threshold * * @param {number} level Level to set as minimum threshold * @returns {object} Returns Debug */ setLevel = function (level) { if( LEVEL[ level ] ){ options.level = LEVEL[ level ]; } return Debug; }, /** * Adds an adapter to use for logging * * @param {number} level Level to set as minimum threshold * @returns {object} Returns Debug */ addAdapter = function (adapter) { if( _.isObject( adapter ) ){ options.adapters.push( adapter ); } return Debug; }, /** * Clears all adapters * * @returns {object} Returns Debug */ clearAdapters = function () { options.adapters = []; return Debug; }; return { // logging methods debug: debug, log: debug, // Alias for matt info: info, warn: warn, error: error, // other methods setEnabled: setEnabled, setLevel: setLevel, addAdapter: addAdapter, clearAdapters: clearAdapters, isEnabled: isEnabled }; }(); /** Default Console adapter */ var Console = function() {}; Console.prototype.write = function ( level, msg ){ if( window.console ){ switch( level ){ case 1: if( _.isObject( msg ) ){ console.dir( msg ); } else { console.log( msg ); } break; case 2: console.info( msg ); break; case 3: console.warn( msg ); break; case 4: console.error( msg ); break; } } }; Debug.addAdapter( new Console ); if ( ipsDebug || ( !_.isUndefined( window.localStorage ) && 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem('DEBUG') ) ) { Debug.setEnabled( true ).setLevel( 'DEBUG' ).info("Enabled logging"); } }(jQuery, _));]]> controllerOne( mixin1; mixin2 ), controllerTwo, controllerThree, returns: *
		 * {
		 * 	controllerOne: [ mixin1, mixin2 ],
		 *	controllerTwo: [],
		 * 	controllerThree: []
		 * }
		 * 
* * @returns {string} */ _getControllersAndMixins = function (controllerString) { var controllers = {}; var pieces = controllerString.split(','); for( var i = 0; i < pieces.length; i++ ){ pieces[i] = pieces[i].trim(); // Fix case issues on user-submitted content if( !_.isUndefined( _controllerCaseMap[ pieces[i] ] ) ){ pieces[i] = _controllerCaseMap[ pieces[i] ]; } if( pieces[i].indexOf('(') === -1 ){ controllers[ pieces[i] ] = []; continue; } var p = pieces[i].match( /([a-zA-Z0-9.]+)\((.+?)\)/i ); var mixinPieces = []; _.each( p[2].split(';'), function (val) { mixinPieces.push( val.trim() ); }); controllers[ p[1] ] = mixinPieces; } return controllers; }, /** * Returns an incremental controller ID * Controller IDs are used to enable controllers to identify events that they * emitted themselves. * * @returns {string} */ getInstanceID = function () { return 'ipscontroller' + (++instanceID); }, /** * Allows an element to be cleaned externally. If the element passed is not a controller scope, * it'll search down one level of the DOM to find controllers. * * @param {element} elem The element to clean * @returns {string} */ cleanContentsOf = function (elem) { Debug.log('Cleaning contents of controller'); $( elem ).find('[data-controller]') .each( function () { var loopController = $( this ); var controllers = loopController.data( '_controllerObjs' ) || []; if( controllers.length ){ loopController.data('_controllerObjs', []); for( var i = 0; i < controllers.length; i++ ){ controllers[i]._destroy.apply( controllers[i] ); delete controllers[i]; } } }); // Remove any widgets that exist in this elem ips.ui.destructAllWidgets( $( elem ) ); }, /** * Initializes a controller instance by creating a new function, extending it with * the controller methods then initializing it on the relevant dom node * * @param {element} elem The element that will form the scope of this controller * @param {string} controllerID ID of this controller * @returns {void} */ initControllerOnElem = function (elem, controllerID, mixins) { if( !_controllers[ controllerID ] ){ Debug.error("Controller '" + controllerID + "' has not been registered"); return; } if( _.isUndefined( $( elem ).data('_controllers') )){ $( elem ).data('_controllers', []); } $( elem ).data('_controllers').push( controllerID ); if( _.isUndefined( _prototypes[ controllerID ] ) ){ // Fetch our controller prototype _prototypes[ controllerID ] = getBaseController(); // Extend with our specific controller methods $.extend( true, _prototypes[ controllerID ].prototype, _controllers[ controllerID ] ); } // And init if( _.isUndefined( $( elem ).data( '_controllerObjs' ) ) ){ $( elem ).data( '_controllerObjs', [] ); } var controllers = $( elem ).data( '_controllerObjs' ); var obj = new _prototypes[ controllerID ](elem, controllerID); controllers.push( obj ); // Any mixins? // Auto mixins first if( !_.isUndefined( _autoMixins[ controllerID ] ) && _.size( _autoMixins[ controllerID ] ) ){ _.each( _autoMixins[ controllerID ], function (val, key) { _autoMixins[ controllerID ][ key ].call( obj ); }); } // Then the manually-specified ones if( mixins.length ){ for( var i = 0; i < mixins.length; i++ ){ if( !_.isUndefined( _manualMixins[ controllerID ] ) && !_.isUndefined( _manualMixins[ controllerID ][ mixins[i] ] ) ){ _manualMixins[ controllerID ][ mixins[i] ].call( obj ); } } } if( _.isFunction( obj.initialize ) ){ obj.initialize.call( obj ); } $( elem ).removeData( '_controller' + controllerID ); $( document ).trigger( 'controllerReady', { controllerID: obj.controllerID, controllerType: obj.controllerType, controllerElem: elem }); }, /** * Finds controllers within a node that have an ID matching the provided name * Wildcard character * supported at the front or end of the controller parameter * * @param {string} controller Controller name to find * @param {element} node Optional node to search in (document by default) * @returns {function} */ _findSubControllers = function (controller, node) { var results = []; node = ( node && ( _.isElement( node ) || node.jquery ) ) ? node : document; if( controller.indexOf('*') === -1 ){ results = $( node ).find('[data-controller*="' + controller + '"]'); } else { var pieces = controller.split('.'); if( pieces[0] == '*' ){ pieces.shift(); results = $( node ).find('[data-controller$="' + pieces.join('.') + '"]'); } else if( pieces[ pieces.length - 1 ] == '*' ){ pieces.pop(); results = $( node ).find('[data-controller^="' + pieces.join('.') + '"]'); } } return results; }, /** * Returns a new function that will form our controller prototype * * @returns {function} */ getBaseController = function () { /** Base controller definition */ var baseController = function (scope, type) { this.controllerType = type; this.controllerID = getInstanceID(); this.scope = $( scope ); this._eventListeners = []; var self = this; // Advice methods - inspired by http://javascriptweblog.wordpress.com/2011/05/31/a-fresh-look-at-javascript-mixins/ // and Twitter Flight var adviceFuncs = { before: function (baseFn, newFn) { return function () { newFn.apply( this, arguments ); return baseFn.apply( this, arguments ); }; }, after: function (baseFn, newFn) { return function () { var toReturn = baseFn.apply( this, arguments ); newFn.apply( this, arguments ); return toReturn; } }, around: function (baseFn, newFn) { return function () { var args = ips.utils.argsToArray( arguments ); args.unshift( baseFn.bind( this ) ); return newFn.apply( this, args ); } } } _.each( ['before', 'after', 'around'], _.bind( function (type) { this[ type ] = function (base, fn) { if( _.isUndefined( this[ base ] ) || !_.isFunction( this[ base ] ) ){ Debug.log( "Method '" + base + '" is not present in controller ' + this.controllerID ); return; } // Replace our base method with a wrapped version this[ base ] = adviceFuncs[ type ]( this[ base ], fn ); }; }, this ) ); //Debug.info("Initialized " + this.controllerID + " of type " + this.controllerType); }; baseController.method('_destroy', function () { Debug.log( 'Destroyed instance ' + this.controllerID + ' of ' + this.controllerType ); // Remove each event listener that was created in this controller if( this._eventListeners.length ){ for( var i = 0; i < this._eventListeners.length; i++ ){ var data = this._eventListeners[i]; if( data['delegate'] ){ data['elem'].off( data['ev'], data['delegate'], data['fn'] ); } else { data['elem'].off( data['ev'], data['fn'] ); } } } if( _.isFunction( this.destroy ) ){ this.destroy.call( this ); } // Remove reference to scope so that GC can do its thing this.scope = null; }); // Searches for controllers within the current, triggers a destroy event and deletes the controller objs baseController.method('cleanContents', function () { Debug.log('Cleaning contents of controller'); this.scope.find('[data-controller]') .each( function () { var loopController = $( this ); var controllers = loopController.data( '_controllerObjs' ) || []; if( controllers.length ){ loopController.data('_controllerObjs', []); for( var i = 0; i < controllers.length; i++ ){ controllers[i]._destroy.apply( controllers[i] ); delete controllers[i]; } } }); // Remove any widgets that exist in this elem ips.ui.destructAllWidgets( this.scope ); }); baseController.method('trigger', function (elem, ev, data) { // Convert silly arguments object to an array var args = ips.utils.argsToArray( arguments ); elem = ( !_.isElement( elem ) && !elem.jquery ) ? this.scope : $( args.shift() ); ev = args[0]; data = args[1] || {}; // Add our origin to the event if( !data.stack ){ data.stack = []; } data.stack.push( 'controllers.' + this.controllerType + '.' + this.controllerID ); elem.trigger( ev, data ); }); baseController.method('on', function (elem, ev, delegate, fn) { // Convert silly arguments object to an array var args = ips.utils.argsToArray( arguments ); // Reconfigure our args as necessary elem = ( !_.isElement( elem ) && elem != document && elem != window ) ? this.scope : $( args.shift() ); ev = args[0]; fn = ( args.length == 3 ) ? args[2] : args[1]; delegate = ( args.length == 3 ) ? args[1] : undefined; if( !_.isFunction( fn ) ){ Debug.warn("Callback function for " + ev + " doesn't exist in " + this.controllerType + " (" + this.controllerID + ")"); return; } // Bind our callback to the controller fn = _.bind( fn, this ); // Set up the event if( delegate ){ elem.on( ev, delegate, fn ); this._eventListeners.push({ elem: elem, event: ev, delegate: delegate, fn: fn }); } else { elem.on( ev, fn ); this._eventListeners.push({ elem: elem, event: ev, fn: fn }); } }); baseController.method('triggerOn', function (controller, ev, data) { var toTrigger = _findSubControllers( controller, this.scope ); if( !toTrigger.length ){ return; } data = data || {}; // Add our origin to the event if( !data.stack ){ data.stack = []; } data.stack.push( 'controllers.' + this.controllerType + '.' + this.controllerID ); toTrigger.trigger( ev, data ); }); return baseController; }; return { initControllerOnElem: initControllerOnElem, register: register, mixin: mixin, isRegistered: isRegistered, init: init, cleanContentsOf: cleanContentsOf }; }); }( jQuery, _ )); ]]>
') .attr( 'type', 'text' ) .attr( 'data-role', 'minimizedVersion' ) .attr( 'placeholder', ips.getString('specifyLocation') ) .on( 'focus', function (e) { // Hide the minimized version $( this ).hide(); // Set country if applicable if( options.country ){ $( elem ).find('[data-role="countrySelect"]').val( options.country ); } // Init init( elem, options, e ); // Show the main address fields elem.show().find('input').first().focus(); }); var value = []; // Build the existing value elem.find('input, select').each( function (addressPart) { if( $( this ).val() ){ if( $( this ).is('select') ){ value.push( $( this ).find('option[value="' + $( this ).val() + '"]').text().trim() ); } else { value.push( $( this ).val().trim() ); } } }); if( value.length ){ tempInput.val( value.join(', ') ); } elem .hide() .after( tempInput ); }; var countryChange = function(elem, options, e) { ips.getAjax()( ips.getSetting('baseURL') + 'index.php?app=core&module=system&controller=ajax&do=states&country=' + $( e.target ).val() ) .done( function (response) { if( response.length ) { if( !$( elem ).find('[data-role="regionSelect"]').length ) { var regionText = $( elem ).find('[data-role="regionText"]'); } else { var regionText = $( elem ).find('[data-role="regionSelect"]'); } var regionSelect = $(''); regionText.attr( 'name', regionSelect.attr('name') ).val( "" ); regionSelect.replaceWith( regionText ); } } } ); if ( typeof elem.attr('data-ipsAddressForm-googlePlaces') !== typeof undefined && elem.attr('data-ipsAddressForm-googlePlaces') !== false ) { if ( elem.attr( 'data-ipsAddressForm-googlePlaces' ) === 'loaded' ) { googlePlacesInit( elem ); } else { if ( typeof google === 'undefined' ) { ips.loader.get( [ 'https://maps.googleapis.com/maps/api/js?key=' + elem.attr('data-ipsAddressForm-googleApiKey') + '&libraries=places&sensor=false&callback=ips.ui.addressForm.googlePlacesCallback' ] ); $( window ).on( 'googlePlacesLoaded', function(){ elem.attr( 'data-ipsAddressForm-googlePlaces', 'loaded' ); googlePlacesInit( elem ); }); } else { elem.attr( 'data-ipsAddressForm-googlePlaces', 'loaded' ); googlePlacesInit( elem ); } } } }; var addAddressLine = function (elem, value) { var lastLine = elem.find('[data-role="addressLine"]').closest('li').last(); var newLine = lastLine.clone(); if( value ) { newLine.find('input').focus().val( value ); } lastLine.after( newLine ); }; var recalculateAddAddressLineButton = function (elem) { elem.find( '[data-role="addAddressLine"]' ).remove(); var button = $(''); button.click( function () { addAddressLine(elem, ''); recalculateAddAddressLineButton(elem); }); elem.find('[data-role="addressLine"]').last().after( button ); }; var googlePlacesInit = function (elem) { var googlePlacesInput = $(elem).find('[data-role="addressLine"]').first(); var options = { types: [ 'geocode' ], componentRestrictions: { country: $(elem).find('[data-role="countrySelect"]').val() } }; var autocomplete = new google.maps.places.Autocomplete( googlePlacesInput.get(0), options ); googlePlacesInput.on( 'focus', function () { if( navigator.geolocation ){ navigator.geolocation.getCurrentPosition( function (position) { var geolocation = new google.maps.LatLng( position.coords.latitude,position.coords.longitude ); autocomplete.setBounds( new google.maps.LatLngBounds( geolocation, geolocation ) ); }); } } ); googlePlacesInput.on( 'keypress', function(e) { if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { return false; } } ); google.maps.event.addListener( autocomplete, 'place_changed', function () { var place = autocomplete.getPlace(); for( var i = 0; i < $( elem ).find('[data-role="addressLine"]').length; i++ ){ $( elem ).find('[data-role="addressLine"]').val( '' ); } var parsedAddress = $( '
' + place.adr_address + '
' ); var addressLines = []; var existingAddressLines = $( elem ).find('[data-role="addressLine"]').length; if ( parsedAddress.find('.post-office-box').length ) { addressLines.push( parsedAddress.find('.post-office-box').text() ); } if ( parsedAddress.find('.street-address').length ) { addressLines.push( parsedAddress.find('.street-address').text() ); } if ( parsedAddress.find('.extended-address').length ) { addressLines.push( parsedAddress.find('.extended-address').text() ); } for( var i = 0; i < addressLines.length; i++ ){ if( existingAddressLines ){ $( elem ).find('[data-role="addressLine"]').slice( i, 1 ).focus().val( addressLines[i] ); existingAddressLines--; } else { addAddressLine(elem, addressLines[i]); } } if ( parsedAddress.find('.locality') ) { elem.find('[data-role="city"]').focus().val( parsedAddress.find('.locality').text() ); } if ( parsedAddress.find('.region') ) { elem.find('[data-role="regionText"]').focus().val( parsedAddress.find('.region').text() ); if ( elem.find('[data-role="regionSelect"] option[value="' + parsedAddress.find('.region').text() + '"]').length ) { elem.find('[data-role="regionSelect"]').val( parsedAddress.find('.region').text() ); } else { var i; for( i in place.address_components ) { if ( place.address_components[i].types[0] === 'administrative_area_level_1' || place.address_components[i].types[0] === 'administrative_area_level_2' ) { if ( elem.find('[data-role="regionSelect"] option[value="' + place.address_components[i].long_name + '"]').length ) { elem.find('[data-role="regionSelect"]').val( place.address_components[i].long_name ); break; } else if ( elem.find('[data-role="regionSelect"] option[value="' + place.address_components[i].short_name + '"]').length ) { elem.find('[data-role="regionSelect"]').val( place.address_components[i].short_name ); break; } } } } } if ( parsedAddress.find('.postal-code') ) { elem.find('[data-role="postalCode"]').focus().val( parsedAddress.find('.postal-code').text() ); } }); } // Register this module as a widget to enable the data API and // jQuery plugin functionality ips.ui.registerWidget( 'addressForm', ips.ui.addressForm, ['minimize','country','requireFullAddress'] ); return { respond: respond, googlePlacesCallback: googlePlacesCallback }; }); }(jQuery, _));]]>
/* global ips, _, Debug */ /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * * ips.ui.alert.js - Alert widget for alerts, prompts, confirms. * * Author: Rikki Tissier */ ;( function($, _, undefined){ "use strict"; ips.createModule('ips.ui.alert', function(){ var respond = function (elem, options) { alertObj( options, elem ); }, show = function (options) { alertObj( options ); }; ips.ui.registerWidget('alert', ips.ui.alert, [ 'message', 'type', 'icon', 'focus' ] ); return { respond: respond, show: show }; }); /** * Alert instance * * @param {object} options The options passed into this instance * @returns {void} */ var alertObj = function (options) { var alert = null, modal = null; var _defaults = { type: 'alert', // alert, confirm, prompt, verify message: ips.getString('generic_confirm'), buttons: { ok: ips.getString('ok'), cancel: ips.getString('cancel'), yes: ips.getString('yes'), no: ips.getString('no') }, icon: 'info', showIcon: true, callbacks: {} }; var _icons = { warn: 'fa fa-exclamation-triangle', success: 'fa fa-check-circle', info: 'fa fa-info-circle', ok: 'fa fa-check-circle', question: 'fa fa-question-circle' }; options = _.defaults( options || {}, _defaults ); /** * Initialization * * @returns {void} */ var init = function () { // Build alert _buildAlert(); _setUpEvents(); }, /** * Set up events for the alert - button clicks, and document events for keyboard accessibility * * @returns {void} */ _setUpEvents = function () { alert.on( 'click', '[data-action]', _clickButton ); $( document ).on('keydown', function (e) { switch( e.keyCode ){ case ips.ui.key.ESCAPE: if( options.type == 'alert' ){ alert.find('[data-action="ok"]').click(); } else { alert.find('[data-action="cancel"], [data-action="no"]').click(); } break; case ips.ui.key.ENTER: alert.find('[data-action="ok"], [data-action="yes"]').click(); break; } }); }, /** * Event handler for clicking a button in the alert * Looks for a callback to execute, then removes the alert from the dom * * @param {event} e Event object * @returns {void} */ _clickButton = function (e) { var button = $( e.currentTarget ); var action = button.attr('data-action'); var value = null; if( options.type == 'prompt' ){ value = alert.find('[data-role="promptValue"]').val(); } if( _.isFunction( options.callbacks[ action ] ) ){ options.callbacks[ action ]( value ); } _remove(); }, /** * Removes the alert from the dom and unsets the events * * @returns {void} */ _remove = function () { modal.remove(); ips.utils.anim.go( 'fadeOutDown fast', alert ).done( function () { alert.remove(); }); }, /** * Builds the alert element based on options * * @returns {void} */ _buildAlert = function () { var parts = {}, buttons = []; // Icon if( options.showIcon ){ parts.icon = ips.templates.render( 'core.alert.icon', { icon: _icons[ options.icon ] || options.icon }); } parts.id = 'alert_' + ( Math.round( Math.random() * 10000000 ) ); parts.text = options.message; if( options.subText ){ parts.subtext = ips.templates.render( 'core.alert.subText', { text: options.subText }); } if( options.subTextHtml ){ parts.subtext = ips.templates.render( 'core.alert.subTextHtml', { text: options.subTextHtml }); } // Build buttons switch( options.type ){ case 'alert': buttons.push( ips.templates.render( 'core.alert.button', { action: 'ok', title: options.buttons.ok, extra: 'ipsButton_primary' })); break; case 'confirm': case 'prompt': buttons.push( ips.templates.render( 'core.alert.button', { action: 'ok', title: options.buttons.ok, extra: 'ipsButton_primary' })); buttons.push( ips.templates.render( 'core.alert.button', { action: 'cancel', title: options.buttons.cancel, extra: 'ipsButton_light' })); break; case 'verify': buttons.push( ips.templates.render( 'core.alert.button', { action: 'yes', title: options.buttons.yes, extra: 'ipsButton_primary' })); if( options.buttons.no ){ buttons.push( ips.templates.render( 'core.alert.button', { action: 'no', title: options.buttons.no, extra: 'ipsButton_light' })); } if( options.buttons.cancel ){ buttons.push( ips.templates.render( 'core.alert.button', { action: 'cancel', title: options.buttons.cancel, extra: 'ipsButton_light' })); } break; } parts.buttons = buttons.join(''); // Prompt? if( options.type == 'prompt' ){ parts.text += ips.templates.render( 'core.alert.prompt'); } // Build box var tmpAlert = $.parseHTML( ips.templates.render( 'core.alert.box', parts ).trim() ); alert = $( tmpAlert[0] ); $('body').append( alert ); // Build modal modal = ips.ui.getModal(); modal.css({ zIndex: ips.ui.zIndex() }).show(); alert.css( { zIndex: ips.ui.zIndex() } ); ips.utils.anim.go('zoomIn fast', alert ); // Focus the appropriate element if( options.focus ){ alert .find('[data-action="' + options.focus + '"]') .focus(); } else { if( options.type == 'prompt' ){ alert .find('[data-role="promptValue"]') .val( options.value || '' ) .focus(); } else { alert .find('[data-action="ok"], [data-action="yes"]') .focus(); } } }; init(); }; }(jQuery, _)); '); } else if( count.length === 0 ){ elem.find('.cAutoCheckIcon').html(''); } else { elem.find('.cAutoCheckIcon').html(''); } var countToDisplay = count.length + initialCount; if( countToDisplay ){ elem.find('[data-role="autoCheckCount"]').text( countToDisplay ).show(); } else if( elem.find('[data-role="autoCheckCount"]').is(':visible') ) { // We use a timeout because more than one setInitialCount call can be sent, so if a 0 comes in and then a 1, the fadeout will take // too long and a hide() call will occur after the show() call above since the fadeOut takes time. setTimeout( function(){ if( !initialCount ) { ips.utils.anim.go( 'fadeOut', elem.find('[data-role="autoCheckCount"]') ); } }, 300 ); } return count.length; }; init(); return { destruct: destruct, refresh: refresh }; }; }(jQuery, _));]]> ", "'", "\"" ] ), unique: false, customValues: true, fieldTemplate: 'core.autocomplete.field', resultsTemplate: 'core.autocomplete.resultWrapper', resultItemTemplate: 'core.autocomplete.resultItem', tokenTemplate: 'core.autocomplete.token', addTokenTemplate: 'core.autocomplete.addToken', addTokenText: ips.getString( 'add_tag' ), queryParam: 'q', forceLower: false, minLength: 1, minAjaxLength: 1, commaTrigger: true, searchFieldThreshold: 20 }; var respond = function (elem, options) { if( !$( elem ).data('_autocomplete') ){ $( elem ).data('_autocomplete', autocompleteObj(elem, _.defaults( options, defaults ) ) ); } }, /** * Destruct the autocomplete widget on this elem * * @param {element} elem The element to check * @returns {void} */ destruct = function (elem) { var obj = getObj( elem ); if( !_.isUndefined( obj ) ){ obj.destruct(); } }, /** * Retrieve the autocomplete instance (if any) on the given element * * @param {element} elem The element to check * @returns {mixed} The dialog instance or undefined */ getObj = function (elem) { elem = $( elem ); if( elem.data('_autocomplete') ){ return elem.data('_autocomplete'); } else if( $( '[name="' + elem.attr('name') + '_original' + '"]' ).length && $( '[name="' + elem.attr('name') + '_original' + '"]' ).data('_autocomplete') ){ return $( '[name="' + elem.attr('name') + '_original' + '"]' ).data('_autocomplete'); } return undefined; }; ips.ui.registerWidget('autocomplete', ips.ui.autocomplete, [ 'multiValues', 'freeChoice', 'dataSource', 'maxItems', 'itemSep', 'resultsElem', 'unique', 'commaTrigger', 'fieldTemplate', 'resultsTemplate', 'resultItemTemplate', 'tokenTemplate', 'addTokenTemplate', 'addTokenText', 'queryParam', 'minLength', 'maxLength', 'forceLower', 'disallowedCharacters', 'minAjaxLength' ] ); return { respond: respond, destruct: destruct, getObj: getObj }; }); /** * autocomplete instance * * @param {element} elem The element this widget is being created on * @param {object} options The options passed into this instance * @returns {void} */ var autocompleteObj = function (elem, options, e) { var timer, blurTimer, lastValue = '', originalTextField, valueField, textField, dataSource, elemID = $( elem ).identify().attr('id'), wrapper, inputItem, resultsElem, selectedToken, disabled = false, required = false, tooltip = null, tooltipTimer = null, mouseOverResults = false, hasError = false; /** * Sets up this instance. The datasource object is chosen depending on what options and/or * attributes are provided. We can fetch results from a local , remotely via ajax * or not look up results from a data source at all. * * @returns {void} */ var init = function () { if( $( elem ).is('textarea, input[type="text"], input[type="search"]') ){ originalTextField = $( elem ); } else { originalTextField = $( elem ).find('textarea, input[type="text"], input[type="search"]').first(); } try { options.disallowedCharacters = $.parseJSON( options.disallowedCharacters ); } catch (err) { Debug.error("Couldn't parse disallowed characters option"); } // Add our autocomplete wrapper to the page, and move the element into it _buildWrapper(); // Set up the data source for this control _getDataSource(); // Remove list from original field originalTextField.removeAttr('list'); // Build the list if( dataSource.type != 'none' ){ _buildResultsList(); if( dataSource.type == 'local' ) { _initAutocomplete(); } } if( originalTextField.is(':disabled') ){ disabled = true; } if( originalTextField.is('[required]') ){ required = true; originalTextField .removeProp('required') .removeAttr('aria-required'); } // Turn off autocomplete and spellcheck so the browser menu doesn't get in the way textField .prop( 'autocomplete', 'off' ) .prop( 'spellcheck', false ) .prop( 'disabled', disabled ) .attr( 'aria-autocomplete', 'list' ) .attr( 'aria-haspopup', 'true' ) .attr( 'tabindex', originalTextField.attr('tabindex') || '' ); if( options.maxLength ){ textField.attr( 'maxlength', options.maxLength + 1 ); } $( document ).on( 'click', _documentClick ); wrapper.click(function(e) { e.stopPropagation(); return false; }); // Set up events textField .on( 'focus', _focusField ) .on( 'blur', _blurField ) .on( 'keydown', _keydownField ) .on( 'keyup', _keyupField ) .on( 'input', _expandField ) .on( 'keypress', _keypressField ); wrapper .on( 'click', _clickWrapper ) .on( 'click', '[data-action="addToken"]', _clickAddToken ) .on( 'keydown', _keydownWrapper ) .on( 'propChanged', _propChanged ) .toggleClass( 'ipsField_autocompleteDisabled', disabled ); _buildInitialTokens(); elem .on( 'blur', function () { // For closed tagging, our text field is the same element as the autocomplete widget // In that case, we don't want to blur otherwise we go into a death loop. if( textField !== elem ){ textField.trigger('blur'); } }) .trigger( 'autoCompleteReady', { elemID: elemID, elem: elem, currentValues: tokens.getValues() }); // Some widgets like prefixedAutocomplete may not set up until after this UI module runs, so make sure we trigger the 'ready' event when needed elem.on( 'reissueReady', function() { elem.trigger( 'autoCompleteReady', { elemID: elemID, elem: elem, currentValues: tokens.getValues() }); }); }, /** * Destruct * Removes event handlers assosciated with this instance * * @returns {void} */ destruct = function () { $( document ).off( 'click', _documentClick ); }, /** * Determines whether any errors are present in the autocomplete widget (e.g. duplicates) * * @returns {void} */ hasErrors = function () { return hasError; }, /** * Responds to the propChange event, which we use to determine whether the original field has been toggled * * @returns {void} */ _propChanged = function (e) { disabled = originalTextField.is(':disabled'); wrapper.toggleClass( 'ipsField_autocompleteDisabled', disabled ); }, /** * Builds tokens from whatever values exist in the original text field * * @returns {void} */ _buildInitialTokens = function () { var value = _getOriginalValue(); if( !value ){ return; } // Get individual values var splitValues = _.without( value.split( "\n" ), '' ); var itemCount = 0; itemCount = splitValues.length; // Clear field, as tokens.add() will re-add value originalTextField.val(''); if( splitValues.length ){ for( var i = 0; i < itemCount; i++ ){ _addToken( splitValues[i] ); } } }, /** * Returns the value from the original text field (i.e. the value provided by the backend on pag load) * * @returns {string} */ _getOriginalValue = function () { return originalTextField.val(); //return _.unescape( originalTextField.val() ).replace("'", "'").replace("'", "'"); }, /** * Builds the element that results will appear in * * @returns {void} */ _buildResultsList = function () { if( options.resultsElem && $( options.resultsElem ).length ){ resultsElem = $( options.resultsElem ); return; } var resultsList = ips.templates.render( options.resultsTemplate, { id: elemID }); wrapper.append( resultsList ); resultsElem = $('#' + elemID + '_results'); resultsElem .on('mouseover', '[data-value]', function (e) { results.select( $( e.currentTarget ) ); }) .on('mouseenter', function () { mouseOverResults = true; }) .on('mouseleave', function () { mouseOverResults = false; }) .on('click', '[data-value]', function (e) { _addToken( $( e.currentTarget ).attr('data-value') ); textField.focus(); }) .attr( 'aria-busy', 'false' ); }, /** * Builds an autocomplete search field for the list of tokens * * @returns {void} */ _initAutocomplete = function() { if( dataSource.totalItems() > options.searchFieldThreshold && !options.freeChoice ){ var searchField = ips.templates.render( 'core.autocomplete.searchTypeAhead', {} ); $('#' + elemID + '_results').prepend( searchField ); // Set up events $('#' + elemID + '_results').on( 'keyup', 'input[type="search"]', _keyupAutocomplete ); } }, /** * Character entered in the autocomplete field - update our results * * @returns {void} */ _keyupAutocomplete = function(e) { _loadResults( $(this).val() ); return true; }, /** * Builds the wrapper element that looks like a text input, but allows us to insert * items as tokens * * @returns {void} */ _buildWrapper = function () { var existingClasses = elem[0].className; $( elem ) .after( ips.templates.render( options.fieldTemplate, { id: elemID })) .removeClass( existingClasses ); wrapper = $( '#' + elemID + '_wrapper' ); inputItem = $( '#' + elemID + '_inputItem' ); // If users have to choose from a predefined list, we'll hide the text field // and build a link which will show the results panel if( !options.freeChoice ){ var insertElem = ips.templates.render('core.autocomplete.addToken', { text: options.addTokenText }); textField = elem; } else { var insertElem = $('').attr( { type: 'text', id: elemID + '_dummyInput' }) .prop( 'autocomplete', 'off' ); textField = insertElem; } // Make a copy of the original text field using its name. This is because it's difficult to set // arbitrary values in the original text field later if it's associated with a datalist. var name = originalTextField.attr('name'); originalTextField.attr( 'name', originalTextField.attr('name') + '_original' ); valueField = $('",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Me(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return R(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return R(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0
1?a[1]:a[0];break;case S+"X":l[2]=r.tan(M(a));break;case S+"Y":l[1]=r.tan(M(a));break;case x:a=a.split(",");l[0]=a[0];l[1]=a[1];l[2]=a[2];l[3]=a[3];l[4]=parseInt(a[4],10);l[5]=parseInt(a[5],10);break}c[0]=f[0]*l[0]+f[2]*l[1];c[1]=f[1]*l[0]+f[3]*l[1];c[2]=f[0]*l[2]+f[2]*l[3];c[3]=f[1]*l[2]+f[3]*l[3];c[4]=f[0]*l[4]+f[2]*l[5]+f[4];c[5]=f[1]*l[4]+f[3]*l[5]+f[5];f=[c[0],c[1],c[2],c[3],c[4],c[5]]}return c}function N(e){var t,n,i,s=e[0],o=e[1],u=e[2],a=e[3];if(s*a-o*u){t=r.sqrt(s*s+o*o);s/=t;o/=t;i=s*u+o*a;u-=s*i;a-=o*i;n=r.sqrt(u*u+a*a);u/=n;a/=n;i/=n;if(s*a1?t[1]:e==E?r||t[0]:n+"")]:[n,n];break;case S+"X":case S+"Y":case w:t=t?M(t):0;break;case x:return N(t?_(t):[1,0,0,1,0,0]);break}return[[i,t]]}function L(e){return m.test(e)}function A(e){return e.replace(/(?:\([^)]*\))|\s/g,"")}function O(e,t,n){while(n=t.shift()){e.push(n)}}function M(e){return~e.indexOf("deg")?parseInt(e,10)*(r.PI*2/360):~e.indexOf("grad")?parseInt(e,10)*(r.PI/200):parseFloat(e)}function _(e){e=/([^,]*),([^,]*),([^,]*),([^,]*),([^,p]*)(?:px)?,([^)p]*)(?:px)?/.exec(e);return[e[1],e[2],e[3],e[4],e[5],e[6]]}var s=n.createElement("div"),o=s.style,u="Transform",a=["O"+u,"ms"+u,"Webkit"+u,"Moz"+u],f=a.length,l,c,h="Float32Array"in t,p,d,v=/Matrix([^)]*)/,m=/^\s*matrix\(\s*1\s*,\s*0\s*,\s*0\s*,\s*1\s*(?:,\s*0(?:px)?\s*){2}\)\s*$/,g="transform",y="transformOrigin",b="translate",w="rotate",E="scale",S="skew",x="matrix";while(f--){if(a[f]in o){e.support[g]=l=a[f];e.support[y]=l+"Origin";continue}}if(!l){e.support.matrixFilter=c=o.filter===""}e.cssNumber[g]=e.cssNumber[y]=true;if(l&&l!=g){e.cssProps[g]=l;e.cssProps[y]=l+"Origin";if(l=="Moz"+u){p={get:function(t,n){return n?e.css(t,l).split("px").join(""):t.style[l]},set:function(e,t){e.style[l]=/matrix\([^)p]*\)/.test(t)?t.replace(/matrix((?:[^,]*,){4})([^,]*),([^)]*)/,x+"$1$2px,$3px"):t}}}else if(/^1\.[0-5](?:\.|$)/.test(e.fn.jquery)){p={get:function(t,n){return n?e.css(t,l.replace(/^ms/,"Ms")):t.style[l]}}}}else if(c){p={get:function(t,n,r){var s=n&&t.currentStyle?t.currentStyle:t.style,o,u;if(s&&v.test(s.filter)){o=RegExp.$1.split(",");o=[o[0].split("=")[1],o[2].split("=")[1],o[1].split("=")[1],o[3].split("=")[1]]}else{o=[1,0,0,1]}if(!e.cssHooks[y]){o[4]=s?parseInt(s.left,10)||0:0;o[5]=s?parseInt(s.top,10)||0:0}else{u=e._data(t,"transformTranslate",i);o[4]=u?u[0]:0;o[5]=u?u[1]:0}return r?o:x+"("+o+")"},set:function(t,n,r){var i=t.style,s,o,u,a;if(!r){i.zoom=1}n=T(n);o=["Matrix("+"M11="+n[0],"M12="+n[2],"M21="+n[1],"M22="+n[3],"SizingMethod='auto expand'"].join();u=(s=t.currentStyle)&&s.filter||i.filter||"";i.filter=v.test(u)?u.replace(v,o):u+" progid:DXImageTransform.Microsoft."+o+")";if(!e.cssHooks[y]){if(a=e.transform.centerOrigin){i[a=="margin"?"marginLeft":"left"]=-(t.offsetWidth/2)+t.clientWidth/2+"px";i[a=="margin"?"marginTop":"top"]=-(t.offsetHeight/2)+t.clientHeight/2+"px"}i.left=n[4]+"px";i.top=n[5]+"px"}else{e.cssHooks[y].set(t,n)}}}}if(p){e.cssHooks[g]=p}d=p&&p.get||e.css;e.fx.step.transform=function(t){var n=t.elem,i=t.start,s=t.end,o=t.pos,u="",a=1e5,f,h,v,m;if(!i||typeof i==="string"){if(!i){i=d(n,l)}if(c){n.style.zoom=1}s=s.split("+=").join(i);e.extend(t,C(i,s));i=t.start;s=t.end}f=i.length;while(f--){h=i[f];v=s[f];m=+false;switch(h[0]){case b:m="px";case E:m||(m="");u=h[0]+"("+r.round((h[1][0]+(v[1][0]-h[1][0])*o)*a)/a+m+","+r.round((h[1][1]+(v[1][1]-h[1][1])*o)*a)/a+m+")"+u;break;case S+"X":case S+"Y":case w:u=h[0]+"("+r.round((h[1]+(v[1]-h[1])*o)*a)/a+"rad)"+u;break}}t.origin&&(u=t.origin+u);p&&p.set?p.set(n,u,+true):n.style[l]=u};e.transform={centerOrigin:"margin"}})(jQuery,window,document,Math)]]> =0;r--)e.insertBefore(n[r],i),i=n[r]}function r(e,t,n){for(var i=[],r=e,a=Array.isArray(r),o=0,r=a?r:r[Symbol.iterator]();;){var l;if(a){if(o>=r.length)break;l=r[o++]}else{if(o=r.next(),o.done)break;l=o.value}var f=l;if("nl"===f.type&&t.nl2br)i.push(n.createElement("br"));else if(f.isLink&&t.check(f)){var s=t.resolve(f),c=s.formatted,u=s.formattedHref,d=s.tagName,m=s.className,y=s.target,h=s.events,k=s.attributes,v=n.createElement(d);if(v.setAttribute("href",u),m&&v.setAttribute("class",m),y&&v.setAttribute("target",y),k)for(var g in k)v.setAttribute(g,k[g]);if(h)for(var b in h)v.addEventListener?v.addEventListener(b,h[b]):v.attachEvent&&v.attachEvent("on"+b,h[b]);v.appendChild(n.createTextNode(c)),i.push(v)}else i.push(n.createTextNode(f.toString()))}return i}function a(e,t,n){if(!e||e.nodeType!==d)throw new Error("Cannot linkify "+e+" - Invalid DOM Node type");var o=t.ignoreTags;if("A"===e.tagName||s.contains(o,e.tagName))return e;for(var l=e.firstChild;l;){switch(l.nodeType){case d:a(l,t,n);break;case m:var c=l.nodeValue,y=f(c);if(0===y.length||1===y.length&&y[0]instanceof u)break;var h=r(y,t,n);i(e,l,h),l=h[h.length-1]}l=l.nextSibling}return e}function o(t,n){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];try{i=i||document||e&&e.document||global&&global.document}catch(r){}if(!i)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the third argument to linkifyElement.");return n=new c(n),a(t,n,i)}function l(t){function n(e){return e=o.normalize(e),this.each(function(){o.helper(this,e,i)})}var i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];t.fn=t.fn||{};try{i=i||document||e&&e.document||global&&global.document}catch(r){}if(!i)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the second argument to linkify/jquery");"function"!=typeof t.fn.linkify&&(t.fn.linkify=n,t(i).ready(function(){t("[data-linkify]").each(function(){var e=t(this),n=e.data(),i=n.linkify,r=n.linkifyNlbr,a={attributes:n.linkifyAttributes,defaultProtocol:n.linkifyDefaultProtocol,events:n.linkifyEvents,format:n.linkifyFormat,formatHref:n.linkifyFormatHref,nl2br:!!r&&0!==r&&"false"!==r,tagName:n.linkifyTagname,target:n.linkifyTarget,className:n.linkifyClassName||n.linkifyLinkclass,validate:n.linkifyValidate,ignoreTags:n.linkifyIgnoreTags},o="this"===i?e:e.find(i);o.linkify(a)})}))}t="default"in t?t["default"]:t;var f=n.tokenize,s=n.options,c=s.Options,u=n.parser.TOKENS.TEXT,d=1,m=3;o.helper=a,o.normalize=function(e){return new c(e)};try{!define&&(e.linkifyElement=o)}catch(y){}return l}(n,t);"function"!=typeof n.fn.linkify&&i(n)}(window,linkify,jQuery);]]> 2&&void 0!==arguments[2]?arguments[2]:{},o=Object.create(t.prototype);for(var a in n)o[a]=n[a];return o.constructor=e,e.prototype=o,e}function o(t){t=t||{},this.defaultProtocol=t.defaultProtocol||h.defaultProtocol,this.events=t.events||h.events,this.format=t.format||h.format,this.formatHref=t.formatHref||h.formatHref,this.nl2br=t.nl2br||h.nl2br,this.tagName=t.tagName||h.tagName,this.target=t.target||h.target,this.validate=t.validate||h.validate,this.ignoreTags=[],this.attributes=t.attributes||t.linkAttributes||h.attributes,this.className=t.className||t.linkClass||h.className;for(var e=t.ignoreTags||h.ignoreTags,n=0;n=r)return[];for(;a1&&void 0!==arguments[1]?arguments[1]:null,n=this.next(new t(""));return n===this.defaultTransition?(n=new this.constructor(e),this.on(t,n)):e&&(n.T=e),n},test:function(t,e){return t instanceof e}}),b=l();b.prototype={toString:function(){return this.v+""}};var v=u(),y=u("@"),k=u(":"),w=u("."),j=u(),x=u(),z=u("\n"),O=u(),S=u("+"),N=u("#"),T=u(),A=u("mailto:"),L=u("?"),E=u("/"),C=u("_"),P=u(),R=u(),q=u(),H=u("{"),B=u("["),U=u("<"),M=u("("),D=u("}"),I=u("]"),K=u(">"),_=u(")"),G=u("&"),Y=Object.freeze({Base:b,DOMAIN:v,AT:y,COLON:k,DOT:w,PUNCTUATION:j,LOCALHOST:x,NL:z,NUM:O,PLUS:S,POUND:N,QUERY:L,PROTOCOL:T,MAILTO:A,SLASH:E,UNDERSCORE:C,SYM:P,TLD:R,WS:q,OPENBRACE:H,OPENBRACKET:B,OPENANGLEBRACKET:U,OPENPAREN:M,CLOSEBRACE:D,CLOSEBRACKET:I,CLOSEANGLEBRACKET:K,CLOSEPAREN:_,AMPERSAND:G}),Q="aaa|aarp|abb|abbott|abogado|ac|academy|accenture|accountant|accountants|aco|active|actor|ad|adac|ads|adult|ae|aeg|aero|af|afl|ag|agency|ai|aig|airforce|airtel|al|alibaba|alipay|allfinanz|alsace|am|amica|amsterdam|an|analytics|android|ao|apartments|app|apple|aq|aquarelle|ar|aramco|archi|army|arpa|arte|as|asia|associates|at|attorney|au|auction|audi|audio|author|auto|autos|avianca|aw|ax|axa|az|azure|ba|baidu|band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bb|bbc|bbva|bcg|bcn|bd|be|beats|beer|bentley|berlin|best|bet|bf|bg|bh|bharti|bi|bible|bid|bike|bing|bingo|bio|biz|bj|black|blackfriday|bloomberg|blue|bm|bms|bmw|bn|bnl|bnpparibas|bo|boats|boehringer|bom|bond|boo|book|boots|bosch|bostik|bot|boutique|br|bradesco|bridgestone|broadway|broker|brother|brussels|bs|bt|budapest|bugatti|build|builders|business|buy|buzz|bv|bw|by|bz|bzh|ca|cab|cafe|cal|call|camera|camp|cancerresearch|canon|capetown|capital|car|caravan|cards|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|cc|cd|ceb|center|ceo|cern|cf|cfa|cfd|cg|ch|chanel|channel|chase|chat|cheap|chloe|christmas|chrome|church|ci|cipriani|circle|cisco|citic|city|cityeats|ck|cl|claims|cleaning|click|clinic|clinique|clothing|cloud|club|clubmed|cm|cn|co|coach|codes|coffee|college|cologne|com|commbank|community|company|compare|computer|comsec|condos|construction|consulting|contact|contractors|cooking|cool|coop|corsica|country|coupon|coupons|courses|cr|credit|creditcard|creditunion|cricket|crown|crs|cruises|csc|cu|cuisinella|cv|cw|cx|cy|cymru|cyou|cz|dabur|dad|dance|date|dating|datsun|day|dclk|de|dealer|deals|degree|delivery|dell|deloitte|delta|democrat|dental|dentist|desi|design|dev|diamonds|diet|digital|direct|directory|discount|dj|dk|dm|dnp|do|docs|dog|doha|domains|download|drive|dubai|durban|dvag|dz|earth|eat|ec|edeka|edu|education|ee|eg|email|emerck|energy|engineer|engineering|enterprises|epson|equipment|er|erni|es|esq|estate|et|eu|eurovision|eus|events|everbank|exchange|expert|exposed|express|fage|fail|fairwinds|faith|family|fan|fans|farm|fashion|fast|feedback|ferrero|fi|film|final|finance|financial|firestone|firmdale|fish|fishing|fit|fitness|fj|fk|flickr|flights|florist|flowers|flsmidth|fly|fm|fo|foo|football|ford|forex|forsale|forum|foundation|fox|fr|fresenius|frl|frogans|frontier|fund|furniture|futbol|fyi|ga|gal|gallery|gallup|game|garden|gb|gbiz|gd|gdn|ge|gea|gent|genting|gf|gg|ggee|gh|gi|gift|gifts|gives|giving|gl|glass|gle|global|globo|gm|gmail|gmbh|gmo|gmx|gn|gold|goldpoint|golf|goo|goog|google|gop|got|gov|gp|gq|gr|grainger|graphics|gratis|green|gripe|group|gs|gt|gu|gucci|guge|guide|guitars|guru|gw|gy|hamburg|hangout|haus|hdfcbank|health|healthcare|help|helsinki|here|hermes|hiphop|hitachi|hiv|hk|hm|hn|hockey|holdings|holiday|homedepot|homes|honda|horse|host|hosting|hoteles|hotmail|house|how|hr|hsbc|ht|hu|hyundai|ibm|icbc|ice|icu|id|ie|ifm|iinet|il|im|immo|immobilien|in|industries|infiniti|info|ing|ink|institute|insurance|insure|int|international|investments|io|ipiranga|iq|ir|irish|is|iselect|ist|istanbul|it|itau|iwc|jaguar|java|jcb|je|jetzt|jewelry|jlc|jll|jm|jmp|jo|jobs|joburg|jot|joy|jp|jpmorgan|jprs|juegos|kaufen|kddi|ke|kerryhotels|kerrylogistics|kerryproperties|kfh|kg|kh|ki|kia|kim|kinder|kitchen|kiwi|km|kn|koeln|komatsu|kp|kpn|kr|krd|kred|kuokgroup|kw|ky|kyoto|kz|la|lacaixa|lamborghini|lamer|lancaster|land|landrover|lanxess|lasalle|lat|latrobe|law|lawyer|lb|lc|lds|lease|leclerc|legal|lexus|lgbt|li|liaison|lidl|life|lifeinsurance|lifestyle|lighting|like|limited|limo|lincoln|linde|link|live|living|lixil|lk|loan|loans|local|locus|lol|london|lotte|lotto|love|lr|ls|lt|ltd|ltda|lu|lupin|luxe|luxury|lv|ly|ma|madrid|maif|maison|makeup|man|management|mango|market|marketing|markets|marriott|mba|mc|md|me|med|media|meet|melbourne|meme|memorial|men|menu|meo|mg|mh|miami|microsoft|mil|mini|mk|ml|mm|mma|mn|mo|mobi|mobily|moda|moe|moi|mom|monash|money|montblanc|mormon|mortgage|moscow|motorcycles|mov|movie|movistar|mp|mq|mr|ms|mt|mtn|mtpc|mtr|mu|museum|mutuelle|mv|mw|mx|my|mz|na|nadex|nagoya|name|natura|navy|nc|ne|nec|net|netbank|network|neustar|new|news|nexus|nf|ng|ngo|nhk|ni|nico|nikon|ninja|nissan|nl|no|nokia|norton|nowruz|np|nr|nra|nrw|ntt|nu|nyc|nz|obi|office|okinawa|om|omega|one|ong|onl|online|ooo|oracle|orange|org|organic|origins|osaka|otsuka|ovh|pa|page|pamperedchef|panerai|paris|pars|partners|parts|party|passagens|pe|pet|pf|pg|ph|pharmacy|philips|photo|photography|photos|physio|piaget|pics|pictet|pictures|pid|pin|ping|pink|pizza|pk|pl|place|play|playstation|plumbing|plus|pm|pn|pohl|poker|porn|post|pr|praxi|press|pro|prod|productions|prof|promo|properties|property|protection|ps|pt|pub|pw|pwc|py|qa|qpon|quebec|quest|racing|re|read|realtor|realty|recipes|red|redstone|redumbrella|rehab|reise|reisen|reit|ren|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rexroth|rich|ricoh|rio|rip|ro|rocher|rocks|rodeo|room|rs|rsvp|ru|ruhr|run|rw|rwe|ryukyu|sa|saarland|safe|safety|sakura|sale|salon|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|sas|saxo|sb|sbs|sc|sca|scb|schaeffler|schmidt|scholarships|school|schule|schwarz|science|scor|scot|sd|se|seat|security|seek|select|sener|services|seven|sew|sex|sexy|sfr|sg|sh|sharp|shell|shia|shiksha|shoes|show|shriram|si|singles|site|sj|sk|ski|skin|sky|skype|sl|sm|smile|sn|sncf|so|soccer|social|softbank|software|sohu|solar|solutions|song|sony|soy|space|spiegel|spot|spreadbetting|sr|srl|st|stada|star|starhub|statefarm|statoil|stc|stcgroup|stockholm|storage|store|studio|study|style|su|sucks|supplies|supply|support|surf|surgery|suzuki|sv|swatch|swiss|sx|sy|sydney|symantec|systems|sz|tab|taipei|taobao|tatamotors|tatar|tattoo|tax|taxi|tc|tci|td|team|tech|technology|tel|telecity|telefonica|temasek|tennis|tf|tg|th|thd|theater|theatre|tickets|tienda|tiffany|tips|tires|tirol|tj|tk|tl|tm|tmall|tn|to|today|tokyo|tools|top|toray|toshiba|total|tours|town|toyota|toys|tp|tr|trade|trading|training|travel|travelers|travelersinsurance|trust|trv|tt|tube|tui|tunes|tushu|tv|tvs|tw|tz|ua|ubs|ug|uk|unicom|university|uno|uol|us|uy|uz|va|vacations|vana|vc|ve|vegas|ventures|verisign|versicherung|vet|vg|vi|viajes|video|viking|villas|vin|vip|virgin|vision|vista|vistaprint|viva|vlaanderen|vn|vodka|volkswagen|vote|voting|voto|voyage|vu|vuelos|wales|walter|wang|wanggou|watch|watches|weather|weatherchannel|webcam|weber|website|wed|wedding|weir|wf|whoswho|wien|wiki|williamhill|win|windows|wine|wme|wolterskluwer|work|works|world|ws|wtc|wtf|xbox|xerox|xin|xperia|xxx|xyz|yachts|yahoo|yamaxun|yandex|ye|yodobashi|yoga|yokohama|youtube|yt|za|zara|zero|zip|zm|zone|zuerich|zw".split("|"),W="0123456789".split(""),X="0123456789abcdefghijklmnopqrstuvwxyz".split(""),Z=[" ","\f","\r","\t","\x0B"," "," ","᠎"],F=[],J=function(t){return new m(t)},V=J(),$=J(O),tt=J(v),et=J(),nt=J(q);V.on("@",J(y)).on(".",J(w)).on("+",J(S)).on("#",J(N)).on("?",J(L)).on("/",J(E)).on("_",J(C)).on(":",J(k)).on("{",J(H)).on("[",J(B)).on("<",J(U)).on("(",J(M)).on("}",J(D)).on("]",J(I)).on(">",J(K)).on(")",J(_)).on("&",J(G)).on([",",";","!",'"',"'"],J(j)),V.on("\n",J(z)).on(Z,nt),nt.on(Z,nt);for(var ot=0;ot=0&&u++,c++,a++;if(!(u<0)){a-=u,c-=u;var p=l.emit();o.push(new p(t.substr(a-c,c)))}}return o},yt=V,kt=Object.freeze({State:m,TOKENS:Y,run:vt,start:yt}),wt=l();wt.prototype={type:"token",isLink:!1,toString:function(){for(var t=[],e=0;e0&&void 0!==arguments[0]?arguments[0]:"http";return{type:this.type,value:this.toString(),href:this.toHref(t)}}};var jt=n(wt,l(),{type:"email",isLink:!0}),xt=n(wt,l(),{type:"email",isLink:!0,toHref:function(){this.v;return"mailto:"+this.toString()}}),zt=n(wt,l(),{type:"text"}),Ot=n(wt,l(),{type:"nl"}),St=n(wt,l(),{type:"url",isLink:!0,toHref:function(){for(var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"http",e=!1,n=!1,o=this.v,a=[],r=0;o[r]instanceof T;)e=!0,a.push(o[r].toString().toLowerCase()),r++;for(;o[r]instanceof E;)n=!0,a.push(o[r].toString()),r++;for(;p(o[r]);)a.push(o[r].toString().toLowerCase()),r++;for(;r=0&&u++,n++,c++;if(u<0)for(var p=n-c;p0&&(o.push(new zt(a)),a=[]),n-=u,c-=u;var h=l.emit();o.push(new h(t.slice(n-c,n)))}}return a.length>0&&o.push(new zt(a)),o},fe=Object.freeze({State:d,TOKENS:Nt,run:ge,start:At});Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)});var me=function(t){return ge(vt(t))},de=function(t){for(var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=me(t),o=[],a=0;a1&&void 0!==arguments[1]?arguments[1]:null,n=me(t);return 1===n.length&&n[0].isLink&&(!e||n[0].type===e)};e.find=de,e.inherits=n,e.options=g,e.parser=fe,e.scanner=kt,e.test=be,e.tokenize=me}(self.linkify=self.linkify||{})}();]]> ' + this._rowSelector); if( _.isUndefined( this.scope.attr('data-dummyLoading') ) ){ this._basicLoading( loading ); return; } if( !loading || !rowElem.length || !rows.length ){ return; } var template = 'table.row.loading'; if( this.scope.attr('data-dummyLoadingTemplate') ){ template = this.scope.attr('data-dummyLoadingTemplate'); } var newRows = []; // Build an array of rendered rows that we'll insert in one go for( var i = 0; i <= rows.length; i++ ){ var rnd = parseInt( Math.random() * (10 - 1) + 1 ); newRows.push( ips.templates.render( template, { extraClass: this.scope.attr('data-dummyLoadingClass') || '', rnd: rnd } ) ); } this.scope.find('[data-role="tableRows"]').html( newRows.join('') ); }; /** * Show a loading spinner over the top of the existing rows * * @param {object} response JSON object containing new HTML pieces * @returns {void} */ this._basicLoading = function ( loading ) { var rowElem = this.scope.find('[data-role="tableRows"]'); // Make sure we actually have a tableRows element if( !rowElem.length ) { return; } if( !this._tableOverlay ){ this._tableOverlay = $('
').addClass('ipsLoading').hide(); ips.getContainer().append( this._tableOverlay ); } if( loading ){ // Get dims & position var dims = ips.utils.position.getElemDims( rowElem ); var position = ips.utils.position.getElemPosition( rowElem ); this._tableOverlay.show().css({ left: position.viewportOffset.left + 'px', top: position.viewportOffset.top + $( document ).scrollTop() + 'px', width: dims.width + 'px', height: dims.height + 'px', position: 'absolute', zIndex: ips.ui.zIndex() }); rowElem.css({ opacity: "0.5" }); } else { rowElem.animate({ opacity: "1" }); this._tableOverlay.hide(); } }; /** * Change the sorting * * @param {event} e Event object * @param {object} data Event data object * @returns {void} */ this.changeSorting = function (e, data) { data.originalEvent.preventDefault(); // Don't sort if there's no sort value on this item if( _.isUndefined( data.selectedItemID ) ){ return; } var current = this._getSortValue(); var menuItem = data.menuElem.find('[data-ipsMenuValue="' + data.selectedItemID + '"]'); var sortBy = data.selectedItemID; var sortDirection = current.order; // Does this option also have a direction? if( menuItem.attr('data-sortDirection') ){ sortDirection = menuItem.attr('data-sortDirection'); } this.updateURL( { sortby: sortBy, sortdirection: sortDirection, page: 1 }); }; /** * Updates element classnames for filtering * * @param {string} newFilter Filter ID of new filter to select * @returns {void} */ this._updateFilter = function (newFilter) { // This space left intentionally blank }; /** * Returns the current sort by and sort order value * * @returns {object} Object containing by and order keys */ this._getSortValue = function () { var by = ips.utils.url.getParam('sortby'); var order = ips.utils.url.getParam('sortdirection'); return { by: by || '', order: order || '' }; }; /** * Returns the current sort by and sort order value * * @returns {object} Object containing by and order keys */ this._getFilterValue = function () { var filter = ips.utils.url.getParam('filter'); return filter || ''; }; }); }(jQuery, _));]]> /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * * ips.core.comment.js - Comment model * * Author: Rikki Tissier */ ;( function($, _, undefined){ "use strict"; ips.model.register('core.comment', { initialize: function () { this.on( 'getEditForm.comment', this.getEditForm ); this.on( 'saveEditComment.comment', this.saveEditComment ); this.on( 'deleteComment.comment', this.deleteComment ); this.on( 'newComment.comment', this.newComment ); this.on( 'approveComment.comment', this.approveComment ); this.on( 'unrecommendComment.comment', this.unrecommendComment ); }, /** * Retrieves edit form * * @param {event} e Event object * @param {object} data Event data object * @returns {void} */ getEditForm: function (e, data) { this.getData( { url: data.url, dataType: 'html', data: {}, events: 'getEditForm', namespace: 'comment' }, data); }, /** * Saves edit back to server * * @param {event} e Event object * @param {object} data Event data object * @returns {void} */ saveEditComment: function (e, data) { var url = data.url; this.getData( { url: data.url, dataType: 'html', type: 'post', data: data.form || {}, events: 'saveEditComment', namespace: 'comment' }, data); }, /** * Approves comment * * @param {event} e Event object * @param {object} data Event data object * @returns {void} */ approveComment: function (e, data) { this.getData( { url: data.url, dataType: 'html', data: data.form || {}, events: 'approveComment', namespace: 'comment' }, data); }, /** * Unrecommend this comment * * @param {event} e Event object * @param {object} data Event data object * @returns {void} */ unrecommendComment: function (e, data) { this.getData( { url: data.url, dataType: 'json', data: data.form || {}, events: 'unrecommendComment', namespace: 'comment' }, data); }, /** * Deletes comment * * @param {event} e Event object * @param {object} data Event data object * @returns {void} */ deleteComment: function (e, data) { this.getData( { url: data.url, dataType: 'html', data: data.form || {}, events: 'deleteComment', namespace: 'comment' }, data); }, /** * Adds a new comment * * @param {event} e Event object * @param {object} data Event data object * @returns {void} */ newComment: function (e, data) { this.getData( { url: data.url, dataType: 'json', data: data.form || {}, events: 'newComment', namespace: 'comment' }, data); } }); }(jQuery, _)); ":">",'"':""","'":"'","/":"/","`":"`","=":"="};function escapeHtml(string){return String(string).replace(/[&<>"'`=\/]/g,function fromEntityMap(s){return entityMap[s]})}var whiteRe=/\s*/;var spaceRe=/\s+/;var equalsRe=/\s*=/;var curlyRe=/\s*\}/;var tagRe=/#|\^|\/|>|\{|&|=|!/;function parseTemplate(template,tags){if(!template)return[];var lineHasNonSpace=false;var sections=[];var tokens=[];var spaces=[];var hasTag=false;var nonSpace=false;var indentation="";var tagIndex=0;function stripSpace(){if(hasTag&&!nonSpace){while(spaces.length)delete tokens[spaces.pop()]}else{spaces=[]}hasTag=false;nonSpace=false}var openingTagRe,closingTagRe,closingCurlyRe;function compileTags(tagsToCompile){if(typeof tagsToCompile==="string")tagsToCompile=tagsToCompile.split(spaceRe,2);if(!isArray(tagsToCompile)||tagsToCompile.length!==2)throw new Error("Invalid tags: "+tagsToCompile);openingTagRe=new RegExp(escapeRegExp(tagsToCompile[0])+"\\s*");closingTagRe=new RegExp("\\s*"+escapeRegExp(tagsToCompile[1]));closingCurlyRe=new RegExp("\\s*"+escapeRegExp("}"+tagsToCompile[1]))}compileTags(tags||mustache.tags);var scanner=new Scanner(template);var start,type,value,chr,token,openSection;while(!scanner.eos()){start=scanner.pos;value=scanner.scanUntil(openingTagRe);if(value){for(var i=0,valueLength=value.length;i"){token=[type,value,start,scanner.pos,indentation,tagIndex,lineHasNonSpace]}else{token=[type,value,start,scanner.pos]}tagIndex++;tokens.push(token);if(type==="#"||type==="^"){sections.push(token)}else if(type==="/"){openSection=sections.pop();if(!openSection)throw new Error('Unopened section "'+value+'" at '+start);if(openSection[1]!==value)throw new Error('Unclosed section "'+openSection[1]+'" at '+start)}else if(type==="name"||type==="{"||type==="&"){nonSpace=true}else if(type==="="){compileTags(value)}}stripSpace();openSection=sections.pop();if(openSection)throw new Error('Unclosed section "'+openSection[1]+'" at '+scanner.pos);return nestTokens(squashTokens(tokens))}function squashTokens(tokens){var squashedTokens=[];var token,lastToken;for(var i=0,numTokens=tokens.length;i0?sections[sections.length-1][4]:nestedTokens;break;default:collector.push(token)}}return nestedTokens}function Scanner(string){this.string=string;this.tail=string;this.pos=0}Scanner.prototype.eos=function eos(){return this.tail===""};Scanner.prototype.scan=function scan(re){var match=this.tail.match(re);if(!match||match.index!==0)return"";var string=match[0];this.tail=this.tail.substring(string.length);this.pos+=string.length;return string};Scanner.prototype.scanUntil=function scanUntil(re){var index=this.tail.search(re),match;switch(index){case-1:match=this.tail;this.tail="";break;case 0:match="";break;default:match=this.tail.substring(0,index);this.tail=this.tail.substring(index)}this.pos+=match.length;return match};function Context(view,parentContext){this.view=view;this.cache={".":this.view};this.parent=parentContext}Context.prototype.push=function push(view){return new Context(view,this)};Context.prototype.lookup=function lookup(name){var cache=this.cache;var value;if(cache.hasOwnProperty(name)){value=cache[name]}else{var context=this,intermediateValue,names,index,lookupHit=false;while(context){if(name.indexOf(".")>0){intermediateValue=context.view;names=name.split(".");index=0;while(intermediateValue!=null&&index")value=this.renderPartial(token,context,partials,config);else if(symbol==="&")value=this.unescapedValue(token,context);else if(symbol==="name")value=this.escapedValue(token,context,config);else if(symbol==="text")value=this.rawValue(token);if(value!==undefined)buffer+=value}return buffer};Writer.prototype.renderSection=function renderSection(token,context,partials,originalTemplate,config){var self=this;var buffer="";var value=context.lookup(token[1]);function subRender(template){return self.render(template,context,partials,config)}if(!value)return;if(isArray(value)){for(var j=0,valueLength=value.length;j0||!lineHasNonSpace)){partialByNl[i]=filteredIndentation+partialByNl[i]}}return partialByNl.join("\n")};Writer.prototype.renderPartial=function renderPartial(token,context,partials,config){if(!partials)return;var tags=this.getConfigTags(config);var value=isFunction(partials)?partials(token[1]):partials[token[1]];if(value!=null){var lineHasNonSpace=token[6];var tagIndex=token[5];var indentation=token[4];var indentedValue=value;if(tagIndex==0&&indentation){indentedValue=this.indentPartial(value,indentation,lineHasNonSpace)}var tokens=this.parse(indentedValue,tags);return this.renderTokens(tokens,context,partials,indentedValue,config)}};Writer.prototype.unescapedValue=function unescapedValue(token,context){var value=context.lookup(token[1]);if(value!=null)return value};Writer.prototype.escapedValue=function escapedValue(token,context,config){var escape=this.getConfigEscape(config)||mustache.escape;var value=context.lookup(token[1]);if(value!=null)return typeof value==="number"&&escape===mustache.escape?String(value):escape(value)};Writer.prototype.rawValue=function rawValue(token){return token[1]};Writer.prototype.getConfigTags=function getConfigTags(config){if(isArray(config)){return config}else if(config&&typeof config==="object"){return config.tags}else{return undefined}};Writer.prototype.getConfigEscape=function getConfigEscape(config){if(config&&typeof config==="object"&&!isArray(config)){return config.escape}else{return undefined}};var mustache={name:"mustache.js",version:"4.2.0",tags:["{{","}}"],clearCache:undefined,escape:undefined,parse:undefined,render:undefined,Scanner:undefined,Context:undefined,Writer:undefined,set templateCache(cache){defaultWriter.templateCache=cache},get templateCache(){return defaultWriter.templateCache}};var defaultWriter=new Writer;mustache.clearCache=function clearCache(){return defaultWriter.clearCache()};mustache.parse=function parse(template,tags){return defaultWriter.parse(template,tags)};mustache.render=function render(template,view,partials,config){if(typeof template!=="string"){throw new TypeError('Invalid template! Template should be a "string" '+'but "'+typeStr(template)+'" was given as the first '+"argument for mustache#render(template, view, partials)")}return defaultWriter.render(template,view,partials,config)};mustache.escape=escapeHtml;mustache.Scanner=Scanner;mustache.Context=Context;mustache.Writer=Writer;return mustache});]]> =c?parseInt(e.substring(1),8):"u"===c||"x"===c?parseInt(e.substring(2),16):e.charCodeAt(1)}function f(e){if(32>e)return(16>e?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return"\\"===e||"-"===e||"]"===e||"^"===e?"\\"+e:e}function c(e){var c=e.substring(1,e.length-1).match(RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g")); e=[];var a="^"===c[0],b=["["];a&&b.push("^");for(var a=a?1:0,g=c.length;ak||122k||90k||122h[0]&&(h[1]+1>h[0]&&b.push("-"),b.push(f(h[1])));b.push("]");return b.join("")}function m(e){for(var a=e.source.match(RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g")),b=a.length,d=[],g=0,h=0;g/,null])):d.push(["com",/^#[^\r\n]*/,null,"#"]));a.cStyleComments&&(f.push(["com",/^\/\/[^\r\n]*/,null]),f.push(["com",/^\/\*[\s\S]*?(?:\*\/|$)/,null]));if(c=a.regexLiterals){var m=(c=1|\\/=?|::?|<>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+ ("/(?=[^/*"+c+"])(?:[^/\\x5B\\x5C"+c+"]|\\x5C"+m+"|\\x5B(?:[^\\x5C\\x5D"+c+"]|\\x5C"+m+")*(?:\\x5D|$))+/")+")")])}(c=a.types)&&f.push(["typ",c]);c=(""+a.keywords).replace(/^ | $/g,"");c.length&&f.push(["kwd",new RegExp("^(?:"+c.replace(/[\s,]+/g,"|")+")\\b"),null]);d.push(["pln",/^\s+/,null," \r\n\t\u00a0"]);c="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(c+="(?!s*/)");f.push(["lit",/^@[a-z_$][a-z_$@0-9]*/i,null],["typ",/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],["pln",/^[a-z_$][a-z_$@0-9]*/i, null],["lit",/^(?:0x[a-f0-9]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+\-]?\d+)?)[a-z]*/i,null,"0123456789"],["pln",/^\\[\s\S]?/,null],["pun",new RegExp(c),null]);return G(d,f)}function L(a,d,f){function c(a){var b=a.nodeType;if(1==b&&!t.test(a.className))if("br"===a.nodeName.toLowerCase())m(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)c(a);else if((3==b||4==b)&&f){var e=a.nodeValue,d=e.match(q);d&&(b=e.substring(0,d.index),a.nodeValue=b,(e=e.substring(d.index+ d[0].length))&&a.parentNode.insertBefore(l.createTextNode(e),a.nextSibling),m(a),b||a.parentNode.removeChild(a))}}function m(a){function c(a,b){var e=b?a.cloneNode(!1):a,k=a.parentNode;if(k){var k=c(k,1),d=a.nextSibling;k.appendChild(e);for(var f=d;f;f=d)d=f.nextSibling,k.appendChild(f)}return e}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;a=c(a.nextSibling,0);for(var e;(e=a.parentNode)&&1===e.nodeType;)a=e;b.push(a)}for(var t=/(?:^|\s)nocode(?:\s|$)/,q=/\r\n?|\n/,l=a.ownerDocument,n=l.createElement("li");a.firstChild;)n.appendChild(a.firstChild); for(var b=[n],p=0;p=+m[1],d=/\n/g,t=a.a,q=t.length,f=0,l=a.c,n=l.length,c=0,b=a.g,p=b.length,w=0;b[p]=q;var r,e;for(e=r=0;e=h&&(c+=2);f>=k&&(w+=2)}}finally{g&&(g.style.display=a)}}catch(y){D.console&&console.log(y&&y.stack||y)}}var D="undefined"!==typeof window? window:{},B=["break,continue,do,else,for,if,return,while"],F=[[B,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,restrict,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],H=[F,"alignas,alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,noexcept,noreturn,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"], O=[F,"abstract,assert,boolean,byte,extends,finally,final,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],P=[F,"abstract,add,alias,as,ascending,async,await,base,bool,by,byte,checked,decimal,delegate,descending,dynamic,event,finally,fixed,foreach,from,get,global,group,implicit,in,interface,internal,into,is,join,let,lock,null,object,out,override,orderby,params,partial,readonly,ref,remove,sbyte,sealed,select,set,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,value,var,virtual,where,yield"], F=[F,"abstract,async,await,constructor,debugger,enum,eval,export,function,get,import,implements,instanceof,interface,let,null,of,set,undefined,var,with,yield,Infinity,NaN"],Q=[B,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],R=[B,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"], B=[B,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],S=/^(DIR|FILE|array|vector|(de|priority_)?queue|(forward_)?list|stack|(const_)?(reverse_)?iterator|(unordered_)?(multi)?(set|map)|bitset|u?(int|float)\d*)\b/,W=/\S/,X=x({keywords:[H,P,O,F,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",Q,R,B],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}), I={};t(X,["default-code"]);t(G([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),"default-markup htm html mxml xhtml xml xsl".split(" "));t(G([["pln",/^[\s]+/, null," \t\r\n"],["atv",/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],["pun",/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]); t(G([],[["atv",/^[\s\S]+/]]),["uq.val"]);t(x({keywords:H,hashComments:!0,cStyleComments:!0,types:S}),"c cc cpp cxx cyc m".split(" "));t(x({keywords:"null,true,false"}),["json"]);t(x({keywords:P,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:S}),["cs"]);t(x({keywords:O,cStyleComments:!0}),["java"]);t(x({keywords:B,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);t(x({keywords:Q,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);t(x({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END", hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]);t(x({keywords:R,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);t(x({keywords:F,cStyleComments:!0,regexLiterals:!0}),["javascript","js","ts","typescript"]);t(x({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0, regexLiterals:!0}),["coffee"]);t(G([],[["str",/^[\s\S]+/]]),["regex"]);var Y=D.PR={createSimpleLexer:G,registerLangHandler:t,sourceDecorator:x,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:D.prettyPrintOne=function(a,d,f){f=f||!1;d=d||null;var c=document.createElement("div");c.innerHTML="
"+a+"
"; c=c.firstChild;f&&L(c,f,!0);M({j:d,m:f,h:c,l:1,a:null,i:null,c:null,g:null});return c.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function f(){for(var c=D.PR_SHOULD_USE_CONTINUATION?b.now()+250:Infinity;p>=|>=|>>|===|==|\.\.\.|&&=|\.\.<|!==|!=|&=|~=|~|\(|\)|\[|\]|{|}|@|#|;|\.|,|:|\|\|=|\?\?|\|\||&&|&\*|&\+|&-|&=|\+=|-=|\/=|\*=|\^=|%=|\|=|->|`|==|\+\+|--|\/|\+|!|\*|%|<|>|&|\||\^|\?|=|-|_/,null],["typ",/^\b(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null]]),["swift"]); PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[["str",/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],["str",/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']+)\)/i],["kwd",/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//], ["com",/^(?:\x3c!--|--\x3e)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#(?:[0-9a-f]{3}){1,2}\b/i],["pln",/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],["pun",/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^\)\"\']+/]]),["css-str"]); PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["com",/^%[^\r\n]*/,null,"%"]],[["kwd",/^\\[a-zA-Z@]+/],["kwd",/^\\./],["typ",/^[$&]/],["lit",/[+-]?(?:\.\d+|\d+(?:\.\d*)?)(cm|em|ex|in|pc|pt|bp|mm)/i],["pun",/^[{}()\[\]=]+/]]),["latex","tex"]); PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])*(?:\'|$))/,null,"\"'"]],[["com",/^--(?:\[(=*)\[[\s\S]*?(?:\]\1\]|$)|[^\r\n]*)/],["str",/^\[(=*)\[[\s\S]*?(?:\]\1\]|$)/],["kwd",/^(?:and|break|do|else|elseif|end|false|for|function|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,null],["lit",/^[+-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i], ["pln",/^[a-z_]\w*/i],["pun",/^[^\w\t\n\r \xA0][^\w\t\n\r \xA0\"\'\-\+=]*/]]),["lua"]); ]]>
\ "); /* CONTROL STRIP TEMPLATES */ ips.templates.set('core.controlStrip.menu', " \ \ "); ips.templates.set('core.controlStrip.menuItem', " \ \ "); ips.templates.set('core.controlStrip.dropdown', " \
  • \ \ \ \
  • \ "); /* TOGGLE TEMPLATES */ ips.templates.set('core.forms.toggle', " \ \ \ \ "); /* TREES */ ips.templates.set('core.trees.childWrapper', " \ {{{content}}}\ "); ips.templates.set('core.trees.loadingRow', " \
    1. {{#lang}}loading{{/lang}}
    \ "); ips.templates.set('core.trees.loadingPane', " \
     
    \ "); ips.templates.set('core.trees.noRows', " \
    {{#lang}}no_results{{/lang}}
    \ "); /* LIVE SEARCH */ ips.templates.set('core.livesearch.noResults', " \
  • \

    \
  • \ "); /* LANGUAGES */ ips.templates.set('languages.translateString', " \ \ "); /* Guide search result */ ips.templates.set('support.guideSearch', " \
  • \ {{title}}\
  • \ "); ips.templates.set('support.guideSearch.noResults', " \
  • \ {{#lang}}no_results{{/lang}}\
  • \ "); ips.templates.set('support.ticket.supportSummary', " \
    \ {{#lang}}health_ticket_beforeproceeding{{/lang}}\
    \ ");]]>
    \
    \

    \
      \
    • \ \
    • \
    • \ \
    • \
    \ {{name}} {{#by}}By {{by}}{{/by}}\

    \
    \ {{content}}\
    \
    \ \ "); ips.templates.set('dashboard.menuItem', " \
  • \ {{name}}\
  • \ ");]]>
    \
    \
    \ \ \ ");]]>
    \ \ \ {{#lang}}menuManagerNewItem{{/lang}}\ \ \ "); ips.templates.set( 'menuManager.temporaryMenuItem', "\ \ "); ips.templates.set( 'menuManager.emptyList', "\
  • {{#lang}}menuManagerEmptyList{{/lang}}
  • \ ");]]>
    \ {{title}} \ \ "); ips.templates.set('templates.editor.tabPanel', " \ \ "); ips.templates.set('templates.editor.tabContent', " \ \ \ "); ips.templates.set('templates.editor.unsaved', " \ \ "); ips.templates.set('templates.editor.saved', " \ \ "); ips.templates.set('templates.editor.diffHeaders', " \
    \
    \
    {{#lang}}theme_diff_original_header{{/lang}} {{#lang}}theme_diff_original_desc{{/lang}}
    \
    \
    \
    {{#lang}}theme_diff_custom_header{{/lang}} {{#lang}}theme_diff_custom_desc{{/lang}}
    \
    \
    \ "); ips.templates.set('templates.editor.diffHeadersParent', " \
    \
    \
    {{#lang}}theme_diff_parent_header{{/lang}} {{#lang}}theme_diff_original_desc{{/lang}}
    \
    \
    \
    {{#lang}}theme_diff_custom_header{{/lang}} {{#lang}}theme_diff_custom_desc{{/lang}}
    \
    \
    \ "); ]]>
        {{text}}\ "); ips.templates.set('core.general.ajax', " \
      {{#lang}}loading{{/lang}}...
    \ "); ips.templates.set('core.general.flashMsg', " \ \ "); ips.templates.set('core.hovercard.loading', " \ \ "); /* POST CONTENT */ ips.templates.set('core.posts.spoiler', " \ {{#lang}}spoilerClickToReveal{{/lang}}\ "); ips.templates.set('core.posts.spoilerOpen', " \ {{#lang}}spoilerClickToHide{{/lang}}\ "); ips.templates.set('core.posts.multiQuoteOff', " \ \ "); ips.templates.set('core.posts.multiQuoteOn', " \ \ "); ips.templates.set('core.posts.multiQuoter', " \
    \   \
    \ "); ips.templates.set('core.menus.menuItem', " \
  • \ {{title}}\
  • \ "); ips.templates.set('core.menus.menuSep', " \

  • \ "); ips.templates.set('core.posts.quotedSpoiler', " \

    {{#lang}}quotedSpoiler{{/lang}}

    \ "); /* NOTIFICATION TEMPLATE */ ips.templates.set('core.postNotify.single', " \ \    {{{text}}}\    {{#lang}}showReply{{/lang}}\ \ "); ips.templates.set('core.postNotify.multiple', " \ \ {{text}}\    {{#lang}}showReplies{{/lang}}\ \ "); ips.templates.set('core.postNotify.multipleSpillOver', " \ \ {{text}}\ {{#canLoadNew}}\    {{showFirstX}}\    {{#lang}}showRepliesOr{{/lang}}\ {{/canLoadNew}}\    {{#lang}}goToNewestPage{{/lang}}\ \ "); ips.templates.set('core.notification.flashSingle', " \ \ \ \ "); ips.templates.set('core.notification.flashMultiple', " \ \ "); /* ALERTS */ ips.templates.set('core.alert.box', " \ \ "); ips.templates.set('core.alert.subText', " \
    {{text}}
    \ "); ips.templates.set('core.alert.subTextHtml', " \
    {{{text}}}
    \ "); ips.templates.set('core.alert.icon', " \ \ "); ips.templates.set('core.alert.button', " \
  • \ "); ips.templates.set('core.alert.prompt', " \

    \ \

    \ "); /* LIGHTBOX TEMPLATES */ ips.templates.set('core.lightbox.meta', "{{title}}"); ips.templates.set('core.lightbox.toolsMenu', " \ \ \ \ \ \ \ "); /* DIALOG TEMPLATES */ ips.templates.set('core.dialog.main', " \ \ ") /* TOOLTIP TEMPLATE */ ips.templates.set('core.tooltip', " \ \ "); /* SEARCH TEMPLATES */ ips.templates.set('core.search.loadingPanel', " \
    \  \
    \ "); /* EDITOR TEMPLATES */ ips.templates.set('core.editor.panelWrapper', " \
    \ {{content}}\
    \ "); ips.templates.set('core.editor.giphy', " \ \ "); ips.templates.set('core.editor.giphyThumb', " \
    {{title}}
    \ "); ips.templates.set('core.editor.giphyRow', " \
    {{{gifs}}}
    \ "); ips.templates.set('core.editor.pixabayThumb', " \
    \ "); ips.templates.set('core.editor.pixabayRow', " \
    {{{images}}}
    \ "); ips.templates.set('core.editor.emoticons', " \ \ "); ips.templates.set('core.editor.emoticonSection', " \
    {{{content}}}
    \ "); ips.templates.set('core.editor.emoticonMenu', " \ \ "); ips.templates.set('core.editor.emoticonCategory', " \
    {{title}}
    \
    {{{emoticons}}}
    \ "); ips.templates.set('core.editor.emoticonSearch', " \
    {{{emoticons}}}
    \ "); ips.templates.set('core.editor.emoticonRow', " \
    {{{emoticons}}}
    \ "); ips.templates.set('core.editor.emoticonItem', " \
    {{{img}}}
    \ "); ips.templates.set('core.editor.emoji', " \
    {{{display}}}
    \ "); ips.templates.set('core.editor.emojiNotNative', " \
    {{{img}}}
    \ "); ips.templates.set('core.editor.emoticonBlank', " \
     
    \ "); ips.templates.set('core.editor.emoticonNoResults', " \
    {{#lang}}no_results{{/lang}}
    \ "); ips.templates.set('core.editor.emojiResult', " \
  • \ {{{emoji}}} {{short_code}}\
  • \ "); ips.templates.set('core.editor.quote', "
    {{citation}}
    {{{contents}}}
    "); ips.templates.set('core.editor.legacyQuoteUpcast', "
    {{citation}}
    {{{contents}}}
    "); ips.templates.set('core.editor.citation', " \
    \  \ {{#contenturl}}\ \ {{/contenturl}}\ {{{citation}}}\
    \ "); ips.templates.set('core.editor.citationLink', " \ {{username}}\ "); ips.templates.set('core.editor.spoiler', "
    {{#lang}}editorSpoiler{{/lang}}
    "); ips.templates.set('core.editor.legacySpoilerUpcast', "
    {{#lang}}editorSpoiler{{/lang}}
    {{{contents}}}
    "); ips.templates.set('core.editor.spoilerHeader', " \
    \  \ {{#lang}}spoilerClickToReveal{{/lang}}\
    \ "); ips.templates.set('core.editor.initLoading', " \
     
    \ "); ips.templates.set('core.editor.previewLoading', " \
    \  \
    \ "); ips.templates.set('core.editor.stockReplies', " \ \ "); ips.templates.set('core.editor.editorStockRepliesWrap', " \
    {{{content}}}
    \ "); ips.templates.set('core.editor.editorStockRepliesRow', " \
    {{{title}}}
    \ "); /* ATTACHMENT TEMPLATES */ ips.templates.set('core.attachments.metaInfo', " \ {{size}} · {{downloads}} \ "); ips.templates.set('core.attachments.attachmentPreview', " \ {{title}}{{#lang}}attachmentPending{{/lang}} \ "); ips.templates.set('core.attachments.fileItemWrapper', " \
    {{{content}}}
    \ "); ips.templates.set('core.attachments.fileItem', " \
    \
    \ {{#thumb}}\ {{{thumb}}}\ {{/thumb}}\
    \ \
    \
    \
    \

    {{title}}

    \

    \ {{size}} {{#statusText}}· {{statusText}}{{/statusText}}\

    \ {{#status}}{{/status}}\ \
    \ {{#supportsDelete}}\
    \ \ \ ×\ \
    \ {{/supportsDelete}}\ {{^supportsDelete}}\
    \ \ ×\
    \ {{/supportsDelete}}\
    \ "); ips.templates.set('core.attachments.imageItem', " \
    \
    \ {{#thumb}}\ {{{thumb}}}\ {{/thumb}}\
    \ \
    \
    \
    \

    {{title}}

    \

    \ {{size}} {{#statusText}}· {{statusText}}{{/statusText}}\

    \ {{#status}}{{/status}}\ \
    \ {{#supportsDelete}}\
    \ \ \ ×\ \
    \ {{/supportsDelete}}\ {{^supportsDelete}}\
    \ \ ×\
    \ {{/supportsDelete}}\
    \ "); ips.templates.set('core.attachments.videoItem', " \
    \
    \ {{#thumb}}\ \ {{/thumb}}\
    \ \
    \
    \
    \

    {{title}}

    \

    \ {{size}} {{#statusText}}· {{statusText}}{{/statusText}}\

    \ {{#status}}{{/status}}\ \
    \ {{#supportsDelete}}\
    \ \ \ ×\ \
    \ {{/supportsDelete}}\ {{^supportsDelete}}\
    \ \ ×\
    \ {{/supportsDelete}}\
    \ "); ips.templates.set('core.attachments.audioItem', " \
    \
    \ {{#thumb}}\ \ {{/thumb}}\
    \ \
    \
    \
    \

    {{title}}

    \

    \ {{size}} {{#statusText}}· {{statusText}}{{/statusText}}\

    \ {{#status}}{{/status}}\ \
    \ {{#supportsDelete}}\
    \ \ \ ×\ \
    \ {{/supportsDelete}}\ {{^supportsDelete}}\
    \ \ ×\
    \ {{/supportsDelete}}\
    \ "); ips.templates.set('core.attachments.imageItemWrapper', " \
    {{{content}}}
    \ "); /* FORM TEMPLATES */ ips.templates.set('core.autocomplete.field', " \
    \ \
    • {{content}}
    \
    \ "); ips.templates.set('core.autocomplete.addToken', " \ {{text}} \ "); ips.templates.set('core.autocomplete.resultWrapper', " \ \ "); ips.templates.set('core.autocomplete.searchTypeAhead', " \
    \
    \ \
    \
    \ "); ips.templates.set('core.autocomplete.resultItem', " \
  • \
    \ {{html}}\
    \
  • \ "); ips.templates.set('core.autocomplete.tagsResultItem', " \
  • \
    \ {{html}}\ {{#recommended}}\ {{#lang}}tag_recommended{{/lang}}\ {{/recommended}}\
    \
  • \ "); ips.templates.set('core.autocomplete.token', " \
  • \ {{{title}}} ×\
  • \ "); ips.templates.set('core.autocomplete.memberItem', " \
  • \
    \ \
    \ {{{name}}}
    \ {{{extra}}}\
    \
    \
  • \ "); ips.templates.set('core.autocomplete.optional', " \ {{langString}}...\ "); ips.templates.set('core.forms.toggle', " \ \ \ \ "); ips.templates.set('core.forms.validationWrapper', " \
      {{content}}
    \ "); ips.templates.set('core.forms.validationItem', " \
  • {{message}}
  • \ "); ips.templates.set('core.forms.advicePopup', "\
    \
    \

    {{#lang}}password_advice_title{{/lang}}

    \

    \ {{#min}}\ {{min}} \ {{/min}}\ {{{text}}}\

    \
    \ \
    \ "); ips.templates.set('core.forms.validateOk', "\ \ \ \ "); ips.templates.set('core.forms.validateFail', "\ \ \ \ "); ips.templates.set('core.forms.validateFailText', "\

    \ {{message}}\

    \ "); /* TRUNCATE TEMPLATE */ ips.templates.set('core.truncate.expand', " \ {{text}}  \ "); /* NODE SELECT */ ips.templates.set('core.selectTree.token', " \
  • {{title}}
  • \ "); /* ACCESSIBILITY KEYBOARD NAV TEMPLATES */ ips.templates.set('core.accessibility.border', " \
    \ "); ips.templates.set('core.accessibility.arrow', " \
    \ "); /* INFINITE SCROLL */ ips.templates.set('core.infScroll.loading', " \
  • \ {{#lang}}loading{{/lang}}...\
  • \ "); ips.templates.set('core.infScroll.pageBreak', " \
  • \ {{#lang}}page{{/lang}} {{page}}\
  • \ "); ips.templates.set('core.pageAction.actionMenuItem', " \
  • \ {{#icon}}\ \ {{/icon}}\ {{^icon}}\ {{title}} \ {{/icon}}\ \
  • \ "); ips.templates.set('core.pageAction.actionItem', " \
  • \ {{#icon}}\ \ {{/icon}}\ {{^icon}}\ {{title}}\ {{/icon}}\
  • \ "); /* PAGE ACTIONS */ ips.templates.set('core.pageAction.wrapper', " \
    \
      \
    • {{{selectedLang}}}
    • \ {{{content}}}\
    \
    \ "); /* CAROUSEL */ ips.templates.set('core.carousel.bulletWrapper', "\
      {{content}}
    \ "); ips.templates.set('core.carousel.bulletItem', "\
  • \ "); /* RATINGS */ ips.templates.set('core.rating.wrapper', "\
    \
      \ {{{content}}}\
    \
    \ {{status}}\ ") ips.templates.set('core.rating.star', "\
  • \ "); ips.templates.set('core.rating.halfStar', "\
  • \ "); ips.templates.set('core.rating.loading', "\ \ "); /* SIDEBAR MANAGER */ ips.templates.set('core.sidebar.managerWrapper', " \
    \
    \

    {{#lang}}sidebarManager{{/lang}}

    \

    {{#lang}}sidebarManagerDesc{{/lang}}

    \

    {{#lang}}sidebarManagerDesc2{{/lang}}

    \
    \
    \
    \ \
    \
    \ "); ips.templates.set('core.sidebar.blockManage', " \
    \

    {{title}}

    \ \ \
    \
    \
    \ "); ips.templates.set('core.sidebar.blockManageNoConfig', " \
    \

    {{title}}

    \ \
    \ "); ips.templates.set('core.sidebar.blockIsEmpty', " \
    \ {{text}}\
    \ "); /* FOLLOW BUTTON LOADING */ ips.templates.set('core.follow.loading', " \
    \ "); /* STATUS TEMPLATES */ ips.templates.set('core.statuses.loadingComments', " \    {{#lang}}loadingComments{{/lang}}\ "); /* STACKS */ ips.templates.set('core.forms.stack', " \
  • \ \ \ \ \ ×\ \
    \ {{{field}}}\
    \
  • \ "); /* POLLS */ ips.templates.set('core.pollEditor.question', " \
    \
    \ \
    \
    \
      \
    • \

       

      \

      {{#lang}}choicesTitle{{/lang}}

      \ {{#showCounts}}\

      {{#lang}}votesTitle{{/lang}}

      \ {{/showCounts}}\

       

      \
    • \ {{{choices}}}\
    \
    \
    \

     

    \ \
    \
    \
    \ "); ips.templates.set('core.pollEditor.choice', " \
  • \
    \ {{choiceID}}\
    \
    \ \
    \
    \ \
    \
  • \ "); /* COVER PHOTOS */ ips.templates.set('core.coverPhoto.controls', " \ \ "); /* PATCHWORK */ ips.templates.set('core.patchwork.imageList', " \ {{#showThumb}}\
  • \ {{/showThumb}}\ {{^showThumb}}\
  • \ {{/showThumb}}\ \ {{#showThumb}}{{image.title}}{{/showThumb}}\
    \ \
    \ {{image.caption}}\ {{#lang}}by{{/lang}} {{image.author.name}}\
    \
    \
      \ {{#image.unread}}\
    • \ \
    • \ {{/image.unread}}\ {{#image.hasState}}\
    • \ {{#image.state.hidden}}\ \ {{/image.state.hidden}}\ {{#image.state.pending}}\ \ {{/image.state.pending}}\ {{#image.state.pinned}}\ \ {{/image.state.pinned}}\ {{#image.state.featured}}\ \ {{/image.state.featured}}\
    • \ {{/image.hasState}}\ {{#image.allowComments}}\
    • {{image.comments}}
    • \ {{/image.allowComments}}\
    \
    \ {{#image.modActions}}\ \ {{/image.modActions}}\
  • \ "); /* Editor preference */ ips.templates.set('core.editor.preferences', " \
    \
    \ {{#lang}}papt_warning{{/lang}} \
    \
    \
      \
    • \
      \ \ \
      \
    • \
    \
    \ \
    \
    \ "); /* Pagination */ ips.templates.set('core.pagination', " \ \ "); /* selective quoting */ ips.templates.set('core.selection.quote', " \ \ "); /* Content item selector */ ips.templates.set('core.contentItem.resultItem', " \
  • \
    \ {{{html}}}\
    \
  • \ "); ips.templates.set('core.contentItem.field', " \
    \ \
    • {{content}}
    \
    \ "); ips.templates.set('core.contentItem.resultWrapper', " \ \ "); ips.templates.set('core.contentItem.item', " \
  • \ × {{{html}}} \
  • \ "); /* PROMOTES */ ips.templates.set('promote.imageUpload', " \
    \
    \ {{#thumbnail}}{{/thumbnail}}\
    \
      \
    • \ \ \
    • \
    \ \
    \ "); /* TABLE ROW LOADING */ ips.templates.set('table.row.loading', " \
  • \
    \ \ \
    \
  • \ "); /* LICENSE RENEWAL */ ips.templates.set('licenseRenewal.wrapper', " \
    \
    \
    \
    \

    {{#lang}}licenseRenewalTitle{{/lang}}

    \

    {{#lang}}licenseRenewalText{{/lang}}

    \ \
    \ \
    \
    \
    \ "); /* Browser Notifications Notices */ ips.templates.set( 'core.browserNotification.prompt' , "\
    \
    \
    \ \
    \ ×\

    {{#lang}}notificationsCallout{{/lang}}

    \

    \ {{#lang}}notificationsDefaultBlurb{{/lang}}\

    \
    \ \
    \

    \ {{#lang}}notificationsAllowPrompt{{/lang}}\

    \
    \
    \
    \
    \ "); ips.templates.set( 'core.browserNotification.missingSubscription' , "\
    \
    \
    \ \
    \ ×\

    {{#lang}}notificationsCalloutPush{{/lang}}

    \

    \ {{#lang}}notificationsDefaultBlurb{{/lang}}\

    \

    \ {{#lang}}notificationsUpgradeBlurb{{/lang}}\

    \ \

    \ {{#lang}}notificationsAllowPrompt{{/lang}}\

    \
    \
    \
    \
    \ "); ips.templates.set( 'core.notifications.pending' , "\ {{#lang}}notificationsEnabling{{/lang}}\ "); ips.templates.set( 'core.notifications.success' , "\ {{#lang}}notificationsEnabled{{/lang}}\ "); ips.templates.set( 'core.notifications.fail' , "\ {{#lang}}notificationsFailed{{/lang}}\ "); ips.templates.set( 'core.notifications.notSupported' , "\ {{#lang}}notificationsNotSupported{{/lang}}\ "); ips.templates.set( 'core.notifications.checking' , "\ {{#lang}}notificationsChecking{{/lang}}\ "); /* Warning form pre-set action list */ ips.templates.set('system.warningpenalty.nomodify', "\
      \ {{#penalties}}\
    • {{.}}
    • \ {{/penalties}}\
    \ "); ips.templates.set('core.edittags.default', "\
    \  {{#lang}}loading{{/lang}}\
    \ "); ips.templates.set('core.onlineUser.linked', "\
  • \ {{{formattedName}}}\
  • ");]]>
    \ \ \
    \ {{#lang}}clubRequestApproved{{/lang}}\ "); ips.templates.set('club.request.decline', "\ \ \ \
    \ {{#lang}}clubRequestDenied{{/lang}}\ "); ips.templates.set('club.menu.dragHandle', "\  \ ");]]>
    \
    \ {{#lang}}no_message_selected{{/lang}}\
    \ "); ips.templates.set('messages.main.folderMenu', "\
  • {{count}} {{name}}
  • \ ");]]>
    \ \ \ "); ips.templates.set('core.streams.unreadBar', "\

  • \ "); ips.templates.set('core.streams.noMore', "\
  • \ {{#lang}}noMoreActivity{{/lang}}\
  • \ "); ips.templates.set('core.streams.loadMore', "\ {{#lang}}loadNewActivity{{/lang}}\ ");]]>
    \ {{/hasNotifications}}\ {{^hasNotifications}}\ \ {{/hasNotifications}}\ {{text}}\ ");]]> {{title}}\ "); ips.templates.set('vse.classes.item', " \
  • \ {{#swatch.back}}\ \ {{/swatch.back}}\ {{^swatch.back}}\ ×\ {{/swatch.back}}\ {{#swatch.fore}}\ \ {{/swatch.fore}}\ {{^swatch.fore}}\ ×\ {{/swatch.fore}}\ {{title}}\
  • \ "); ips.templates.set('vse.panels.header', " \

    {{title}}

    \ {{#desc}}\

    \ {{desc}}\

    \ {{/desc}}\
    \ "); ips.templates.set('vse.panels.wrapper', " \
    \ {{{content}}}\
    \ "); ips.templates.set('vse.panels.background', " \

    {{#lang}}vseBackground{{/lang}}

    \
    \
    \
     
    \
    \
    \ \
    \
    \ \
    \ \
    \
    \
    \
    \ "); ips.templates.set('vse.panels.font', " \

    {{#lang}}vseFont_color{{/lang}}

    \ \ "); ips.templates.set('vse.gradient.editor', " \
    \
    \ \ \ \ \
    \
    \ \
    \
    \ {{{buttons}}}\
    \ "); ips.templates.set('vse.gradient.twoButtons', "\ \ \ "); ips.templates.set('vse.gradient.threeButtons', "\ \ \ \ "); ips.templates.set('vse.gradient.stop', " \
  • \ \ \ \

    \
  • \ "); ips.templates.set('vse.colorizer.panel', " \

    \ {{#lang}}vseColorizer_desc{{/lang}}\

    \
    \
    \
    \ \ {{#lang}}vseColorizer_primary{{/lang}}\
    \
    \
    \ \ {{#lang}}vseColorizer_secondary{{/lang}}\
    \
    \
    \
    \ \ {{#lang}}vseColorizer_text{{/lang}}\
    \

    \ \
    \ \
    \ ");]]>
    3 ){ _buildMenu( buttons ); } // Set up the events we'll handle here elem .on( 'click', '[data-replace], [data-remove], [data-bubble]', _remoteAction ); }, _remoteAction = function (e) { e.preventDefault(); var link = $( e.currentTarget ); var url = link.attr('href'); ips.getAjax()( url, { dataType: 'json', showLoading: true }) .done( function (response) { if( link.is('[data-replace]') ){ _replaceButton( link, response ); } else if( link.is('[data-remove]') ){ _removeButton( link, response ); } else if( link.is('[data-bubble]') ){ _bubbleAction( link, response ); } }) .fail( function () { window.location = url; }); }, /** * Simply triggers an event that bubbles up, which can be caught by page controllers/widgets. * * @param {element} link Link element that was clicked * @param {object} response Response object from the ajax request * @returns {void} */ _bubbleAction = function (link, response) { link.trigger( 'buttonAction', response ); }, /** * Event handler for a button that replaces itself with a different button when clicked * * @param {element} link Link element that was clicked * @param {object} response Response object from the ajax request * @returns {void} */ _replaceButton = function (link, response) { ips.ui.flashMsg.show( response ); var item = link.closest('.ipsControlStrip_button, .ipsControlStrip_menuItem'); var newItem = $('#' + link.attr('data-replacewith') ); if( item.hasClass('ipsControlStrip_button') ){ item.hide(); newItem.show(); } else { if( !newItem.hasClass('ipsControlStrip_menuItem') ){ var newHTML = _getMenuItemFromButton( newItem ); item.hide().after( newHTML ); } else { item.hide(); newItem.show(); } } }, /** * Event handler for a button that removes itself after being clicked * * @param {element} link Link element that was clicked * @param {object} response Response object from the ajax request * @returns {void} */ _removeButton = function (link, response) { ips.ui.flashMsg.show( response ); var dropdown = $( elem ).find('[data-dropdown]'); // Do we have any others to remove too? if( link.attr('data-alsoremove') ){ var also = ips.utils.getIDsFromList( link.attr('data-alsoremove') ); } // Get a jquery object containing the buttons or menu items for each item to remove var toRemove = $( link ).add( also || '' ).closest('.ipsControlStrip_button, .ipsControlStrip_menuItem'); // .. and then remove them. toRemove.remove(); // See if we need to remove the menu & dropdown if( dropdown.length ){ var menu = $( dropdown.attr('id') + '_menu' ); if( !menu.find('.ipsControlStrip_menuItem').length ){ menu.remove(); dropdown.remove(); } } }, /** * Builds a dropdown menu by slicing off excess menu items, and manipulating the links to * turn them into menu items. Then an ipsMenu widget is created to control the menu. * * @param {array} buttons jQuery array of buttons in the control strip * @returns {void} */ _buildMenu = function (buttons) { var buttonsToMove = buttons.slice(2); var menu = ips.templates.render('core.controlStrip.menu', { id: elem.identify().attr('id') + '_more', content: _moveButtonsToMenu( buttonsToMove ) }); $( elem ).after( menu ); // Remove buttons buttonsToMove.remove(); // Add a menu dropdown to the strip and set up the menu elem .css({ position: 'relative' }) .find('.ipsControlStrip_button') .last() .after( ips.templates.render('core.controlStrip.dropdown', { id: elem.identify().attr('id') + '_more' })); elem .parent() .wrapInner( $('
    ').css( { position: 'relative' } ) ) // wrapInner so that the menu is positioned properly in firefox .find('[data-dropdown]') .attr('aria-haspopup', 'true') .ipsMenu( { appendTo: '#' + elem.parent().identify().attr('id') }); $( document ).trigger( 'contentChange', [ elem ] ); }, /** * Creates dropdown menu items for each of the buttons in the provided array * * @param {array} buttons jQuery array of buttons to be turned into menu items * @returns {string} Menu contents (all items concatenated into a string) */ _moveButtonsToMenu = function (buttons) { var menuContent = ''; for (var i = 0; i < buttons.length; i++){ menuContent += _getMenuItemFromButton( buttons[i] ); } return menuContent; }, /** * Builds an individual menu item from a provided button * * @param {element} button Button element to build from * @returns {string} Menu item HTML */ _getMenuItemFromButton = function (button) { var buttonLink = $( button ).find('> a'); //buttonLink.find('.ipsControlStrip_icon').after( '  ' + buttonLink.attr('title') ); $( button ).find('[data-ipsTooltip]').removeAttr('data-ipsTooltip'); return ips.templates.render('core.controlStrip.menuItem', { id: $( button ).attr('id') || '', item: $( button ).html() }); }; init(); return { }; }; }(jQuery, _));]]> 0 ){ elem.find('.ipsMatrix_empty').addClass('ipsHide'); } else { elem.find('.ipsMatrix_empty').removeClass('ipsHide'); } }, /** * Event handler for clicking an input within a cell * Simply stops propagation * * @param {event} e Event object * @returns {void} */ _clickInputInCell = function (e) { e.stopPropagation(); }, /** * Hooks into the submit event for the form, to wipe out the name on the blank row inputs * * @param {event} e Event object * @returns {void} */ _submitForm = function (e) { // Remove names from the inputs in the blank row elem.find('[data-matrixrowid]:hidden') .find('input, select, textarea') .attr( 'name', '' ) .prop( 'disabled', true ); // Are we squashing fields? if( !options.squashFields ){ return; } // Get all values from the matrix var formElements = elem.find('[data-matrixid] *').filter(':input:enabled:not([data-role="noMatrixSquash"])'); var output = ips.utils.form.serializeAsObject( formElements ); var matrixID = elem.find('[data-matrixid]').attr('data-matrixid'); var newInput = $('').attr('type', 'hidden').attr('name', matrixID + '_squashed'); // JSON encode the data Debug.log("Before encoding, matrix data is:"); Debug.log( output ); output = JSON.stringify( output ); // Add a new hidden form field elem.prepend( newInput.val( output ) ); // Disable all of the elements we squashed so that they don't get sent formElements.prop('disabled', true); }, /** * Initializes the blank row by removing the required attribute, and hiding it * * @returns {void} */ _setUpManageable = function () { elem.find('tr:last-child').find('input, select[required], textarea').removeAttr('required'); elem.find('tbody tr:not( .ipsMatrix_empty ):last-child').hide(); }; init(); return { init: init, checkRows: _checkRows }; }; }(jQuery, _));]]> /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * * ips.ui.statusToggle.js - Toggles things between enabled/disabled, online/offline etc. * * Author: Rikki Tissier */ ;( function($, _, undefined){ "use strict"; ips.createModule('ips.ui.statusToggle', function(){ /** * Respond method for statusToggles * Finds the active item, and determines the next state. Fires an ajax request to set the state, * and updates the badge shown as needed. * * @param {element} elem The element the widget is registered on * @param {object} options Options object for this widget instance * @param {event} e Event object * @returns {void} */ var respond = function (elem, options, e) { e.preventDefault(); elem = $( elem ); if( elem.attr('data-loading') ){ return; } // What's selected now? var currentBadge = elem.find('[data-state]:visible'); var currentState = currentBadge.attr('data-state'); var url = currentBadge.attr('href'); // Don't do anything if the button opens a dialog if ( currentBadge.attr('data-ipsdialog' ) ) { return; } var nextState; if( options.intermediate ){ nextState = ( currentState == 'enabled' ) ? 'intermediate' : ( currentState == 'disabled' ) ? 'enabled' : 'disabled'; } else { nextState = ( currentState == 'enabled' ) ? 'disabled' : 'enabled'; } var nextBadge = elem.find('[data-state="' + nextState + '"]'); if( !nextBadge.length ){ Debug.warn( "No badge found for " + nextState + " state"); return; } elem.attr( 'data-loading', true ); currentBadge.css({ opacity: "0.5" }); // Send ajax request to make the change ips.getAjax()( url, { showLoading: true // show our global loading indicator }) .done( function (response) { currentBadge.hide().css({ opacity: "1" }); nextBadge.show(); elem.removeAttr('data-loading'); // Trigger an event to let the page know elem.trigger( 'stateChanged', { status: nextState }); }) .fail( function (jqXHR, textStatus, errorThrown) { window.location = url; }); }; ips.ui.registerWidget( 'statusToggle', ips.ui.statusToggle, [ 'intermediate' ], { lazyLoad: true, lazyEvent: 'click' } ); return { respond: respond }; }); }(jQuery, _)); ol').length ){ ips.utils.anim.go( 'fadeOut fast', realRow.find('> ol') ); } }, /** * Opens a closed row * * @param {element} row The row to open * @returns {void} */ _openRow = function (row) { row.removeClass( options.closedClass ).addClass( options.openClass ); var realRow = row.closest('[data-role="node"]'); var rowID = realRow.find('[data-nodeid]').first().attr('data-nodeid'); realRow.attr('data-nodeid', rowID); if( _.isUndefined( rowID ) ){ Debug.warn( 'No rowID for row ' + realRow.identify().attr('id') ); return; } // Do we have results loaded or loading? Show them immediately if so if( realRow.data('_childrenLoaded') || realRow.data('_childrenLoading') ){ ips.utils.anim.go('fadeInDown fast', realRow.find('> ol') ); return; } // Not loaded or loading, so we need to do that here // First build the loading box var loading = ips.templates.render('core.trees.loadingRow'); var content = ips.templates.render('core.trees.childWrapper', { content: loading }); // Set to loading, append loading content realRow .data('_childrenLoading', true) .append( content ); // Fetch real content ips.getAjax()( options.url + '&root=' + rowID ) .done( function (response) { realRow.find('> ol').remove(); realRow.find('> .ipsTree_row').after( response ); realRow .data('_childrenLoaded', true) .removeData('_childrenLoading'); // Now animate ips.utils.anim.go( 'fadeInDown', realRow.find('> ol') ); // Let document know $( document ).trigger( 'contentChange', [ realRow ] ); // Are we sorting? if( options.sortable ){ elem.find('.ipsTree_rows > .ipsTree').nestedSortable('refresh'); elem.find('.ipsTree_rows > .ipsTree').nestedSortable('refreshPositions'); //_makeSortable( realRow.find('.ipsTree_node') ); } }) .fail( function () { window.location = options.url + '&root=' + rowID; }); }, _checkParentStatus = function () { Debug.log( 'check parent status' ); // Find each tree row and loop elem.find('.ipsTree_row:not( .ipsTree_root )').each( function () { var row = $( this ); // Ignore if the row is closed since we don't know what's inside it if( row.hasClass('ipsTree_parent') && !row.hasClass('ipsTree_open') ){ return; } var subList = row.siblings('ol'); var currentlyParent = row.is('ipsTree_parent'); var hasChildren = subList.find('> li').length > 0; Debug.log( 'sublist: '); Debug.log( subList ); row.toggleClass('ipsTree_parent', hasChildren ); if( hasChildren && !currentlyParent ){ row.addClass('ipsTree_open'); } // sortable removes the
      if it's now empty, so we need to add it back here // so that the user can carry on sorting properly if( row.hasClass('ipsTree_acceptsChildren') && !subList.length ){ var newRow = $('
        ').addClass('ipsTree ipsTree_node'); row.after( newRow ); //newRow.find('li').remove(); } }); }, /** * Makes the tree sortable * * @returns {void} */ _makeSortable = function () { var sortableOptions = { placeholder: 'sortable-placeholder', handle: '.ipsTree_dragHandle', items: '[data-role="node"]', excludeRoot: true, update: function (event, ui) { var url = options.url + '&do=reorder'; var rootID = elem.find('.ipsTree_root').attr('data-nodeid'); var data = ''; // We need to run this after a short delay to let sortable clean itself up first setTimeout( function () { _checkParentStatus(); }, 200); let failed = false; if( rootID ){ url += '&root=' + rootID; // If we have a root item (that isn't technically part of the tree) we can't // use the standard serialize method or all items have the value null. Instead // we have to build a manual param string and replace null with the parent id. var dataArray = $( this ).nestedSortable( 'toArray', { key: 'ajax_order'} ); var outputArray = []; for( var i = 0; i < dataArray.length; i++ ) { let id = dataArray[i].item_id !== undefined ? dataArray[i].item_id : dataArray[i].id; if ( [undefined, null, NaN].includes(id) ) { failed = true; break; } outputArray.push( 'ajax_order[' + id + ']=' + ( ( dataArray[i].parent_id == null ) ? rootID : dataArray[i].parent_id ) ); } data = outputArray.join('&'); } else { data = $( this ).nestedSortable( 'serialize', { key: 'ajax_order' } ); } if (failed) { window.location.reload(); } data = data + '&csrfKey=' + ips.getSetting('csrfKey'); ips.getAjax()( url, { data: data, method: 'POST' }) .fail( function () { window.location = url + "&" + data; }); }, toleranceElement: '> div', listType: 'ol', isTree: true, // Called by nestedSortable to determine whether an item can be dragged into // the current location. We check for the ipsTree_acceptsChildren class which // indicates it can be a parent item. isAllowed: function (placeholder, placeholderParent, currentItem) { // Hide tooltip $('#ipsTooltip').hide(); var parent = null; // Find nearest list if( _.isUndefined( placeholderParent ) || placeholderParent === null ){ parent = elem.find('> .ipsTree_root'); } else { parent = placeholderParent.closest('[data-role="node"]').find('> .ipsTree_row'); } if( parent.hasClass('ipsTree_acceptsChildren') || ( !parent.length && !currentItem.find('> .ipsTree_row').hasClass('ipsTree_noRoot') ) ) { console.log( currentItem ); placeholder.removeAttr('data-error'); return true; } else { console.log('no'); placeholder.attr('data-error', ips.getString('cannotDragInto') ); return false; } }, // This method is triggered by nestedSortable, and we piggy pack on it to call our _openRow // method to load closed nodes. _openRow calls the refresh() method of nestedSortable to enable // the item currently being dragged to be dropped in the newly-opened list. Phew. expand: function (event, ui) { var row = $( this ).find('.mjs-nestedSortable-hovering > .ipsTree_parent[data-nodeid]').first(); if( !row.hasClass('ipsTree_open') ){ _openRow( row ); } }, // Triggered when the dom position of the item changes. // We highlight the parent of the new position so it's clearer to users where the item is going change: function (event, ui) { // Remove the class from everywhere first $( this ).find('.ipsTree_draggingInto').removeClass('ipsTree_draggingInto'); // Find the nearest list ui.placeholder.closest('[data-role="node"]').find('> .ipsTree_row').addClass('ipsTree_draggingInto'); }, // Triggered when dragging starts // Highlight the current parent start: function (event, ui) { // Find the nearest list ui.placeholder.closest('[data-role="node"]').find('> .ipsTree_row').addClass('ipsTree_draggingInto'); }, // Triggered when dragging stops // Remove all parent highlights stop: function (event, ui) { $( this ).find('.ipsTree_draggingInto').removeClass('ipsTree_draggingInto'); } }; // Locks the parents, allowing any items to be reordered but not moved out of their current list if( options.lockParents ){ sortableOptions['disableParentChange'] = true; } // Protects the root items, preventing them from being turned into subitems, or subitems to be turned into roots if( options.protectRoots ){ sortableOptions['protectRoot'] = true; } // Create the sortable elem.find('.ipsTree_rows > .ipsTree').nestedSortable( sortableOptions ); }; init(); return { init: init }; }; }(jQuery, _));]]> =0&&t<=m}}function J(n){return function(r){return null==r?void 0:r[n]}}var G=J("byteLength"),H=K(G),Q=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var X=c?function(n){return h?h(n)&&!q(n):H(n)&&Q.test(a.call(n))}:C(!1),Y=J("length");function Z(n,r){r=function(n){for(var r={},t=n.length,e=0;e":">",'"':""","'":"'","`":"`"},Cn=Ln($n),Kn=Ln(_n($n)),Jn=tn.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},Gn=/(.)^/,Hn={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Qn=/\\|'|\r|\n|\u2028|\u2029/g;function Xn(n){return"\\"+Hn[n]}var Yn=/^\s*(\w|\$)+\s*$/;var Zn=0;function nr(n,r,t,e,u){if(!(e instanceof r))return n.apply(t,u);var o=Mn(n.prototype),i=n.apply(o,u);return _(i)?i:o}var rr=j((function(n,r){var t=rr.placeholder,e=function(){for(var u=0,o=r.length,i=Array(o),a=0;a1)ur(a,r-1,t,e),u=e.length;else for(var f=0,c=a.length;f0&&(t=r.apply(this,arguments)),n<=1&&(r=null),t}}var lr=rr(cr,2);function sr(n,r,t){r=qn(r,t);for(var e,u=nn(n),o=0,i=u.length;o0?0:u-1;o>=0&&o0?a=o>=0?o:Math.max(o+f,a):f=o>=0?Math.min(o+1,f):o+f+1;else if(t&&o&&f)return e[o=t(e,u)]===u?o:-1;if(u!=u)return(o=r(i.call(e,a,f),$))>=0?o+a:-1;for(o=n>0?a:f-1;o>=0&&o0?0:i-1;for(u||(e=r[o?o[a]:a],a+=n);a>=0&&a=3;return r(n,Fn(t,u,4),e,o)}}var Ar=wr(1),xr=wr(-1);function Sr(n,r,t){var e=[];return r=qn(r,t),jr(n,(function(n,t,u){r(n,t,u)&&e.push(n)})),e}function Or(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=0;o=0}var Br=j((function(n,r,t){var e,u;return D(r)?u=r:(r=Nn(r),e=r.slice(0,-1),r=r[r.length-1]),_r(n,(function(n){var o=u;if(!o){if(e&&e.length&&(n=In(n,e)),null==n)return;o=n[r]}return null==o?o:o.apply(n,t)}))}));function Nr(n,r){return _r(n,Rn(r))}function Ir(n,r,t){var e,u,o=-1/0,i=-1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;ao&&(o=e);else r=qn(r,t),jr(n,(function(n,t,e){((u=r(n,t,e))>i||u===-1/0&&o===-1/0)&&(o=n,i=u)}));return o}function Tr(n,r,t){if(null==r||t)return er(n)||(n=jn(n)),n[Wn(n.length-1)];var e=er(n)?En(n):jn(n),u=Y(e);r=Math.max(Math.min(r,u),0);for(var o=u-1,i=0;i1&&(e=Fn(e,r[1])),r=an(n)):(e=qr,r=ur(r,!1,!1),n=Object(n));for(var u=0,o=r.length;u1&&(t=r[1])):(r=_r(ur(r,!1,!1),String),e=function(n,t){return!Er(r,t)}),Ur(n,e,t)}));function zr(n,r,t){return i.call(n,0,Math.max(0,n.length-(null==r||t?1:r)))}function Lr(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[0]:zr(n,n.length-r)}function $r(n,r,t){return i.call(n,null==r||t?1:r)}var Cr=j((function(n,r){return r=ur(r,!0,!0),Sr(n,(function(n){return!Er(r,n)}))})),Kr=j((function(n,r){return Cr(n,r)}));function Jr(n,r,t,e){A(r)||(e=t,t=r,r=!1),null!=t&&(t=qn(t,e));for(var u=[],o=[],i=0,a=Y(n);ir?(e&&(clearTimeout(e),e=null),a=c,i=n.apply(u,o),e||(u=o=null)):e||!1===t.trailing||(e=setTimeout(f,l)),i};return c.cancel=function(){clearTimeout(e),a=0,e=u=o=null},c},debounce:function(n,r,t){var e,u,o,i,a,f=function(){var c=zn()-u;r>c?e=setTimeout(f,r-c):(e=null,t||(i=n.apply(a,o)),e||(o=a=null))},c=j((function(c){return a=this,o=c,u=zn(),e||(e=setTimeout(f,r),t&&(i=n.apply(a,o))),i}));return c.cancel=function(){clearTimeout(e),e=o=a=null},c},wrap:function(n,r){return rr(r,n)},negate:fr,compose:function(){var n=arguments,r=n.length-1;return function(){for(var t=r,e=n[r].apply(this,arguments);t--;)e=n[t].call(this,e);return e}},after:function(n,r){return function(){if(--n<1)return r.apply(this,arguments)}},before:cr,once:lr,findKey:sr,findIndex:vr,findLastIndex:hr,sortedIndex:yr,indexOf:gr,lastIndexOf:br,find:mr,detect:mr,findWhere:function(n,r){return mr(n,Dn(r))},each:jr,forEach:jr,map:_r,collect:_r,reduce:Ar,foldl:Ar,inject:Ar,reduceRight:xr,foldr:xr,filter:Sr,select:Sr,reject:function(n,r,t){return Sr(n,fr(qn(r)),t)},every:Or,all:Or,some:Mr,any:Mr,contains:Er,includes:Er,include:Er,invoke:Br,pluck:Nr,where:function(n,r){return Sr(n,Dn(r))},max:Ir,min:function(n,r,t){var e,u,o=1/0,i=1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;ae||void 0===t)return 1;if(t * Steven Levithan (c) 2012-2017 MIT License * Inspired by Lea Verou's RegExp.create */ module.exports = function(XRegExp) { 'use strict'; var REGEX_DATA = 'xregexp'; var subParts = /(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g; var parts = XRegExp.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/, subParts], 'g', { conjunction: 'or' }); /** * Strips a leading `^` and trailing unescaped `$`, if both are present. * * @private * @param {String} pattern Pattern to process. * @returns {String} Pattern with edge anchors removed. */ function deanchor(pattern) { // Allow any number of empty noncapturing groups before/after anchors, because regexes // built/generated by XRegExp sometimes include them var leadingAnchor = /^(?:\(\?:\))*\^/; var trailingAnchor = /\$(?:\(\?:\))*$/; if ( leadingAnchor.test(pattern) && trailingAnchor.test(pattern) && // Ensure that the trailing `$` isn't escaped trailingAnchor.test(pattern.replace(/\\[\s\S]/g, '')) ) { return pattern.replace(leadingAnchor, '').replace(trailingAnchor, ''); } return pattern; } /** * Converts the provided value to an XRegExp. Native RegExp flags are not preserved. * * @private * @param {String|RegExp} value Value to convert. * @param {Boolean} [addFlagX] Whether to apply the `x` flag in cases when `value` is not * already a regex generated by XRegExp * @returns {RegExp} XRegExp object with XRegExp syntax applied. */ function asXRegExp(value, addFlagX) { var flags = addFlagX ? 'x' : ''; return XRegExp.isRegExp(value) ? (value[REGEX_DATA] && value[REGEX_DATA].captureNames ? // Don't recompile, to preserve capture names value : // Recompile as XRegExp XRegExp(value.source, flags) ) : // Compile string as XRegExp XRegExp(value, flags); } /** * Builds regexes using named subpatterns, for readability and pattern reuse. Backreferences in * the outer pattern and provided subpatterns are automatically renumbered to work correctly. * Native flags used by provided subpatterns are ignored in favor of the `flags` argument. * * @memberOf XRegExp * @param {String} pattern XRegExp pattern using `{{name}}` for embedded subpatterns. Allows * `({{name}})` as shorthand for `(?{{name}})`. Patterns cannot be embedded within * character classes. * @param {Object} subs Lookup object for named subpatterns. Values can be strings or regexes. A * leading `^` and trailing unescaped `$` are stripped from subpatterns, if both are present. * @param {String} [flags] Any combination of XRegExp flags. * @returns {RegExp} Regex with interpolated subpatterns. * @example * * var time = XRegExp.build('(?x)^ {{hours}} ({{minutes}}) $', { * hours: XRegExp.build('{{h12}} : | {{h24}}', { * h12: /1[0-2]|0?[1-9]/, * h24: /2[0-3]|[01][0-9]/ * }, 'x'), * minutes: /^[0-5][0-9]$/ * }); * time.test('10:59'); // -> true * XRegExp.exec('10:59', time).minutes; // -> '59' */ XRegExp.build = function(pattern, subs, flags) { flags = flags || ''; // Used with `asXRegExp` calls for `pattern` and subpatterns in `subs`, to work around how // some browsers convert `RegExp('\n')` to a regex that contains the literal characters `\` // and `n`. See more details at . var addFlagX = flags.indexOf('x') > -1; var inlineFlags = /^\(\?([\w$]+)\)/.exec(pattern); // Add flags within a leading mode modifier to the overall pattern's flags if (inlineFlags) { flags = XRegExp._clipDuplicates(flags + inlineFlags[1]); } var data = {}; for (var p in subs) { if (subs.hasOwnProperty(p)) { // Passing to XRegExp enables extended syntax and ensures independent validity, // lest an unescaped `(`, `)`, `[`, or trailing `\` breaks the `(?:)` wrapper. For // subpatterns provided as native regexes, it dies on octals and adds the property // used to hold extended regex instance data, for simplicity. var sub = asXRegExp(subs[p], addFlagX); data[p] = { // Deanchoring allows embedding independently useful anchored regexes. If you // really need to keep your anchors, double them (i.e., `^^...$$`). pattern: deanchor(sub.source), names: sub[REGEX_DATA].captureNames || [] }; } } // Passing to XRegExp dies on octals and ensures the outer pattern is independently valid; // helps keep this simple. Named captures will be put back. var patternAsRegex = asXRegExp(pattern, addFlagX); // 'Caps' is short for 'captures' var numCaps = 0; var numPriorCaps; var numOuterCaps = 0; var outerCapsMap = [0]; var outerCapNames = patternAsRegex[REGEX_DATA].captureNames || []; var output = patternAsRegex.source.replace(parts, function($0, $1, $2, $3, $4) { var subName = $1 || $2; var capName; var intro; var localCapIndex; // Named subpattern if (subName) { if (!data.hasOwnProperty(subName)) { throw new ReferenceError('Undefined property ' + $0); } // Named subpattern was wrapped in a capturing group if ($1) { capName = outerCapNames[numOuterCaps]; outerCapsMap[++numOuterCaps] = ++numCaps; // If it's a named group, preserve the name. Otherwise, use the subpattern name // as the capture name intro = '(?<' + (capName || subName) + '>'; } else { intro = '(?:'; } numPriorCaps = numCaps; return intro + data[subName].pattern.replace(subParts, function(match, paren, backref) { // Capturing group if (paren) { capName = data[subName].names[numCaps - numPriorCaps]; ++numCaps; // If the current capture has a name, preserve the name if (capName) { return '(?<' + capName + '>'; } // Backreference } else if (backref) { localCapIndex = +backref - 1; // Rewrite the backreference return data[subName].names[localCapIndex] ? // Need to preserve the backreference name in case using flag `n` '\\k<' + data[subName].names[localCapIndex] + '>' : '\\' + (+backref + numPriorCaps); } return match; }) + ')'; } // Capturing group if ($3) { capName = outerCapNames[numOuterCaps]; outerCapsMap[++numOuterCaps] = ++numCaps; // If the current capture has a name, preserve the name if (capName) { return '(?<' + capName + '>'; } // Backreference } else if ($4) { localCapIndex = +$4 - 1; // Rewrite the backreference return outerCapNames[localCapIndex] ? // Need to preserve the backreference name in case using flag `n` '\\k<' + outerCapNames[localCapIndex] + '>' : '\\' + outerCapsMap[+$4]; } return $0; }); return XRegExp(output, flags); }; }; },{}],2:[function(require,module,exports){ /*! * XRegExp.matchRecursive 3.2.0 * * Steven Levithan (c) 2009-2017 MIT License */ module.exports = function(XRegExp) { 'use strict'; /** * Returns a match detail object composed of the provided values. * * @private */ function row(name, value, start, end) { return { name: name, value: value, start: start, end: end }; } /** * Returns an array of match strings between outermost left and right delimiters, or an array of * objects with detailed match parts and position data. An error is thrown if delimiters are * unbalanced within the data. * * @memberOf XRegExp * @param {String} str String to search. * @param {String} left Left delimiter as an XRegExp pattern. * @param {String} right Right delimiter as an XRegExp pattern. * @param {String} [flags] Any native or XRegExp flags, used for the left and right delimiters. * @param {Object} [options] Lets you specify `valueNames` and `escapeChar` options. * @returns {Array} Array of matches, or an empty array. * @example * * // Basic usage * var str = '(t((e))s)t()(ing)'; * XRegExp.matchRecursive(str, '\\(', '\\)', 'g'); * // -> ['t((e))s', '', 'ing'] * * // Extended information mode with valueNames * str = 'Here is
        an
        example'; * XRegExp.matchRecursive(str, '', '
    ', 'gi', { * valueNames: ['between', 'left', 'match', 'right'] * }); * // -> [ * // {name: 'between', value: 'Here is ', start: 0, end: 8}, * // {name: 'left', value: '
    ', start: 8, end: 13}, * // {name: 'match', value: '
    an
    ', start: 13, end: 27}, * // {name: 'right', value: '
    ', start: 27, end: 33}, * // {name: 'between', value: ' example', start: 33, end: 41} * // ] * * // Omitting unneeded parts with null valueNames, and using escapeChar * str = '...{1}.\\{{function(x,y){return {y:x}}}'; * XRegExp.matchRecursive(str, '{', '}', 'g', { * valueNames: ['literal', null, 'value', null], * escapeChar: '\\' * }); * // -> [ * // {name: 'literal', value: '...', start: 0, end: 3}, * // {name: 'value', value: '1', start: 4, end: 5}, * // {name: 'literal', value: '.\\{', start: 6, end: 9}, * // {name: 'value', value: 'function(x,y){return {y:x}}', start: 10, end: 37} * // ] * * // Sticky mode via flag y * str = '<1><<<2>>><3>4<5>'; * XRegExp.matchRecursive(str, '<', '>', 'gy'); * // -> ['1', '<<2>>', '3'] */ XRegExp.matchRecursive = function(str, left, right, flags, options) { flags = flags || ''; options = options || {}; var global = flags.indexOf('g') > -1; var sticky = flags.indexOf('y') > -1; // Flag `y` is controlled internally var basicFlags = flags.replace(/y/g, ''); var escapeChar = options.escapeChar; var vN = options.valueNames; var output = []; var openTokens = 0; var delimStart = 0; var delimEnd = 0; var lastOuterEnd = 0; var outerStart; var innerStart; var leftMatch; var rightMatch; var esc; left = XRegExp(left, basicFlags); right = XRegExp(right, basicFlags); if (escapeChar) { if (escapeChar.length > 1) { throw new Error('Cannot use more than one escape character'); } escapeChar = XRegExp.escape(escapeChar); // Example of concatenated `esc` regex: // `escapeChar`: '%' // `left`: '<' // `right`: '>' // Regex is: /(?:%[\S\s]|(?:(?!<|>)[^%])+)+/ esc = new RegExp( '(?:' + escapeChar + '[\\S\\s]|(?:(?!' + // Using `XRegExp.union` safely rewrites backreferences in `left` and `right`. // Intentionally not passing `basicFlags` to `XRegExp.union` since any syntax // transformation resulting from those flags was already applied to `left` and // `right` when they were passed through the XRegExp constructor above. XRegExp.union([left, right], '', {conjunction: 'or'}).source + ')[^' + escapeChar + '])+)+', // Flags `gy` not needed here flags.replace(/[^imu]+/g, '') ); } while (true) { // If using an escape character, advance to the delimiter's next starting position, // skipping any escaped characters in between if (escapeChar) { delimEnd += (XRegExp.exec(str, esc, delimEnd, 'sticky') || [''])[0].length; } leftMatch = XRegExp.exec(str, left, delimEnd); rightMatch = XRegExp.exec(str, right, delimEnd); // Keep the leftmost match only if (leftMatch && rightMatch) { if (leftMatch.index <= rightMatch.index) { rightMatch = null; } else { leftMatch = null; } } // Paths (LM: leftMatch, RM: rightMatch, OT: openTokens): // LM | RM | OT | Result // 1 | 0 | 1 | loop // 1 | 0 | 0 | loop // 0 | 1 | 1 | loop // 0 | 1 | 0 | throw // 0 | 0 | 1 | throw // 0 | 0 | 0 | break // The paths above don't include the sticky mode special case. The loop ends after the // first completed match if not `global`. if (leftMatch || rightMatch) { delimStart = (leftMatch || rightMatch).index; delimEnd = delimStart + (leftMatch || rightMatch)[0].length; } else if (!openTokens) { break; } if (sticky && !openTokens && delimStart > lastOuterEnd) { break; } if (leftMatch) { if (!openTokens) { outerStart = delimStart; innerStart = delimEnd; } ++openTokens; } else if (rightMatch && openTokens) { if (!--openTokens) { if (vN) { if (vN[0] && outerStart > lastOuterEnd) { output.push(row(vN[0], str.slice(lastOuterEnd, outerStart), lastOuterEnd, outerStart)); } if (vN[1]) { output.push(row(vN[1], str.slice(outerStart, innerStart), outerStart, innerStart)); } if (vN[2]) { output.push(row(vN[2], str.slice(innerStart, delimStart), innerStart, delimStart)); } if (vN[3]) { output.push(row(vN[3], str.slice(delimStart, delimEnd), delimStart, delimEnd)); } } else { output.push(str.slice(innerStart, delimStart)); } lastOuterEnd = delimEnd; if (!global) { break; } } } else { throw new Error('Unbalanced delimiter found in string'); } // If the delimiter matched an empty string, avoid an infinite loop if (delimStart === delimEnd) { ++delimEnd; } } if (global && !sticky && vN && vN[0] && str.length > lastOuterEnd) { output.push(row(vN[0], str.slice(lastOuterEnd), lastOuterEnd, str.length)); } return output; }; }; },{}],3:[function(require,module,exports){ /*! * XRegExp Unicode Base 3.2.0 * * Steven Levithan (c) 2008-2017 MIT License */ module.exports = function(XRegExp) { 'use strict'; /** * Adds base support for Unicode matching: * - Adds syntax `\p{..}` for matching Unicode tokens. Tokens can be inverted using `\P{..}` or * `\p{^..}`. Token names ignore case, spaces, hyphens, and underscores. You can omit the * braces for token names that are a single letter (e.g. `\pL` or `PL`). * - Adds flag A (astral), which enables 21-bit Unicode support. * - Adds the `XRegExp.addUnicodeData` method used by other addons to provide character data. * * Unicode Base relies on externally provided Unicode character data. Official addons are * available to provide data for Unicode categories, scripts, blocks, and properties. * * @requires XRegExp */ // ==--------------------------== // Private stuff // ==--------------------------== // Storage for Unicode data var unicode = {}; // Reuse utils var dec = XRegExp._dec; var hex = XRegExp._hex; var pad4 = XRegExp._pad4; // Generates a token lookup name: lowercase, with hyphens, spaces, and underscores removed function normalize(name) { return name.replace(/[- _]+/g, '').toLowerCase(); } // Gets the decimal code of a literal code unit, \xHH, \uHHHH, or a backslash-escaped literal function charCode(chr) { var esc = /^\\[xu](.+)/.exec(chr); return esc ? dec(esc[1]) : chr.charCodeAt(chr.charAt(0) === '\\' ? 1 : 0); } // Inverts a list of ordered BMP characters and ranges function invertBmp(range) { var output = ''; var lastEnd = -1; XRegExp.forEach( range, /(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/, function(m) { var start = charCode(m[1]); if (start > (lastEnd + 1)) { output += '\\u' + pad4(hex(lastEnd + 1)); if (start > (lastEnd + 2)) { output += '-\\u' + pad4(hex(start - 1)); } } lastEnd = charCode(m[2] || m[1]); } ); if (lastEnd < 0xFFFF) { output += '\\u' + pad4(hex(lastEnd + 1)); if (lastEnd < 0xFFFE) { output += '-\\uFFFF'; } } return output; } // Generates an inverted BMP range on first use function cacheInvertedBmp(slug) { var prop = 'b!'; return ( unicode[slug][prop] || (unicode[slug][prop] = invertBmp(unicode[slug].bmp)) ); } // Combines and optionally negates BMP and astral data function buildAstral(slug, isNegated) { var item = unicode[slug]; var combined = ''; if (item.bmp && !item.isBmpLast) { combined = '[' + item.bmp + ']' + (item.astral ? '|' : ''); } if (item.astral) { combined += item.astral; } if (item.isBmpLast && item.bmp) { combined += (item.astral ? '|' : '') + '[' + item.bmp + ']'; } // Astral Unicode tokens always match a code point, never a code unit return isNegated ? '(?:(?!' + combined + ')(?:[\uD800-\uDBFF][\uDC00-\uDFFF]|[\0-\uFFFF]))' : '(?:' + combined + ')'; } // Builds a complete astral pattern on first use function cacheAstral(slug, isNegated) { var prop = isNegated ? 'a!' : 'a='; return ( unicode[slug][prop] || (unicode[slug][prop] = buildAstral(slug, isNegated)) ); } // ==--------------------------== // Core functionality // ==--------------------------== /* * Add astral mode (flag A) and Unicode token syntax: `\p{..}`, `\P{..}`, `\p{^..}`, `\pC`. */ XRegExp.addToken( // Use `*` instead of `+` to avoid capturing `^` as the token name in `\p{^}` /\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/, function(match, scope, flags) { var ERR_DOUBLE_NEG = 'Invalid double negation '; var ERR_UNKNOWN_NAME = 'Unknown Unicode token '; var ERR_UNKNOWN_REF = 'Unicode token missing data '; var ERR_ASTRAL_ONLY = 'Astral mode required for Unicode token '; var ERR_ASTRAL_IN_CLASS = 'Astral mode does not support Unicode tokens within character classes'; // Negated via \P{..} or \p{^..} var isNegated = match[1] === 'P' || !!match[2]; // Switch from BMP (0-FFFF) to astral (0-10FFFF) mode via flag A var isAstralMode = flags.indexOf('A') > -1; // Token lookup name. Check `[4]` first to avoid passing `undefined` via `\p{}` var slug = normalize(match[4] || match[3]); // Token data object var item = unicode[slug]; if (match[1] === 'P' && match[2]) { throw new SyntaxError(ERR_DOUBLE_NEG + match[0]); } if (!unicode.hasOwnProperty(slug)) { throw new SyntaxError(ERR_UNKNOWN_NAME + match[0]); } // Switch to the negated form of the referenced Unicode token if (item.inverseOf) { slug = normalize(item.inverseOf); if (!unicode.hasOwnProperty(slug)) { throw new ReferenceError(ERR_UNKNOWN_REF + match[0] + ' -> ' + item.inverseOf); } item = unicode[slug]; isNegated = !isNegated; } if (!(item.bmp || isAstralMode)) { throw new SyntaxError(ERR_ASTRAL_ONLY + match[0]); } if (isAstralMode) { if (scope === 'class') { throw new SyntaxError(ERR_ASTRAL_IN_CLASS); } return cacheAstral(slug, isNegated); } return scope === 'class' ? (isNegated ? cacheInvertedBmp(slug) : item.bmp) : (isNegated ? '[^' : '[') + item.bmp + ']'; }, { scope: 'all', optionalFlags: 'A', leadChar: '\\' } ); /** * Adds to the list of Unicode tokens that XRegExp regexes can match via `\p` or `\P`. * * @memberOf XRegExp * @param {Array} data Objects with named character ranges. Each object may have properties * `name`, `alias`, `isBmpLast`, `inverseOf`, `bmp`, and `astral`. All but `name` are * optional, although one of `bmp` or `astral` is required (unless `inverseOf` is set). If * `astral` is absent, the `bmp` data is used for BMP and astral modes. If `bmp` is absent, * the name errors in BMP mode but works in astral mode. If both `bmp` and `astral` are * provided, the `bmp` data only is used in BMP mode, and the combination of `bmp` and * `astral` data is used in astral mode. `isBmpLast` is needed when a token matches orphan * high surrogates *and* uses surrogate pairs to match astral code points. The `bmp` and * `astral` data should be a combination of literal characters and `\xHH` or `\uHHHH` escape * sequences, with hyphens to create ranges. Any regex metacharacters in the data should be * escaped, apart from range-creating hyphens. The `astral` data can additionally use * character classes and alternation, and should use surrogate pairs to represent astral code * points. `inverseOf` can be used to avoid duplicating character data if a Unicode token is * defined as the exact inverse of another token. * @example * * // Basic use * XRegExp.addUnicodeData([{ * name: 'XDigit', * alias: 'Hexadecimal', * bmp: '0-9A-Fa-f' * }]); * XRegExp('\\p{XDigit}:\\p{Hexadecimal}+').test('0:3D'); // -> true */ XRegExp.addUnicodeData = function(data) { var ERR_NO_NAME = 'Unicode token requires name'; var ERR_NO_DATA = 'Unicode token has no character data '; var item; for (var i = 0; i < data.length; ++i) { item = data[i]; if (!item.name) { throw new Error(ERR_NO_NAME); } if (!(item.inverseOf || item.bmp || item.astral)) { throw new Error(ERR_NO_DATA + item.name); } unicode[normalize(item.name)] = item; if (item.alias) { unicode[normalize(item.alias)] = item; } } // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and // flags might now produce different results XRegExp.cache.flush('patterns'); }; /** * @ignore * * Return a reference to the internal Unicode definition structure for the given Unicode * Property if the given name is a legal Unicode Property for use in XRegExp `\p` or `\P` regex * constructs. * * @memberOf XRegExp * @param {String} name Name by which the Unicode Property may be recognized (case-insensitive), * e.g. `'N'` or `'Number'`. The given name is matched against all registered Unicode * Properties and Property Aliases. * @returns {Object} Reference to definition structure when the name matches a Unicode Property. * * @note * For more info on Unicode Properties, see also http://unicode.org/reports/tr18/#Categories. * * @note * This method is *not* part of the officially documented API and may change or be removed in * the future. It is meant for userland code that wishes to reuse the (large) internal Unicode * structures set up by XRegExp. */ XRegExp._getUnicodeProperty = function(name) { var slug = normalize(name); return unicode[slug]; }; }; },{}],4:[function(require,module,exports){ /*! * XRegExp Unicode Blocks 3.2.0 * * Steven Levithan (c) 2010-2017 MIT License * Unicode data by Mathias Bynens */ module.exports = function(XRegExp) { 'use strict'; /** * Adds support for all Unicode blocks. Block names use the prefix 'In'. E.g., * `\p{InBasicLatin}`. Token names are case insensitive, and any spaces, hyphens, and * underscores are ignored. * * Uses Unicode 9.0.0. * * @requires XRegExp, Unicode Base */ if (!XRegExp.addUnicodeData) { throw new ReferenceError('Unicode Base must be loaded before Unicode Blocks'); } XRegExp.addUnicodeData([ { name: 'InAdlam', astral: '\uD83A[\uDD00-\uDD5F]' }, { name: 'InAegean_Numbers', astral: '\uD800[\uDD00-\uDD3F]' }, { name: 'InAhom', astral: '\uD805[\uDF00-\uDF3F]' }, { name: 'InAlchemical_Symbols', astral: '\uD83D[\uDF00-\uDF7F]' }, { name: 'InAlphabetic_Presentation_Forms', bmp: '\uFB00-\uFB4F' }, { name: 'InAnatolian_Hieroglyphs', astral: '\uD811[\uDC00-\uDE7F]' }, { name: 'InAncient_Greek_Musical_Notation', astral: '\uD834[\uDE00-\uDE4F]' }, { name: 'InAncient_Greek_Numbers', astral: '\uD800[\uDD40-\uDD8F]' }, { name: 'InAncient_Symbols', astral: '\uD800[\uDD90-\uDDCF]' }, { name: 'InArabic', bmp: '\u0600-\u06FF' }, { name: 'InArabic_Extended_A', bmp: '\u08A0-\u08FF' }, { name: 'InArabic_Mathematical_Alphabetic_Symbols', astral: '\uD83B[\uDE00-\uDEFF]' }, { name: 'InArabic_Presentation_Forms_A', bmp: '\uFB50-\uFDFF' }, { name: 'InArabic_Presentation_Forms_B', bmp: '\uFE70-\uFEFF' }, { name: 'InArabic_Supplement', bmp: '\u0750-\u077F' }, { name: 'InArmenian', bmp: '\u0530-\u058F' }, { name: 'InArrows', bmp: '\u2190-\u21FF' }, { name: 'InAvestan', astral: '\uD802[\uDF00-\uDF3F]' }, { name: 'InBalinese', bmp: '\u1B00-\u1B7F' }, { name: 'InBamum', bmp: '\uA6A0-\uA6FF' }, { name: 'InBamum_Supplement', astral: '\uD81A[\uDC00-\uDE3F]' }, { name: 'InBasic_Latin', bmp: '\0-\x7F' }, { name: 'InBassa_Vah', astral: '\uD81A[\uDED0-\uDEFF]' }, { name: 'InBatak', bmp: '\u1BC0-\u1BFF' }, { name: 'InBengali', bmp: '\u0980-\u09FF' }, { name: 'InBhaiksuki', astral: '\uD807[\uDC00-\uDC6F]' }, { name: 'InBlock_Elements', bmp: '\u2580-\u259F' }, { name: 'InBopomofo', bmp: '\u3100-\u312F' }, { name: 'InBopomofo_Extended', bmp: '\u31A0-\u31BF' }, { name: 'InBox_Drawing', bmp: '\u2500-\u257F' }, { name: 'InBrahmi', astral: '\uD804[\uDC00-\uDC7F]' }, { name: 'InBraille_Patterns', bmp: '\u2800-\u28FF' }, { name: 'InBuginese', bmp: '\u1A00-\u1A1F' }, { name: 'InBuhid', bmp: '\u1740-\u175F' }, { name: 'InByzantine_Musical_Symbols', astral: '\uD834[\uDC00-\uDCFF]' }, { name: 'InCJK_Compatibility', bmp: '\u3300-\u33FF' }, { name: 'InCJK_Compatibility_Forms', bmp: '\uFE30-\uFE4F' }, { name: 'InCJK_Compatibility_Ideographs', bmp: '\uF900-\uFAFF' }, { name: 'InCJK_Compatibility_Ideographs_Supplement', astral: '\uD87E[\uDC00-\uDE1F]' }, { name: 'InCJK_Radicals_Supplement', bmp: '\u2E80-\u2EFF' }, { name: 'InCJK_Strokes', bmp: '\u31C0-\u31EF' }, { name: 'InCJK_Symbols_and_Punctuation', bmp: '\u3000-\u303F' }, { name: 'InCJK_Unified_Ideographs', bmp: '\u4E00-\u9FFF' }, { name: 'InCJK_Unified_Ideographs_Extension_A', bmp: '\u3400-\u4DBF' }, { name: 'InCJK_Unified_Ideographs_Extension_B', astral: '[\uD840-\uD868][\uDC00-\uDFFF]|\uD869[\uDC00-\uDEDF]' }, { name: 'InCJK_Unified_Ideographs_Extension_C', astral: '\uD869[\uDF00-\uDFFF]|[\uD86A-\uD86C][\uDC00-\uDFFF]|\uD86D[\uDC00-\uDF3F]' }, { name: 'InCJK_Unified_Ideographs_Extension_D', astral: '\uD86D[\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1F]' }, { name: 'InCJK_Unified_Ideographs_Extension_E', astral: '\uD86E[\uDC20-\uDFFF]|[\uD86F-\uD872][\uDC00-\uDFFF]|\uD873[\uDC00-\uDEAF]' }, { name: 'InCarian', astral: '\uD800[\uDEA0-\uDEDF]' }, { name: 'InCaucasian_Albanian', astral: '\uD801[\uDD30-\uDD6F]' }, { name: 'InChakma', astral: '\uD804[\uDD00-\uDD4F]' }, { name: 'InCham', bmp: '\uAA00-\uAA5F' }, { name: 'InCherokee', bmp: '\u13A0-\u13FF' }, { name: 'InCherokee_Supplement', bmp: '\uAB70-\uABBF' }, { name: 'InCombining_Diacritical_Marks', bmp: '\u0300-\u036F' }, { name: 'InCombining_Diacritical_Marks_Extended', bmp: '\u1AB0-\u1AFF' }, { name: 'InCombining_Diacritical_Marks_Supplement', bmp: '\u1DC0-\u1DFF' }, { name: 'InCombining_Diacritical_Marks_for_Symbols', bmp: '\u20D0-\u20FF' }, { name: 'InCombining_Half_Marks', bmp: '\uFE20-\uFE2F' }, { name: 'InCommon_Indic_Number_Forms', bmp: '\uA830-\uA83F' }, { name: 'InControl_Pictures', bmp: '\u2400-\u243F' }, { name: 'InCoptic', bmp: '\u2C80-\u2CFF' }, { name: 'InCoptic_Epact_Numbers', astral: '\uD800[\uDEE0-\uDEFF]' }, { name: 'InCounting_Rod_Numerals', astral: '\uD834[\uDF60-\uDF7F]' }, { name: 'InCuneiform', astral: '\uD808[\uDC00-\uDFFF]' }, { name: 'InCuneiform_Numbers_and_Punctuation', astral: '\uD809[\uDC00-\uDC7F]' }, { name: 'InCurrency_Symbols', bmp: '\u20A0-\u20CF' }, { name: 'InCypriot_Syllabary', astral: '\uD802[\uDC00-\uDC3F]' }, { name: 'InCyrillic', bmp: '\u0400-\u04FF' }, { name: 'InCyrillic_Extended_A', bmp: '\u2DE0-\u2DFF' }, { name: 'InCyrillic_Extended_B', bmp: '\uA640-\uA69F' }, { name: 'InCyrillic_Extended_C', bmp: '\u1C80-\u1C8F' }, { name: 'InCyrillic_Supplement', bmp: '\u0500-\u052F' }, { name: 'InDeseret', astral: '\uD801[\uDC00-\uDC4F]' }, { name: 'InDevanagari', bmp: '\u0900-\u097F' }, { name: 'InDevanagari_Extended', bmp: '\uA8E0-\uA8FF' }, { name: 'InDingbats', bmp: '\u2700-\u27BF' }, { name: 'InDomino_Tiles', astral: '\uD83C[\uDC30-\uDC9F]' }, { name: 'InDuployan', astral: '\uD82F[\uDC00-\uDC9F]' }, { name: 'InEarly_Dynastic_Cuneiform', astral: '\uD809[\uDC80-\uDD4F]' }, { name: 'InEgyptian_Hieroglyphs', astral: '\uD80C[\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F]' }, { name: 'InElbasan', astral: '\uD801[\uDD00-\uDD2F]' }, { name: 'InEmoticons', astral: '\uD83D[\uDE00-\uDE4F]' }, { name: 'InEnclosed_Alphanumeric_Supplement', astral: '\uD83C[\uDD00-\uDDFF]' }, { name: 'InEnclosed_Alphanumerics', bmp: '\u2460-\u24FF' }, { name: 'InEnclosed_CJK_Letters_and_Months', bmp: '\u3200-\u32FF' }, { name: 'InEnclosed_Ideographic_Supplement', astral: '\uD83C[\uDE00-\uDEFF]' }, { name: 'InEthiopic', bmp: '\u1200-\u137F' }, { name: 'InEthiopic_Extended', bmp: '\u2D80-\u2DDF' }, { name: 'InEthiopic_Extended_A', bmp: '\uAB00-\uAB2F' }, { name: 'InEthiopic_Supplement', bmp: '\u1380-\u139F' }, { name: 'InGeneral_Punctuation', bmp: '\u2000-\u206F' }, { name: 'InGeometric_Shapes', bmp: '\u25A0-\u25FF' }, { name: 'InGeometric_Shapes_Extended', astral: '\uD83D[\uDF80-\uDFFF]' }, { name: 'InGeorgian', bmp: '\u10A0-\u10FF' }, { name: 'InGeorgian_Supplement', bmp: '\u2D00-\u2D2F' }, { name: 'InGlagolitic', bmp: '\u2C00-\u2C5F' }, { name: 'InGlagolitic_Supplement', astral: '\uD838[\uDC00-\uDC2F]' }, { name: 'InGothic', astral: '\uD800[\uDF30-\uDF4F]' }, { name: 'InGrantha', astral: '\uD804[\uDF00-\uDF7F]' }, { name: 'InGreek_Extended', bmp: '\u1F00-\u1FFF' }, { name: 'InGreek_and_Coptic', bmp: '\u0370-\u03FF' }, { name: 'InGujarati', bmp: '\u0A80-\u0AFF' }, { name: 'InGurmukhi', bmp: '\u0A00-\u0A7F' }, { name: 'InHalfwidth_and_Fullwidth_Forms', bmp: '\uFF00-\uFFEF' }, { name: 'InHangul_Compatibility_Jamo', bmp: '\u3130-\u318F' }, { name: 'InHangul_Jamo', bmp: '\u1100-\u11FF' }, { name: 'InHangul_Jamo_Extended_A', bmp: '\uA960-\uA97F' }, { name: 'InHangul_Jamo_Extended_B', bmp: '\uD7B0-\uD7FF' }, { name: 'InHangul_Syllables', bmp: '\uAC00-\uD7AF' }, { name: 'InHanunoo', bmp: '\u1720-\u173F' }, { name: 'InHatran', astral: '\uD802[\uDCE0-\uDCFF]' }, { name: 'InHebrew', bmp: '\u0590-\u05FF' }, { name: 'InHigh_Private_Use_Surrogates', bmp: '\uDB80-\uDBFF' }, { name: 'InHigh_Surrogates', bmp: '\uD800-\uDB7F' }, { name: 'InHiragana', bmp: '\u3040-\u309F' }, { name: 'InIPA_Extensions', bmp: '\u0250-\u02AF' }, { name: 'InIdeographic_Description_Characters', bmp: '\u2FF0-\u2FFF' }, { name: 'InIdeographic_Symbols_and_Punctuation', astral: '\uD81B[\uDFE0-\uDFFF]' }, { name: 'InImperial_Aramaic', astral: '\uD802[\uDC40-\uDC5F]' }, { name: 'InInscriptional_Pahlavi', astral: '\uD802[\uDF60-\uDF7F]' }, { name: 'InInscriptional_Parthian', astral: '\uD802[\uDF40-\uDF5F]' }, { name: 'InJavanese', bmp: '\uA980-\uA9DF' }, { name: 'InKaithi', astral: '\uD804[\uDC80-\uDCCF]' }, { name: 'InKana_Supplement', astral: '\uD82C[\uDC00-\uDCFF]' }, { name: 'InKanbun', bmp: '\u3190-\u319F' }, { name: 'InKangxi_Radicals', bmp: '\u2F00-\u2FDF' }, { name: 'InKannada', bmp: '\u0C80-\u0CFF' }, { name: 'InKatakana', bmp: '\u30A0-\u30FF' }, { name: 'InKatakana_Phonetic_Extensions', bmp: '\u31F0-\u31FF' }, { name: 'InKayah_Li', bmp: '\uA900-\uA92F' }, { name: 'InKharoshthi', astral: '\uD802[\uDE00-\uDE5F]' }, { name: 'InKhmer', bmp: '\u1780-\u17FF' }, { name: 'InKhmer_Symbols', bmp: '\u19E0-\u19FF' }, { name: 'InKhojki', astral: '\uD804[\uDE00-\uDE4F]' }, { name: 'InKhudawadi', astral: '\uD804[\uDEB0-\uDEFF]' }, { name: 'InLao', bmp: '\u0E80-\u0EFF' }, { name: 'InLatin_Extended_Additional', bmp: '\u1E00-\u1EFF' }, { name: 'InLatin_Extended_A', bmp: '\u0100-\u017F' }, { name: 'InLatin_Extended_B', bmp: '\u0180-\u024F' }, { name: 'InLatin_Extended_C', bmp: '\u2C60-\u2C7F' }, { name: 'InLatin_Extended_D', bmp: '\uA720-\uA7FF' }, { name: 'InLatin_Extended_E', bmp: '\uAB30-\uAB6F' }, { name: 'InLatin_1_Supplement', bmp: '\x80-\xFF' }, { name: 'InLepcha', bmp: '\u1C00-\u1C4F' }, { name: 'InLetterlike_Symbols', bmp: '\u2100-\u214F' }, { name: 'InLimbu', bmp: '\u1900-\u194F' }, { name: 'InLinear_A', astral: '\uD801[\uDE00-\uDF7F]' }, { name: 'InLinear_B_Ideograms', astral: '\uD800[\uDC80-\uDCFF]' }, { name: 'InLinear_B_Syllabary', astral: '\uD800[\uDC00-\uDC7F]' }, { name: 'InLisu', bmp: '\uA4D0-\uA4FF' }, { name: 'InLow_Surrogates', bmp: '\uDC00-\uDFFF' }, { name: 'InLycian', astral: '\uD800[\uDE80-\uDE9F]' }, { name: 'InLydian', astral: '\uD802[\uDD20-\uDD3F]' }, { name: 'InMahajani', astral: '\uD804[\uDD50-\uDD7F]' }, { name: 'InMahjong_Tiles', astral: '\uD83C[\uDC00-\uDC2F]' }, { name: 'InMalayalam', bmp: '\u0D00-\u0D7F' }, { name: 'InMandaic', bmp: '\u0840-\u085F' }, { name: 'InManichaean', astral: '\uD802[\uDEC0-\uDEFF]' }, { name: 'InMarchen', astral: '\uD807[\uDC70-\uDCBF]' }, { name: 'InMathematical_Alphanumeric_Symbols', astral: '\uD835[\uDC00-\uDFFF]' }, { name: 'InMathematical_Operators', bmp: '\u2200-\u22FF' }, { name: 'InMeetei_Mayek', bmp: '\uABC0-\uABFF' }, { name: 'InMeetei_Mayek_Extensions', bmp: '\uAAE0-\uAAFF' }, { name: 'InMende_Kikakui', astral: '\uD83A[\uDC00-\uDCDF]' }, { name: 'InMeroitic_Cursive', astral: '\uD802[\uDDA0-\uDDFF]' }, { name: 'InMeroitic_Hieroglyphs', astral: '\uD802[\uDD80-\uDD9F]' }, { name: 'InMiao', astral: '\uD81B[\uDF00-\uDF9F]' }, { name: 'InMiscellaneous_Mathematical_Symbols_A', bmp: '\u27C0-\u27EF' }, { name: 'InMiscellaneous_Mathematical_Symbols_B', bmp: '\u2980-\u29FF' }, { name: 'InMiscellaneous_Symbols', bmp: '\u2600-\u26FF' }, { name: 'InMiscellaneous_Symbols_and_Arrows', bmp: '\u2B00-\u2BFF' }, { name: 'InMiscellaneous_Symbols_and_Pictographs', astral: '\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDDFF]' }, { name: 'InMiscellaneous_Technical', bmp: '\u2300-\u23FF' }, { name: 'InModi', astral: '\uD805[\uDE00-\uDE5F]' }, { name: 'InModifier_Tone_Letters', bmp: '\uA700-\uA71F' }, { name: 'InMongolian', bmp: '\u1800-\u18AF' }, { name: 'InMongolian_Supplement', astral: '\uD805[\uDE60-\uDE7F]' }, { name: 'InMro', astral: '\uD81A[\uDE40-\uDE6F]' }, { name: 'InMultani', astral: '\uD804[\uDE80-\uDEAF]' }, { name: 'InMusical_Symbols', astral: '\uD834[\uDD00-\uDDFF]' }, { name: 'InMyanmar', bmp: '\u1000-\u109F' }, { name: 'InMyanmar_Extended_A', bmp: '\uAA60-\uAA7F' }, { name: 'InMyanmar_Extended_B', bmp: '\uA9E0-\uA9FF' }, { name: 'InNKo', bmp: '\u07C0-\u07FF' }, { name: 'InNabataean', astral: '\uD802[\uDC80-\uDCAF]' }, { name: 'InNew_Tai_Lue', bmp: '\u1980-\u19DF' }, { name: 'InNewa', astral: '\uD805[\uDC00-\uDC7F]' }, { name: 'InNumber_Forms', bmp: '\u2150-\u218F' }, { name: 'InOgham', bmp: '\u1680-\u169F' }, { name: 'InOl_Chiki', bmp: '\u1C50-\u1C7F' }, { name: 'InOld_Hungarian', astral: '\uD803[\uDC80-\uDCFF]' }, { name: 'InOld_Italic', astral: '\uD800[\uDF00-\uDF2F]' }, { name: 'InOld_North_Arabian', astral: '\uD802[\uDE80-\uDE9F]' }, { name: 'InOld_Permic', astral: '\uD800[\uDF50-\uDF7F]' }, { name: 'InOld_Persian', astral: '\uD800[\uDFA0-\uDFDF]' }, { name: 'InOld_South_Arabian', astral: '\uD802[\uDE60-\uDE7F]' }, { name: 'InOld_Turkic', astral: '\uD803[\uDC00-\uDC4F]' }, { name: 'InOptical_Character_Recognition', bmp: '\u2440-\u245F' }, { name: 'InOriya', bmp: '\u0B00-\u0B7F' }, { name: 'InOrnamental_Dingbats', astral: '\uD83D[\uDE50-\uDE7F]' }, { name: 'InOsage', astral: '\uD801[\uDCB0-\uDCFF]' }, { name: 'InOsmanya', astral: '\uD801[\uDC80-\uDCAF]' }, { name: 'InPahawh_Hmong', astral: '\uD81A[\uDF00-\uDF8F]' }, { name: 'InPalmyrene', astral: '\uD802[\uDC60-\uDC7F]' }, { name: 'InPau_Cin_Hau', astral: '\uD806[\uDEC0-\uDEFF]' }, { name: 'InPhags_pa', bmp: '\uA840-\uA87F' }, { name: 'InPhaistos_Disc', astral: '\uD800[\uDDD0-\uDDFF]' }, { name: 'InPhoenician', astral: '\uD802[\uDD00-\uDD1F]' }, { name: 'InPhonetic_Extensions', bmp: '\u1D00-\u1D7F' }, { name: 'InPhonetic_Extensions_Supplement', bmp: '\u1D80-\u1DBF' }, { name: 'InPlaying_Cards', astral: '\uD83C[\uDCA0-\uDCFF]' }, { name: 'InPrivate_Use_Area', bmp: '\uE000-\uF8FF' }, { name: 'InPsalter_Pahlavi', astral: '\uD802[\uDF80-\uDFAF]' }, { name: 'InRejang', bmp: '\uA930-\uA95F' }, { name: 'InRumi_Numeral_Symbols', astral: '\uD803[\uDE60-\uDE7F]' }, { name: 'InRunic', bmp: '\u16A0-\u16FF' }, { name: 'InSamaritan', bmp: '\u0800-\u083F' }, { name: 'InSaurashtra', bmp: '\uA880-\uA8DF' }, { name: 'InSharada', astral: '\uD804[\uDD80-\uDDDF]' }, { name: 'InShavian', astral: '\uD801[\uDC50-\uDC7F]' }, { name: 'InShorthand_Format_Controls', astral: '\uD82F[\uDCA0-\uDCAF]' }, { name: 'InSiddham', astral: '\uD805[\uDD80-\uDDFF]' }, { name: 'InSinhala', bmp: '\u0D80-\u0DFF' }, { name: 'InSinhala_Archaic_Numbers', astral: '\uD804[\uDDE0-\uDDFF]' }, { name: 'InSmall_Form_Variants', bmp: '\uFE50-\uFE6F' }, { name: 'InSora_Sompeng', astral: '\uD804[\uDCD0-\uDCFF]' }, { name: 'InSpacing_Modifier_Letters', bmp: '\u02B0-\u02FF' }, { name: 'InSpecials', bmp: '\uFFF0-\uFFFF' }, { name: 'InSundanese', bmp: '\u1B80-\u1BBF' }, { name: 'InSundanese_Supplement', bmp: '\u1CC0-\u1CCF' }, { name: 'InSuperscripts_and_Subscripts', bmp: '\u2070-\u209F' }, { name: 'InSupplemental_Arrows_A', bmp: '\u27F0-\u27FF' }, { name: 'InSupplemental_Arrows_B', bmp: '\u2900-\u297F' }, { name: 'InSupplemental_Arrows_C', astral: '\uD83E[\uDC00-\uDCFF]' }, { name: 'InSupplemental_Mathematical_Operators', bmp: '\u2A00-\u2AFF' }, { name: 'InSupplemental_Punctuation', bmp: '\u2E00-\u2E7F' }, { name: 'InSupplemental_Symbols_and_Pictographs', astral: '\uD83E[\uDD00-\uDDFF]' }, { name: 'InSupplementary_Private_Use_Area_A', astral: '[\uDB80-\uDBBF][\uDC00-\uDFFF]' }, { name: 'InSupplementary_Private_Use_Area_B', astral: '[\uDBC0-\uDBFF][\uDC00-\uDFFF]' }, { name: 'InSutton_SignWriting', astral: '\uD836[\uDC00-\uDEAF]' }, { name: 'InSyloti_Nagri', bmp: '\uA800-\uA82F' }, { name: 'InSyriac', bmp: '\u0700-\u074F' }, { name: 'InTagalog', bmp: '\u1700-\u171F' }, { name: 'InTagbanwa', bmp: '\u1760-\u177F' }, { name: 'InTags', astral: '\uDB40[\uDC00-\uDC7F]' }, { name: 'InTai_Le', bmp: '\u1950-\u197F' }, { name: 'InTai_Tham', bmp: '\u1A20-\u1AAF' }, { name: 'InTai_Viet', bmp: '\uAA80-\uAADF' }, { name: 'InTai_Xuan_Jing_Symbols', astral: '\uD834[\uDF00-\uDF5F]' }, { name: 'InTakri', astral: '\uD805[\uDE80-\uDECF]' }, { name: 'InTamil', bmp: '\u0B80-\u0BFF' }, { name: 'InTangut', astral: '[\uD81C-\uD821][\uDC00-\uDFFF]' }, { name: 'InTangut_Components', astral: '\uD822[\uDC00-\uDEFF]' }, { name: 'InTelugu', bmp: '\u0C00-\u0C7F' }, { name: 'InThaana', bmp: '\u0780-\u07BF' }, { name: 'InThai', bmp: '\u0E00-\u0E7F' }, { name: 'InTibetan', bmp: '\u0F00-\u0FFF' }, { name: 'InTifinagh', bmp: '\u2D30-\u2D7F' }, { name: 'InTirhuta', astral: '\uD805[\uDC80-\uDCDF]' }, { name: 'InTransport_and_Map_Symbols', astral: '\uD83D[\uDE80-\uDEFF]' }, { name: 'InUgaritic', astral: '\uD800[\uDF80-\uDF9F]' }, { name: 'InUnified_Canadian_Aboriginal_Syllabics', bmp: '\u1400-\u167F' }, { name: 'InUnified_Canadian_Aboriginal_Syllabics_Extended', bmp: '\u18B0-\u18FF' }, { name: 'InVai', bmp: '\uA500-\uA63F' }, { name: 'InVariation_Selectors', bmp: '\uFE00-\uFE0F' }, { name: 'InVariation_Selectors_Supplement', astral: '\uDB40[\uDD00-\uDDEF]' }, { name: 'InVedic_Extensions', bmp: '\u1CD0-\u1CFF' }, { name: 'InVertical_Forms', bmp: '\uFE10-\uFE1F' }, { name: 'InWarang_Citi', astral: '\uD806[\uDCA0-\uDCFF]' }, { name: 'InYi_Radicals', bmp: '\uA490-\uA4CF' }, { name: 'InYi_Syllables', bmp: '\uA000-\uA48F' }, { name: 'InYijing_Hexagram_Symbols', bmp: '\u4DC0-\u4DFF' } ]); }; },{}],5:[function(require,module,exports){ /*! * XRegExp Unicode Categories 3.2.0 * * Steven Levithan (c) 2010-2017 MIT License * Unicode data by Mathias Bynens */ module.exports = function(XRegExp) { 'use strict'; /** * Adds support for Unicode's general categories. E.g., `\p{Lu}` or `\p{Uppercase Letter}`. See * category descriptions in UAX #44 . Token * names are case insensitive, and any spaces, hyphens, and underscores are ignored. * * Uses Unicode 9.0.0. * * @requires XRegExp, Unicode Base */ if (!XRegExp.addUnicodeData) { throw new ReferenceError('Unicode Base must be loaded before Unicode Categories'); } XRegExp.addUnicodeData([ { name: 'C', alias: 'Other', isBmpLast: true, bmp: '\0-\x1F\x7F-\x9F\xAD\u0378\u0379\u0380-\u0383\u038B\u038D\u03A2\u0530\u0557\u0558\u0560\u0588\u058B\u058C\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u0605\u061C\u061D\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08B5\u08BE-\u08D3\u08E2\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0AF8\u0AFA-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0BFF\u0C04\u0C0D\u0C11\u0C29\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D00\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D50-\u0D53\u0D64\u0D65\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F6\u13F7\u13FE\u13FF\u169D-\u169F\u16F9-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180E\u180F\u181A-\u181F\u1878-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE\u1AAF\u1ABF-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C89-\u1CBF\u1CC8-\u1CCF\u1CF7\u1CFA-\u1CFF\u1DF6-\u1DFA\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u206F\u2072\u2073\u208F\u209D-\u209F\u20BF-\u20CF\u20F1-\u20FF\u218C-\u218F\u23FF\u2427-\u243F\u244B-\u245F\u2B74\u2B75\u2B96\u2B97\u2BBA-\u2BBC\u2BC9\u2BD2-\u2BEB\u2BF0-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E45-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FD6-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA6F8-\uA6FF\uA7AF\uA7B8-\uA7F6\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C6-\uA8CD\uA8DA-\uA8DF\uA8FE\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB66-\uAB6F\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF', astral: '\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDCFF\uDD03-\uDD06\uDD34-\uDD36\uDD8F\uDD9C-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2F\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD70-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56\uDC9F-\uDCA6\uDCB0-\uDCDF\uDCF3\uDCF6-\uDCFA\uDD1C-\uDD1E\uDD3A-\uDD3E\uDD40-\uDD7F\uDDB8-\uDDBB\uDDD0\uDDD1\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE34-\uDE37\uDE3B-\uDE3E\uDE48-\uDE4F\uDE59-\uDE5F\uDEA0-\uDEBF\uDEE7-\uDEEA\uDEF7-\uDEFF\uDF36-\uDF38\uDF56\uDF57\uDF73-\uDF77\uDF92-\uDF98\uDF9D-\uDFA8\uDFB0-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCF9\uDD00-\uDE5F\uDE7F-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC70-\uDC7E\uDCBD\uDCC2-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD44-\uDD4F\uDD77-\uDD7F\uDDCE\uDDCF\uDDE0\uDDF5-\uDDFF\uDE12\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEAA-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF3B\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC5A\uDC5C\uDC5E-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDDE-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE5F\uDE6D-\uDE7F\uDEB8-\uDEBF\uDECA-\uDEFF\uDF1A-\uDF1C\uDF2C-\uDF2F\uDF40-\uDFFF]|\uD806[\uDC00-\uDC9F\uDCF3-\uDCFE\uDD00-\uDEBF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC46-\uDC4F\uDC6D-\uDC6F\uDC90\uDC91\uDCA8\uDCB7-\uDFFF]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F\uDC75-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80B\uD80E-\uD810\uD812-\uD819\uD823-\uD82B\uD82D\uD82E\uD830-\uD833\uD837\uD839\uD83F\uD874-\uD87D\uD87F-\uDB3F\uDB41-\uDBFF][\uDC00-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDE70-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDEFF\uDF45-\uDF4F\uDF7F-\uDF8E\uDFA0-\uDFDF\uDFE1-\uDFFF]|\uD821[\uDFED-\uDFFF]|\uD822[\uDEF3-\uDFFF]|\uD82C[\uDC02-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA0-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDD73-\uDD7A\uDDE9-\uDDFF\uDE46-\uDEFF\uDF57-\uDF5F\uDF72-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDFCC\uDFCD]|\uD836[\uDE8C-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDCFF\uDD4B-\uDD4F\uDD5A-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDEEF\uDEF2-\uDFFF]|\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDCFF\uDD0D-\uDD0F\uDD2F\uDD6C-\uDD6F\uDDAD-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDEFF]|\uD83D[\uDED3-\uDEDF\uDEED-\uDEEF\uDEF7-\uDEFF\uDF74-\uDF7F\uDFD5-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE-\uDD0F\uDD1F\uDD28-\uDD2F\uDD31\uDD32\uDD3F\uDD4C-\uDD4F\uDD5F-\uDD7F\uDD92-\uDDBF\uDDC1-\uDFFF]|\uD869[\uDED7-\uDEFF]|\uD86D[\uDF35-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uDB40[\uDC00-\uDCFF\uDDF0-\uDFFF]' }, { name: 'Cc', alias: 'Control', bmp: '\0-\x1F\x7F-\x9F' }, { name: 'Cf', alias: 'Format', bmp: '\xAD\u0600-\u0605\u061C\u06DD\u070F\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB', astral: '\uD804\uDCBD|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]' }, { name: 'Cn', alias: 'Unassigned', bmp: '\u0378\u0379\u0380-\u0383\u038B\u038D\u03A2\u0530\u0557\u0558\u0560\u0588\u058B\u058C\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u05FF\u061D\u070E\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08B5\u08BE-\u08D3\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0AF8\u0AFA-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0BFF\u0C04\u0C0D\u0C11\u0C29\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D00\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D50-\u0D53\u0D64\u0D65\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F6\u13F7\u13FE\u13FF\u169D-\u169F\u16F9-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180F\u181A-\u181F\u1878-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE\u1AAF\u1ABF-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C89-\u1CBF\u1CC8-\u1CCF\u1CF7\u1CFA-\u1CFF\u1DF6-\u1DFA\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u2065\u2072\u2073\u208F\u209D-\u209F\u20BF-\u20CF\u20F1-\u20FF\u218C-\u218F\u23FF\u2427-\u243F\u244B-\u245F\u2B74\u2B75\u2B96\u2B97\u2BBA-\u2BBC\u2BC9\u2BD2-\u2BEB\u2BF0-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E45-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FD6-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA6F8-\uA6FF\uA7AF\uA7B8-\uA7F6\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C6-\uA8CD\uA8DA-\uA8DF\uA8FE\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB66-\uAB6F\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uD7FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD\uFEFE\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFF8\uFFFE\uFFFF', astral: '\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDCFF\uDD03-\uDD06\uDD34-\uDD36\uDD8F\uDD9C-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2F\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD70-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56\uDC9F-\uDCA6\uDCB0-\uDCDF\uDCF3\uDCF6-\uDCFA\uDD1C-\uDD1E\uDD3A-\uDD3E\uDD40-\uDD7F\uDDB8-\uDDBB\uDDD0\uDDD1\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE34-\uDE37\uDE3B-\uDE3E\uDE48-\uDE4F\uDE59-\uDE5F\uDEA0-\uDEBF\uDEE7-\uDEEA\uDEF7-\uDEFF\uDF36-\uDF38\uDF56\uDF57\uDF73-\uDF77\uDF92-\uDF98\uDF9D-\uDFA8\uDFB0-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCF9\uDD00-\uDE5F\uDE7F-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC70-\uDC7E\uDCC2-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD44-\uDD4F\uDD77-\uDD7F\uDDCE\uDDCF\uDDE0\uDDF5-\uDDFF\uDE12\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEAA-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF3B\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC5A\uDC5C\uDC5E-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDDE-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE5F\uDE6D-\uDE7F\uDEB8-\uDEBF\uDECA-\uDEFF\uDF1A-\uDF1C\uDF2C-\uDF2F\uDF40-\uDFFF]|\uD806[\uDC00-\uDC9F\uDCF3-\uDCFE\uDD00-\uDEBF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC46-\uDC4F\uDC6D-\uDC6F\uDC90\uDC91\uDCA8\uDCB7-\uDFFF]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F\uDC75-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80B\uD80E-\uD810\uD812-\uD819\uD823-\uD82B\uD82D\uD82E\uD830-\uD833\uD837\uD839\uD83F\uD874-\uD87D\uD87F-\uDB3F\uDB41-\uDB7F][\uDC00-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDE70-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDEFF\uDF45-\uDF4F\uDF7F-\uDF8E\uDFA0-\uDFDF\uDFE1-\uDFFF]|\uD821[\uDFED-\uDFFF]|\uD822[\uDEF3-\uDFFF]|\uD82C[\uDC02-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA4-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDDE9-\uDDFF\uDE46-\uDEFF\uDF57-\uDF5F\uDF72-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDFCC\uDFCD]|\uD836[\uDE8C-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDCFF\uDD4B-\uDD4F\uDD5A-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDEEF\uDEF2-\uDFFF]|\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDCFF\uDD0D-\uDD0F\uDD2F\uDD6C-\uDD6F\uDDAD-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDEFF]|\uD83D[\uDED3-\uDEDF\uDEED-\uDEEF\uDEF7-\uDEFF\uDF74-\uDF7F\uDFD5-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE-\uDD0F\uDD1F\uDD28-\uDD2F\uDD31\uDD32\uDD3F\uDD4C-\uDD4F\uDD5F-\uDD7F\uDD92-\uDDBF\uDDC1-\uDFFF]|\uD869[\uDED7-\uDEFF]|\uD86D[\uDF35-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uDB40[\uDC00\uDC02-\uDC1F\uDC80-\uDCFF\uDDF0-\uDFFF]|[\uDBBF\uDBFF][\uDFFE\uDFFF]' }, { name: 'Co', alias: 'Private_Use', bmp: '\uE000-\uF8FF', astral: '[\uDB80-\uDBBE\uDBC0-\uDBFE][\uDC00-\uDFFF]|[\uDBBF\uDBFF][\uDC00-\uDFFD]' }, { name: 'Cs', alias: 'Surrogate', bmp: '\uD800-\uDFFF' }, { name: 'L', alias: 'Letter', bmp: 'A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC', astral: '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]' }, { name: 'Ll', alias: 'Lowercase_Letter', bmp: 'a-z\xB5\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02AF\u0371\u0373\u0377\u037B-\u037D\u0390\u03AC-\u03CE\u03D0\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0561-\u0587\u13F8-\u13FD\u1C80-\u1C88\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6\u1FC7\u1FD0-\u1FD3\u1FD6\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6\u1FF7\u210A\u210E\u210F\u2113\u212F\u2134\u2139\u213C\u213D\u2146-\u2149\u214E\u2184\u2C30-\u2C5E\u2C61\u2C65\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73\u2C74\u2C76-\u2C7B\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7B5\uA7B7\uA7FA\uAB30-\uAB5A\uAB60-\uAB65\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A', astral: '\uD801[\uDC28-\uDC4F\uDCD8-\uDCFB]|\uD803[\uDCC0-\uDCF2]|\uD806[\uDCC0-\uDCDF]|\uD835[\uDC1A-\uDC33\uDC4E-\uDC54\uDC56-\uDC67\uDC82-\uDC9B\uDCB6-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDCEA-\uDD03\uDD1E-\uDD37\uDD52-\uDD6B\uDD86-\uDD9F\uDDBA-\uDDD3\uDDEE-\uDE07\uDE22-\uDE3B\uDE56-\uDE6F\uDE8A-\uDEA5\uDEC2-\uDEDA\uDEDC-\uDEE1\uDEFC-\uDF14\uDF16-\uDF1B\uDF36-\uDF4E\uDF50-\uDF55\uDF70-\uDF88\uDF8A-\uDF8F\uDFAA-\uDFC2\uDFC4-\uDFC9\uDFCB]|\uD83A[\uDD22-\uDD43]' }, { name: 'Lm', alias: 'Modifier_Letter', bmp: '\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5\u06E6\u07F4\u07F5\u07FA\u081A\u0824\u0828\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1AA7\u1C78-\u1C7D\u1D2C-\u1D6A\u1D78\u1D9B-\u1DBF\u2071\u207F\u2090-\u209C\u2C7C\u2C7D\u2D6F\u2E2F\u3005\u3031-\u3035\u303B\u309D\u309E\u30FC-\u30FE\uA015\uA4F8-\uA4FD\uA60C\uA67F\uA69C\uA69D\uA717-\uA71F\uA770\uA788\uA7F8\uA7F9\uA9CF\uA9E6\uAA70\uAADD\uAAF3\uAAF4\uAB5C-\uAB5F\uFF70\uFF9E\uFF9F', astral: '\uD81A[\uDF40-\uDF43]|\uD81B[\uDF93-\uDF9F\uDFE0]' }, { name: 'Lo', alias: 'Other_Letter', bmp: '\xAA\xBA\u01BB\u01C0-\u01C3\u0294\u05D0-\u05EA\u05F0-\u05F2\u0620-\u063F\u0641-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u0800-\u0815\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0972-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E45\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10D0-\u10FA\u10FD-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17DC\u1820-\u1842\u1844-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C77\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u2135-\u2138\u2D30-\u2D67\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3006\u303C\u3041-\u3096\u309F\u30A1-\u30FA\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA014\uA016-\uA48C\uA4D0-\uA4F7\uA500-\uA60B\uA610-\uA61F\uA62A\uA62B\uA66E\uA6A0-\uA6E5\uA78F\uA7F7\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9E0-\uA9E4\uA9E7-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA6F\uAA71-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB\uAADC\uAAE0-\uAAEA\uAAF2\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF66-\uFF6F\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC', astral: '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC50-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]' }, { name: 'Lt', alias: 'Titlecase_Letter', bmp: '\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC' }, { name: 'Lu', alias: 'Uppercase_Letter', bmp: 'A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178\u0179\u017B\u017D\u0181\u0182\u0184\u0186\u0187\u0189-\u018B\u018E-\u0191\u0193\u0194\u0196-\u0198\u019C\u019D\u019F\u01A0\u01A2\u01A4\u01A6\u01A7\u01A9\u01AC\u01AE\u01AF\u01B1-\u01B3\u01B5\u01B7\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A\u023B\u023D\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E\u213F\u2145\u2183\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AE\uA7B0-\uA7B4\uA7B6\uFF21-\uFF3A', astral: '\uD801[\uDC00-\uDC27\uDCB0-\uDCD3]|\uD803[\uDC80-\uDCB2]|\uD806[\uDCA0-\uDCBF]|\uD835[\uDC00-\uDC19\uDC34-\uDC4D\uDC68-\uDC81\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB5\uDCD0-\uDCE9\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD38\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD6C-\uDD85\uDDA0-\uDDB9\uDDD4-\uDDED\uDE08-\uDE21\uDE3C-\uDE55\uDE70-\uDE89\uDEA8-\uDEC0\uDEE2-\uDEFA\uDF1C-\uDF34\uDF56-\uDF6E\uDF90-\uDFA8\uDFCA]|\uD83A[\uDD00-\uDD21]' }, { name: 'M', alias: 'Mark', bmp: '\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D4-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F', astral: '\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD804[\uDC00-\uDC02\uDC38-\uDC46\uDC7F-\uDC82\uDCB0-\uDCBA\uDD00-\uDD02\uDD27-\uDD34\uDD73\uDD80-\uDD82\uDDB3-\uDDC0\uDDCA-\uDDCC\uDE2C-\uDE37\uDE3E\uDEDF-\uDEEA\uDF00-\uDF03\uDF3C\uDF3E-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC35-\uDC46\uDCB0-\uDCC3\uDDAF-\uDDB5\uDDB8-\uDDC0\uDDDC\uDDDD\uDE30-\uDE40\uDEAB-\uDEB7\uDF1D-\uDF2B]|\uD807[\uDC2F-\uDC36\uDC38-\uDC3F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF51-\uDF7E\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDCD0-\uDCD6\uDD44-\uDD4A]|\uDB40[\uDD00-\uDDEF]' }, { name: 'Mc', alias: 'Spacing_Mark', bmp: '\u0903\u093B\u093E-\u0940\u0949-\u094C\u094E\u094F\u0982\u0983\u09BE-\u09C0\u09C7\u09C8\u09CB\u09CC\u09D7\u0A03\u0A3E-\u0A40\u0A83\u0ABE-\u0AC0\u0AC9\u0ACB\u0ACC\u0B02\u0B03\u0B3E\u0B40\u0B47\u0B48\u0B4B\u0B4C\u0B57\u0BBE\u0BBF\u0BC1\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BD7\u0C01-\u0C03\u0C41-\u0C44\u0C82\u0C83\u0CBE\u0CC0-\u0CC4\u0CC7\u0CC8\u0CCA\u0CCB\u0CD5\u0CD6\u0D02\u0D03\u0D3E-\u0D40\u0D46-\u0D48\u0D4A-\u0D4C\u0D57\u0D82\u0D83\u0DCF-\u0DD1\u0DD8-\u0DDF\u0DF2\u0DF3\u0F3E\u0F3F\u0F7F\u102B\u102C\u1031\u1038\u103B\u103C\u1056\u1057\u1062-\u1064\u1067-\u106D\u1083\u1084\u1087-\u108C\u108F\u109A-\u109C\u17B6\u17BE-\u17C5\u17C7\u17C8\u1923-\u1926\u1929-\u192B\u1930\u1931\u1933-\u1938\u1A19\u1A1A\u1A55\u1A57\u1A61\u1A63\u1A64\u1A6D-\u1A72\u1B04\u1B35\u1B3B\u1B3D-\u1B41\u1B43\u1B44\u1B82\u1BA1\u1BA6\u1BA7\u1BAA\u1BE7\u1BEA-\u1BEC\u1BEE\u1BF2\u1BF3\u1C24-\u1C2B\u1C34\u1C35\u1CE1\u1CF2\u1CF3\u302E\u302F\uA823\uA824\uA827\uA880\uA881\uA8B4-\uA8C3\uA952\uA953\uA983\uA9B4\uA9B5\uA9BA\uA9BB\uA9BD-\uA9C0\uAA2F\uAA30\uAA33\uAA34\uAA4D\uAA7B\uAA7D\uAAEB\uAAEE\uAAEF\uAAF5\uABE3\uABE4\uABE6\uABE7\uABE9\uABEA\uABEC', astral: '\uD804[\uDC00\uDC02\uDC82\uDCB0-\uDCB2\uDCB7\uDCB8\uDD2C\uDD82\uDDB3-\uDDB5\uDDBF\uDDC0\uDE2C-\uDE2E\uDE32\uDE33\uDE35\uDEE0-\uDEE2\uDF02\uDF03\uDF3E\uDF3F\uDF41-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63]|\uD805[\uDC35-\uDC37\uDC40\uDC41\uDC45\uDCB0-\uDCB2\uDCB9\uDCBB-\uDCBE\uDCC1\uDDAF-\uDDB1\uDDB8-\uDDBB\uDDBE\uDE30-\uDE32\uDE3B\uDE3C\uDE3E\uDEAC\uDEAE\uDEAF\uDEB6\uDF20\uDF21\uDF26]|\uD807[\uDC2F\uDC3E\uDCA9\uDCB1\uDCB4]|\uD81B[\uDF51-\uDF7E]|\uD834[\uDD65\uDD66\uDD6D-\uDD72]' }, { name: 'Me', alias: 'Enclosing_Mark', bmp: '\u0488\u0489\u1ABE\u20DD-\u20E0\u20E2-\u20E4\uA670-\uA672' }, { name: 'Mn', alias: 'Nonspacing_Mark', bmp: '\u0300-\u036F\u0483-\u0487\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D4-\u08E1\u08E3-\u0902\u093A\u093C\u0941-\u0948\u094D\u0951-\u0957\u0962\u0963\u0981\u09BC\u09C1-\u09C4\u09CD\u09E2\u09E3\u0A01\u0A02\u0A3C\u0A41\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81\u0A82\u0ABC\u0AC1-\u0AC5\u0AC7\u0AC8\u0ACD\u0AE2\u0AE3\u0B01\u0B3C\u0B3F\u0B41-\u0B44\u0B4D\u0B56\u0B62\u0B63\u0B82\u0BC0\u0BCD\u0C00\u0C3E-\u0C40\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81\u0CBC\u0CBF\u0CC6\u0CCC\u0CCD\u0CE2\u0CE3\u0D01\u0D41-\u0D44\u0D4D\u0D62\u0D63\u0DCA\u0DD2-\u0DD4\u0DD6\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F71-\u0F7E\u0F80-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102D-\u1030\u1032-\u1037\u1039\u103A\u103D\u103E\u1058\u1059\u105E-\u1060\u1071-\u1074\u1082\u1085\u1086\u108D\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4\u17B5\u17B7-\u17BD\u17C6\u17C9-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193B\u1A17\u1A18\u1A1B\u1A56\u1A58-\u1A5E\u1A60\u1A62\u1A65-\u1A6C\u1A73-\u1A7C\u1A7F\u1AB0-\u1ABD\u1B00-\u1B03\u1B34\u1B36-\u1B3A\u1B3C\u1B42\u1B6B-\u1B73\u1B80\u1B81\u1BA2-\u1BA5\u1BA8\u1BA9\u1BAB-\u1BAD\u1BE6\u1BE8\u1BE9\u1BED\u1BEF-\u1BF1\u1C2C-\u1C33\u1C36\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\u1DFF\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302D\u3099\u309A\uA66F\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA825\uA826\uA8C4\uA8C5\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA951\uA980-\uA982\uA9B3\uA9B6-\uA9B9\uA9BC\uA9E5\uAA29-\uAA2E\uAA31\uAA32\uAA35\uAA36\uAA43\uAA4C\uAA7C\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEC\uAAED\uAAF6\uABE5\uABE8\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F', astral: '\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD804[\uDC01\uDC38-\uDC46\uDC7F-\uDC81\uDCB3-\uDCB6\uDCB9\uDCBA\uDD00-\uDD02\uDD27-\uDD2B\uDD2D-\uDD34\uDD73\uDD80\uDD81\uDDB6-\uDDBE\uDDCA-\uDDCC\uDE2F-\uDE31\uDE34\uDE36\uDE37\uDE3E\uDEDF\uDEE3-\uDEEA\uDF00\uDF01\uDF3C\uDF40\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC38-\uDC3F\uDC42-\uDC44\uDC46\uDCB3-\uDCB8\uDCBA\uDCBF\uDCC0\uDCC2\uDCC3\uDDB2-\uDDB5\uDDBC\uDDBD\uDDBF\uDDC0\uDDDC\uDDDD\uDE33-\uDE3A\uDE3D\uDE3F\uDE40\uDEAB\uDEAD\uDEB0-\uDEB5\uDEB7\uDF1D-\uDF1F\uDF22-\uDF25\uDF27-\uDF2B]|\uD807[\uDC30-\uDC36\uDC38-\uDC3D\uDC3F\uDC92-\uDCA7\uDCAA-\uDCB0\uDCB2\uDCB3\uDCB5\uDCB6]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\uD834[\uDD67-\uDD69\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDCD0-\uDCD6\uDD44-\uDD4A]|\uDB40[\uDD00-\uDDEF]' }, { name: 'N', alias: 'Number', bmp: '0-9\xB2\xB3\xB9\xBC-\xBE\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u09F4-\u09F9\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0B72-\u0B77\u0BE6-\u0BF2\u0C66-\u0C6F\u0C78-\u0C7E\u0CE6-\u0CEF\u0D58-\u0D5E\u0D66-\u0D78\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F33\u1040-\u1049\u1090-\u1099\u1369-\u137C\u16EE-\u16F0\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1946-\u194F\u19D0-\u19DA\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\u2070\u2074-\u2079\u2080-\u2089\u2150-\u2182\u2185-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3007\u3021-\u3029\u3038-\u303A\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA620-\uA629\uA6E6-\uA6EF\uA830-\uA835\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19', astral: '\uD800[\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDEE1-\uDEFB\uDF20-\uDF23\uDF41\uDF4A\uDFD1-\uDFD5]|\uD801[\uDCA0-\uDCA9]|\uD802[\uDC58-\uDC5F\uDC79-\uDC7F\uDCA7-\uDCAF\uDCFB-\uDCFF\uDD16-\uDD1B\uDDBC\uDDBD\uDDC0-\uDDCF\uDDD2-\uDDFF\uDE40-\uDE47\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD803[\uDCFA-\uDCFF\uDE60-\uDE7E]|\uD804[\uDC52-\uDC6F\uDCF0-\uDCF9\uDD36-\uDD3F\uDDD0-\uDDD9\uDDE1-\uDDF4\uDEF0-\uDEF9]|\uD805[\uDC50-\uDC59\uDCD0-\uDCD9\uDE50-\uDE59\uDEC0-\uDEC9\uDF30-\uDF3B]|\uD806[\uDCE0-\uDCF2]|\uD807[\uDC50-\uDC6C]|\uD809[\uDC00-\uDC6E]|\uD81A[\uDE60-\uDE69\uDF50-\uDF59\uDF5B-\uDF61]|\uD834[\uDF60-\uDF71]|\uD835[\uDFCE-\uDFFF]|\uD83A[\uDCC7-\uDCCF\uDD50-\uDD59]|\uD83C[\uDD00-\uDD0C]' }, { name: 'Nd', alias: 'Decimal_Number', bmp: '0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19', astral: '\uD801[\uDCA0-\uDCA9]|\uD804[\uDC66-\uDC6F\uDCF0-\uDCF9\uDD36-\uDD3F\uDDD0-\uDDD9\uDEF0-\uDEF9]|\uD805[\uDC50-\uDC59\uDCD0-\uDCD9\uDE50-\uDE59\uDEC0-\uDEC9\uDF30-\uDF39]|\uD806[\uDCE0-\uDCE9]|\uD807[\uDC50-\uDC59]|\uD81A[\uDE60-\uDE69\uDF50-\uDF59]|\uD835[\uDFCE-\uDFFF]|\uD83A[\uDD50-\uDD59]' }, { name: 'Nl', alias: 'Letter_Number', bmp: '\u16EE-\u16F0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303A\uA6E6-\uA6EF', astral: '\uD800[\uDD40-\uDD74\uDF41\uDF4A\uDFD1-\uDFD5]|\uD809[\uDC00-\uDC6E]' }, { name: 'No', alias: 'Other_Number', bmp: '\xB2\xB3\xB9\xBC-\xBE\u09F4-\u09F9\u0B72-\u0B77\u0BF0-\u0BF2\u0C78-\u0C7E\u0D58-\u0D5E\u0D70-\u0D78\u0F2A-\u0F33\u1369-\u137C\u17F0-\u17F9\u19DA\u2070\u2074-\u2079\u2080-\u2089\u2150-\u215F\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA830-\uA835', astral: '\uD800[\uDD07-\uDD33\uDD75-\uDD78\uDD8A\uDD8B\uDEE1-\uDEFB\uDF20-\uDF23]|\uD802[\uDC58-\uDC5F\uDC79-\uDC7F\uDCA7-\uDCAF\uDCFB-\uDCFF\uDD16-\uDD1B\uDDBC\uDDBD\uDDC0-\uDDCF\uDDD2-\uDDFF\uDE40-\uDE47\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD803[\uDCFA-\uDCFF\uDE60-\uDE7E]|\uD804[\uDC52-\uDC65\uDDE1-\uDDF4]|\uD805[\uDF3A\uDF3B]|\uD806[\uDCEA-\uDCF2]|\uD807[\uDC5A-\uDC6C]|\uD81A[\uDF5B-\uDF61]|\uD834[\uDF60-\uDF71]|\uD83A[\uDCC7-\uDCCF]|\uD83C[\uDD00-\uDD0C]' }, { name: 'P', alias: 'Punctuation', bmp: '\x21-\x23\x25-\\x2A\x2C-\x2F\x3A\x3B\\x3F\x40\\x5B-\\x5D\x5F\\x7B\x7D\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E44\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65', astral: '\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD807[\uDC41-\uDC45\uDC70\uDC71]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]' }, { name: 'Pc', alias: 'Connector_Punctuation', bmp: '\x5F\u203F\u2040\u2054\uFE33\uFE34\uFE4D-\uFE4F\uFF3F' }, { name: 'Pd', alias: 'Dash_Punctuation', bmp: '\\x2D\u058A\u05BE\u1400\u1806\u2010-\u2015\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D' }, { name: 'Pe', alias: 'Close_Punctuation', bmp: '\\x29\\x5D\x7D\u0F3B\u0F3D\u169C\u2046\u207E\u208E\u2309\u230B\u232A\u2769\u276B\u276D\u276F\u2771\u2773\u2775\u27C6\u27E7\u27E9\u27EB\u27ED\u27EF\u2984\u2986\u2988\u298A\u298C\u298E\u2990\u2992\u2994\u2996\u2998\u29D9\u29DB\u29FD\u2E23\u2E25\u2E27\u2E29\u3009\u300B\u300D\u300F\u3011\u3015\u3017\u3019\u301B\u301E\u301F\uFD3E\uFE18\uFE36\uFE38\uFE3A\uFE3C\uFE3E\uFE40\uFE42\uFE44\uFE48\uFE5A\uFE5C\uFE5E\uFF09\uFF3D\uFF5D\uFF60\uFF63' }, { name: 'Pf', alias: 'Final_Punctuation', bmp: '\xBB\u2019\u201D\u203A\u2E03\u2E05\u2E0A\u2E0D\u2E1D\u2E21' }, { name: 'Pi', alias: 'Initial_Punctuation', bmp: '\xAB\u2018\u201B\u201C\u201F\u2039\u2E02\u2E04\u2E09\u2E0C\u2E1C\u2E20' }, { name: 'Po', alias: 'Other_Punctuation', bmp: '\x21-\x23\x25-\x27\\x2A\x2C\\x2E\x2F\x3A\x3B\\x3F\x40\\x5C\xA1\xA7\xB6\xB7\xBF\u037E\u0387\u055A-\u055F\u0589\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u166D\u166E\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u1805\u1807-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2016\u2017\u2020-\u2027\u2030-\u2038\u203B-\u203E\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205E\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00\u2E01\u2E06-\u2E08\u2E0B\u2E0E-\u2E16\u2E18\u2E19\u2E1B\u2E1E\u2E1F\u2E2A-\u2E2E\u2E30-\u2E39\u2E3C-\u2E3F\u2E41\u2E43\u2E44\u3001-\u3003\u303D\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFE10-\uFE16\uFE19\uFE30\uFE45\uFE46\uFE49-\uFE4C\uFE50-\uFE52\uFE54-\uFE57\uFE5F-\uFE61\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF07\uFF0A\uFF0C\uFF0E\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3C\uFF61\uFF64\uFF65', astral: '\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD807[\uDC41-\uDC45\uDC70\uDC71]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]' }, { name: 'Ps', alias: 'Open_Punctuation', bmp: '\\x28\\x5B\\x7B\u0F3A\u0F3C\u169B\u201A\u201E\u2045\u207D\u208D\u2308\u230A\u2329\u2768\u276A\u276C\u276E\u2770\u2772\u2774\u27C5\u27E6\u27E8\u27EA\u27EC\u27EE\u2983\u2985\u2987\u2989\u298B\u298D\u298F\u2991\u2993\u2995\u2997\u29D8\u29DA\u29FC\u2E22\u2E24\u2E26\u2E28\u2E42\u3008\u300A\u300C\u300E\u3010\u3014\u3016\u3018\u301A\u301D\uFD3F\uFE17\uFE35\uFE37\uFE39\uFE3B\uFE3D\uFE3F\uFE41\uFE43\uFE47\uFE59\uFE5B\uFE5D\uFF08\uFF3B\uFF5B\uFF5F\uFF62' }, { name: 'S', alias: 'Symbol', bmp: '\\x24\\x2B\x3C-\x3E\\x5E\x60\\x7C\x7E\xA2-\xA6\xA8\xA9\xAC\xAE-\xB1\xB4\xB8\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u03F6\u0482\u058D-\u058F\u0606-\u0608\u060B\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u09F2\u09F3\u09FA\u09FB\u0AF1\u0B70\u0BF3-\u0BFA\u0C7F\u0D4F\u0D79\u0E3F\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u17DB\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2044\u2052\u207A-\u207C\u208A-\u208C\u20A0-\u20BE\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2307\u230C-\u2328\u232B-\u23FE\u2400-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u2767\u2794-\u27C4\u27C7-\u27E5\u27F0-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2B73\u2B76-\u2B95\u2B98-\u2BB9\u2BBD-\u2BC8\u2BCA-\u2BD1\u2BEC-\u2BEF\u2CE5-\u2CEA\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u309B\u309C\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u32FE\u3300-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uAA77-\uAA79\uAB5B\uFB29\uFBB2-\uFBC1\uFDFC\uFDFD\uFE62\uFE64-\uFE66\uFE69\uFF04\uFF0B\uFF1C-\uFF1E\uFF3E\uFF40\uFF5C\uFF5E\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD', astral: '\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9B\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDE8\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD83B[\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD10-\uDD2E\uDD30-\uDD6B\uDD70-\uDDAC\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED2\uDEE0-\uDEEC\uDEF0-\uDEF6\uDF00-\uDF73\uDF80-\uDFD4]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDD10-\uDD1E\uDD20-\uDD27\uDD30\uDD33-\uDD3E\uDD40-\uDD4B\uDD50-\uDD5E\uDD80-\uDD91\uDDC0]' }, { name: 'Sc', alias: 'Currency_Symbol', bmp: '\\x24\xA2-\xA5\u058F\u060B\u09F2\u09F3\u09FB\u0AF1\u0BF9\u0E3F\u17DB\u20A0-\u20BE\uA838\uFDFC\uFE69\uFF04\uFFE0\uFFE1\uFFE5\uFFE6' }, { name: 'Sk', alias: 'Modifier_Symbol', bmp: '\\x5E\x60\xA8\xAF\xB4\xB8\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u309B\u309C\uA700-\uA716\uA720\uA721\uA789\uA78A\uAB5B\uFBB2-\uFBC1\uFF3E\uFF40\uFFE3', astral: '\uD83C[\uDFFB-\uDFFF]' }, { name: 'Sm', alias: 'Math_Symbol', bmp: '\\x2B\x3C-\x3E\\x7C\x7E\xAC\xB1\xD7\xF7\u03F6\u0606-\u0608\u2044\u2052\u207A-\u207C\u208A-\u208C\u2118\u2140-\u2144\u214B\u2190-\u2194\u219A\u219B\u21A0\u21A3\u21A6\u21AE\u21CE\u21CF\u21D2\u21D4\u21F4-\u22FF\u2320\u2321\u237C\u239B-\u23B3\u23DC-\u23E1\u25B7\u25C1\u25F8-\u25FF\u266F\u27C0-\u27C4\u27C7-\u27E5\u27F0-\u27FF\u2900-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2AFF\u2B30-\u2B44\u2B47-\u2B4C\uFB29\uFE62\uFE64-\uFE66\uFF0B\uFF1C-\uFF1E\uFF5C\uFF5E\uFFE2\uFFE9-\uFFEC', astral: '\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD83B[\uDEF0\uDEF1]' }, { name: 'So', alias: 'Other_Symbol', bmp: '\xA6\xA9\xAE\xB0\u0482\u058D\u058E\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u09FA\u0B70\u0BF3-\u0BF8\u0BFA\u0C7F\u0D4F\u0D79\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u214A\u214C\u214D\u214F\u218A\u218B\u2195-\u2199\u219C-\u219F\u21A1\u21A2\u21A4\u21A5\u21A7-\u21AD\u21AF-\u21CD\u21D0\u21D1\u21D3\u21D5-\u21F3\u2300-\u2307\u230C-\u231F\u2322-\u2328\u232B-\u237B\u237D-\u239A\u23B4-\u23DB\u23E2-\u23FE\u2400-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u25B6\u25B8-\u25C0\u25C2-\u25F7\u2600-\u266E\u2670-\u2767\u2794-\u27BF\u2800-\u28FF\u2B00-\u2B2F\u2B45\u2B46\u2B4D-\u2B73\u2B76-\u2B95\u2B98-\u2BB9\u2BBD-\u2BC8\u2BCA-\u2BD1\u2BEC-\u2BEF\u2CE5-\u2CEA\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u32FE\u3300-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA828-\uA82B\uA836\uA837\uA839\uAA77-\uAA79\uFDFD\uFFE4\uFFE8\uFFED\uFFEE\uFFFC\uFFFD', astral: '\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9B\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDE8\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD10-\uDD2E\uDD30-\uDD6B\uDD70-\uDDAC\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDF00-\uDFFA]|\uD83D[\uDC00-\uDED2\uDEE0-\uDEEC\uDEF0-\uDEF6\uDF00-\uDF73\uDF80-\uDFD4]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDD10-\uDD1E\uDD20-\uDD27\uDD30\uDD33-\uDD3E\uDD40-\uDD4B\uDD50-\uDD5E\uDD80-\uDD91\uDDC0]' }, { name: 'Z', alias: 'Separator', bmp: '\x20\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000' }, { name: 'Zl', alias: 'Line_Separator', bmp: '\u2028' }, { name: 'Zp', alias: 'Paragraph_Separator', bmp: '\u2029' }, { name: 'Zs', alias: 'Space_Separator', bmp: '\x20\xA0\u1680\u2000-\u200A\u202F\u205F\u3000' } ]); }; },{}],6:[function(require,module,exports){ /*! * XRegExp Unicode Properties 3.2.0 * * Steven Levithan (c) 2012-2017 MIT License * Unicode data by Mathias Bynens */ module.exports = function(XRegExp) { 'use strict'; /** * Adds properties to meet the UTS #18 Level 1 RL1.2 requirements for Unicode regex support. See * . Following are definitions of these properties from * UAX #44 : * * - Alphabetic * Characters with the Alphabetic property. Generated from: Lowercase + Uppercase + Lt + Lm + * Lo + Nl + Other_Alphabetic. * * - Default_Ignorable_Code_Point * For programmatic determination of default ignorable code points. New characters that should * be ignored in rendering (unless explicitly supported) will be assigned in these ranges, * permitting programs to correctly handle the default rendering of such characters when not * otherwise supported. * * - Lowercase * Characters with the Lowercase property. Generated from: Ll + Other_Lowercase. * * - Noncharacter_Code_Point * Code points permanently reserved for internal use. * * - Uppercase * Characters with the Uppercase property. Generated from: Lu + Other_Uppercase. * * - White_Space * Spaces, separator characters and other control characters which should be treated by * programming languages as "white space" for the purpose of parsing elements. * * The properties ASCII, Any, and Assigned are also included but are not defined in UAX #44. UTS * #18 RL1.2 additionally requires support for Unicode scripts and general categories. These are * included in XRegExp's Unicode Categories and Unicode Scripts addons. * * Token names are case insensitive, and any spaces, hyphens, and underscores are ignored. * * Uses Unicode 9.0.0. * * @requires XRegExp, Unicode Base */ if (!XRegExp.addUnicodeData) { throw new ReferenceError('Unicode Base must be loaded before Unicode Properties'); } var unicodeData = [ { name: 'ASCII', bmp: '\0-\x7F' }, { name: 'Alphabetic', bmp: 'A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0345\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05B0-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0657\u0659-\u065F\u066E-\u06D3\u06D5-\u06DC\u06E1-\u06E8\u06ED-\u06EF\u06FA-\u06FC\u06FF\u0710-\u073F\u074D-\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0817\u081A-\u082C\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08DF\u08E3-\u08E9\u08F0-\u093B\u093D-\u094C\u094E-\u0950\u0955-\u0963\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD-\u09C4\u09C7\u09C8\u09CB\u09CC\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09F0\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3E-\u0A42\u0A47\u0A48\u0A4B\u0A4C\u0A51\u0A59-\u0A5C\u0A5E\u0A70-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD-\u0AC5\u0AC7-\u0AC9\u0ACB\u0ACC\u0AD0\u0AE0-\u0AE3\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D-\u0B44\u0B47\u0B48\u0B4B\u0B4C\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BD0\u0BD7\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4C\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCC\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4C\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E46\u0E4D\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0ECD\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F71-\u0F81\u0F88-\u0F97\u0F99-\u0FBC\u1000-\u1036\u1038\u103B-\u103F\u1050-\u1062\u1065-\u1068\u106E-\u1086\u108E\u109C\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1713\u1720-\u1733\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17B3\u17B6-\u17C8\u17D7\u17DC\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u1938\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A1B\u1A20-\u1A5E\u1A61-\u1A74\u1AA7\u1B00-\u1B33\u1B35-\u1B43\u1B45-\u1B4B\u1B80-\u1BA9\u1BAC-\u1BAF\u1BBA-\u1BE5\u1BE7-\u1BF1\u1C00-\u1C35\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1D00-\u1DBF\u1DE7-\u1DF4\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u24B6-\u24E9\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA674-\uA67B\uA67F-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA827\uA840-\uA873\uA880-\uA8C3\uA8C5\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA92A\uA930-\uA952\uA960-\uA97C\uA980-\uA9B2\uA9B4-\uA9BF\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA60-\uAA76\uAA7A\uAA7E-\uAABE\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF5\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC', astral: '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC45\uDC82-\uDCB8\uDCD0-\uDCE8\uDD00-\uDD32\uDD50-\uDD72\uDD76\uDD80-\uDDBF\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE34\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEE8\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D-\uDF44\uDF47\uDF48\uDF4B\uDF4C\uDF50\uDF57\uDF5D-\uDF63]|\uD805[\uDC00-\uDC41\uDC43-\uDC45\uDC47-\uDC4A\uDC80-\uDCC1\uDCC4\uDCC5\uDCC7\uDD80-\uDDB5\uDDB8-\uDDBE\uDDD8-\uDDDD\uDE00-\uDE3E\uDE40\uDE44\uDE80-\uDEB5\uDF00-\uDF19\uDF1D-\uDF2A]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC3E\uDC40\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF36\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9E]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD47]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD30-\uDD49\uDD50-\uDD69\uDD70-\uDD89]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]' }, { name: 'Any', isBmpLast: true, bmp: '\0-\uFFFF', astral: '[\uD800-\uDBFF][\uDC00-\uDFFF]' }, { name: 'Default_Ignorable_Code_Point', bmp: '\xAD\u034F\u061C\u115F\u1160\u17B4\u17B5\u180B-\u180E\u200B-\u200F\u202A-\u202E\u2060-\u206F\u3164\uFE00-\uFE0F\uFEFF\uFFA0\uFFF0-\uFFF8', astral: '\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|[\uDB40-\uDB43][\uDC00-\uDFFF]' }, { name: 'Lowercase', bmp: 'a-z\xAA\xB5\xBA\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02B8\u02C0\u02C1\u02E0-\u02E4\u0345\u0371\u0373\u0377\u037A-\u037D\u0390\u03AC-\u03CE\u03D0\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0561-\u0587\u13F8-\u13FD\u1C80-\u1C88\u1D00-\u1DBF\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6\u1FC7\u1FD0-\u1FD3\u1FD6\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6\u1FF7\u2071\u207F\u2090-\u209C\u210A\u210E\u210F\u2113\u212F\u2134\u2139\u213C\u213D\u2146-\u2149\u214E\u2170-\u217F\u2184\u24D0-\u24E9\u2C30-\u2C5E\u2C61\u2C65\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73\u2C74\u2C76-\u2C7D\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B-\uA69D\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7B5\uA7B7\uA7F8-\uA7FA\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A', astral: '\uD801[\uDC28-\uDC4F\uDCD8-\uDCFB]|\uD803[\uDCC0-\uDCF2]|\uD806[\uDCC0-\uDCDF]|\uD835[\uDC1A-\uDC33\uDC4E-\uDC54\uDC56-\uDC67\uDC82-\uDC9B\uDCB6-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDCEA-\uDD03\uDD1E-\uDD37\uDD52-\uDD6B\uDD86-\uDD9F\uDDBA-\uDDD3\uDDEE-\uDE07\uDE22-\uDE3B\uDE56-\uDE6F\uDE8A-\uDEA5\uDEC2-\uDEDA\uDEDC-\uDEE1\uDEFC-\uDF14\uDF16-\uDF1B\uDF36-\uDF4E\uDF50-\uDF55\uDF70-\uDF88\uDF8A-\uDF8F\uDFAA-\uDFC2\uDFC4-\uDFC9\uDFCB]|\uD83A[\uDD22-\uDD43]' }, { name: 'Noncharacter_Code_Point', bmp: '\uFDD0-\uFDEF\uFFFE\uFFFF', astral: '[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]' }, { name: 'Uppercase', bmp: 'A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178\u0179\u017B\u017D\u0181\u0182\u0184\u0186\u0187\u0189-\u018B\u018E-\u0191\u0193\u0194\u0196-\u0198\u019C\u019D\u019F\u01A0\u01A2\u01A4\u01A6\u01A7\u01A9\u01AC\u01AE\u01AF\u01B1-\u01B3\u01B5\u01B7\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A\u023B\u023D\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E\u213F\u2145\u2160-\u216F\u2183\u24B6-\u24CF\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AE\uA7B0-\uA7B4\uA7B6\uFF21-\uFF3A', astral: '\uD801[\uDC00-\uDC27\uDCB0-\uDCD3]|\uD803[\uDC80-\uDCB2]|\uD806[\uDCA0-\uDCBF]|\uD835[\uDC00-\uDC19\uDC34-\uDC4D\uDC68-\uDC81\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB5\uDCD0-\uDCE9\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD38\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD6C-\uDD85\uDDA0-\uDDB9\uDDD4-\uDDED\uDE08-\uDE21\uDE3C-\uDE55\uDE70-\uDE89\uDEA8-\uDEC0\uDEE2-\uDEFA\uDF1C-\uDF34\uDF56-\uDF6E\uDF90-\uDFA8\uDFCA]|\uD83A[\uDD00-\uDD21]|\uD83C[\uDD30-\uDD49\uDD50-\uDD69\uDD70-\uDD89]' }, { name: 'White_Space', bmp: '\x09-\x0D\x20\x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000' } ]; // Add non-generated data unicodeData.push({ name: 'Assigned', // Since this is defined as the inverse of Unicode category Cn (Unassigned), the Unicode // Categories addon is required to use this property inverseOf: 'Cn' }); XRegExp.addUnicodeData(unicodeData); }; },{}],7:[function(require,module,exports){ /*! * XRegExp Unicode Scripts 3.2.0 * * Steven Levithan (c) 2010-2017 MIT License * Unicode data by Mathias Bynens */ module.exports = function(XRegExp) { 'use strict'; /** * Adds support for all Unicode scripts. E.g., `\p{Latin}`. Token names are case insensitive, * and any spaces, hyphens, and underscores are ignored. * * Uses Unicode 9.0.0. * * @requires XRegExp, Unicode Base */ if (!XRegExp.addUnicodeData) { throw new ReferenceError('Unicode Base must be loaded before Unicode Scripts'); } XRegExp.addUnicodeData([ { name: 'Adlam', astral: '\uD83A[\uDD00-\uDD4A\uDD50-\uDD59\uDD5E\uDD5F]' }, { name: 'Ahom', astral: '\uD805[\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF3F]' }, { name: 'Anatolian_Hieroglyphs', astral: '\uD811[\uDC00-\uDE46]' }, { name: 'Arabic', bmp: '\u0600-\u0604\u0606-\u060B\u060D-\u061A\u061E\u0620-\u063F\u0641-\u064A\u0656-\u066F\u0671-\u06DC\u06DE-\u06FF\u0750-\u077F\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u08FF\uFB50-\uFBC1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFD\uFE70-\uFE74\uFE76-\uFEFC', astral: '\uD803[\uDE60-\uDE7E]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB\uDEF0\uDEF1]' }, { name: 'Armenian', bmp: '\u0531-\u0556\u0559-\u055F\u0561-\u0587\u058A\u058D-\u058F\uFB13-\uFB17' }, { name: 'Avestan', astral: '\uD802[\uDF00-\uDF35\uDF39-\uDF3F]' }, { name: 'Balinese', bmp: '\u1B00-\u1B4B\u1B50-\u1B7C' }, { name: 'Bamum', bmp: '\uA6A0-\uA6F7', astral: '\uD81A[\uDC00-\uDE38]' }, { name: 'Bassa_Vah', astral: '\uD81A[\uDED0-\uDEED\uDEF0-\uDEF5]' }, { name: 'Batak', bmp: '\u1BC0-\u1BF3\u1BFC-\u1BFF' }, { name: 'Bengali', bmp: '\u0980-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09FB' }, { name: 'Bhaiksuki', astral: '\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC45\uDC50-\uDC6C]' }, { name: 'Bopomofo', bmp: '\u02EA\u02EB\u3105-\u312D\u31A0-\u31BA' }, { name: 'Brahmi', astral: '\uD804[\uDC00-\uDC4D\uDC52-\uDC6F\uDC7F]' }, { name: 'Braille', bmp: '\u2800-\u28FF' }, { name: 'Buginese', bmp: '\u1A00-\u1A1B\u1A1E\u1A1F' }, { name: 'Buhid', bmp: '\u1740-\u1753' }, { name: 'Canadian_Aboriginal', bmp: '\u1400-\u167F\u18B0-\u18F5' }, { name: 'Carian', astral: '\uD800[\uDEA0-\uDED0]' }, { name: 'Caucasian_Albanian', astral: '\uD801[\uDD30-\uDD63\uDD6F]' }, { name: 'Chakma', astral: '\uD804[\uDD00-\uDD34\uDD36-\uDD43]' }, { name: 'Cham', bmp: '\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA5C-\uAA5F' }, { name: 'Cherokee', bmp: '\u13A0-\u13F5\u13F8-\u13FD\uAB70-\uABBF' }, { name: 'Common', bmp: '\0-\x40\\x5B-\x60\\x7B-\xA9\xAB-\xB9\xBB-\xBF\xD7\xF7\u02B9-\u02DF\u02E5-\u02E9\u02EC-\u02FF\u0374\u037E\u0385\u0387\u0589\u0605\u060C\u061B\u061C\u061F\u0640\u06DD\u08E2\u0964\u0965\u0E3F\u0FD5-\u0FD8\u10FB\u16EB-\u16ED\u1735\u1736\u1802\u1803\u1805\u1CD3\u1CE1\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u2000-\u200B\u200E-\u2064\u2066-\u2070\u2074-\u207E\u2080-\u208E\u20A0-\u20BE\u2100-\u2125\u2127-\u2129\u212C-\u2131\u2133-\u214D\u214F-\u215F\u2189-\u218B\u2190-\u23FE\u2400-\u2426\u2440-\u244A\u2460-\u27FF\u2900-\u2B73\u2B76-\u2B95\u2B98-\u2BB9\u2BBD-\u2BC8\u2BCA-\u2BD1\u2BEC-\u2BEF\u2E00-\u2E44\u2FF0-\u2FFB\u3000-\u3004\u3006\u3008-\u3020\u3030-\u3037\u303C-\u303F\u309B\u309C\u30A0\u30FB\u30FC\u3190-\u319F\u31C0-\u31E3\u3220-\u325F\u327F-\u32CF\u3358-\u33FF\u4DC0-\u4DFF\uA700-\uA721\uA788-\uA78A\uA830-\uA839\uA92E\uA9CF\uAB5B\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFEFF\uFF01-\uFF20\uFF3B-\uFF40\uFF5B-\uFF65\uFF70\uFF9E\uFF9F\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFF9-\uFFFD', astral: '\uD800[\uDD00-\uDD02\uDD07-\uDD33\uDD37-\uDD3F\uDD90-\uDD9B\uDDD0-\uDDFC\uDEE1-\uDEFB]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD66\uDD6A-\uDD7A\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDE8\uDF00-\uDF56\uDF60-\uDF71]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDFCB\uDFCE-\uDFFF]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD00-\uDD0C\uDD10-\uDD2E\uDD30-\uDD6B\uDD70-\uDDAC\uDDE6-\uDDFF\uDE01\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED2\uDEE0-\uDEEC\uDEF0-\uDEF6\uDF00-\uDF73\uDF80-\uDFD4]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDD10-\uDD1E\uDD20-\uDD27\uDD30\uDD33-\uDD3E\uDD40-\uDD4B\uDD50-\uDD5E\uDD80-\uDD91\uDDC0]|\uDB40[\uDC01\uDC20-\uDC7F]' }, { name: 'Coptic', bmp: '\u03E2-\u03EF\u2C80-\u2CF3\u2CF9-\u2CFF' }, { name: 'Cuneiform', astral: '\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC70-\uDC74\uDC80-\uDD43]' }, { name: 'Cypriot', astral: '\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F]' }, { name: 'Cyrillic', bmp: '\u0400-\u0484\u0487-\u052F\u1C80-\u1C88\u1D2B\u1D78\u2DE0-\u2DFF\uA640-\uA69F\uFE2E\uFE2F' }, { name: 'Deseret', astral: '\uD801[\uDC00-\uDC4F]' }, { name: 'Devanagari', bmp: '\u0900-\u0950\u0953-\u0963\u0966-\u097F\uA8E0-\uA8FD' }, { name: 'Duployan', astral: '\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9C-\uDC9F]' }, { name: 'Egyptian_Hieroglyphs', astral: '\uD80C[\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]' }, { name: 'Elbasan', astral: '\uD801[\uDD00-\uDD27]' }, { name: 'Ethiopic', bmp: '\u1200-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u137C\u1380-\u1399\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E' }, { name: 'Georgian', bmp: '\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u10FF\u2D00-\u2D25\u2D27\u2D2D' }, { name: 'Glagolitic', bmp: '\u2C00-\u2C2E\u2C30-\u2C5E', astral: '\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]' }, { name: 'Gothic', astral: '\uD800[\uDF30-\uDF4A]' }, { name: 'Grantha', astral: '\uD804[\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]' }, { name: 'Greek', bmp: '\u0370-\u0373\u0375-\u0377\u037A-\u037D\u037F\u0384\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03E1\u03F0-\u03FF\u1D26-\u1D2A\u1D5D-\u1D61\u1D66-\u1D6A\u1DBF\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FC4\u1FC6-\u1FD3\u1FD6-\u1FDB\u1FDD-\u1FEF\u1FF2-\u1FF4\u1FF6-\u1FFE\u2126\uAB65', astral: '\uD800[\uDD40-\uDD8E\uDDA0]|\uD834[\uDE00-\uDE45]' }, { name: 'Gujarati', bmp: '\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AF1\u0AF9' }, { name: 'Gurmukhi', bmp: '\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75' }, { name: 'Han', bmp: '\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u3005\u3007\u3021-\u3029\u3038-\u303B\u3400-\u4DB5\u4E00-\u9FD5\uF900-\uFA6D\uFA70-\uFAD9', astral: '[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]' }, { name: 'Hangul', bmp: '\u1100-\u11FF\u302E\u302F\u3131-\u318E\u3200-\u321E\u3260-\u327E\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC' }, { name: 'Hanunoo', bmp: '\u1720-\u1734' }, { name: 'Hatran', astral: '\uD802[\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDCFF]' }, { name: 'Hebrew', bmp: '\u0591-\u05C7\u05D0-\u05EA\u05F0-\u05F4\uFB1D-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFB4F' }, { name: 'Hiragana', bmp: '\u3041-\u3096\u309D-\u309F', astral: '\uD82C\uDC01|\uD83C\uDE00' }, { name: 'Imperial_Aramaic', astral: '\uD802[\uDC40-\uDC55\uDC57-\uDC5F]' }, { name: 'Inherited', bmp: '\u0300-\u036F\u0485\u0486\u064B-\u0655\u0670\u0951\u0952\u1AB0-\u1ABE\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\u1DFF\u200C\u200D\u20D0-\u20F0\u302A-\u302D\u3099\u309A\uFE00-\uFE0F\uFE20-\uFE2D', astral: '\uD800[\uDDFD\uDEE0]|\uD834[\uDD67-\uDD69\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD]|\uDB40[\uDD00-\uDDEF]' }, { name: 'Inscriptional_Pahlavi', astral: '\uD802[\uDF60-\uDF72\uDF78-\uDF7F]' }, { name: 'Inscriptional_Parthian', astral: '\uD802[\uDF40-\uDF55\uDF58-\uDF5F]' }, { name: 'Javanese', bmp: '\uA980-\uA9CD\uA9D0-\uA9D9\uA9DE\uA9DF' }, { name: 'Kaithi', astral: '\uD804[\uDC80-\uDCC1]' }, { name: 'Kannada', bmp: '\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2' }, { name: 'Katakana', bmp: '\u30A1-\u30FA\u30FD-\u30FF\u31F0-\u31FF\u32D0-\u32FE\u3300-\u3357\uFF66-\uFF6F\uFF71-\uFF9D', astral: '\uD82C\uDC00' }, { name: 'Kayah_Li', bmp: '\uA900-\uA92D\uA92F' }, { name: 'Kharoshthi', astral: '\uD802[\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F-\uDE47\uDE50-\uDE58]' }, { name: 'Khmer', bmp: '\u1780-\u17DD\u17E0-\u17E9\u17F0-\u17F9\u19E0-\u19FF' }, { name: 'Khojki', astral: '\uD804[\uDE00-\uDE11\uDE13-\uDE3E]' }, { name: 'Khudawadi', astral: '\uD804[\uDEB0-\uDEEA\uDEF0-\uDEF9]' }, { name: 'Lao', bmp: '\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF' }, { name: 'Latin', bmp: 'A-Za-z\xAA\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA7FF\uAB30-\uAB5A\uAB5C-\uAB64\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A' }, { name: 'Lepcha', bmp: '\u1C00-\u1C37\u1C3B-\u1C49\u1C4D-\u1C4F' }, { name: 'Limbu', bmp: '\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1940\u1944-\u194F' }, { name: 'Linear_A', astral: '\uD801[\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]' }, { name: 'Linear_B', astral: '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA]' }, { name: 'Lisu', bmp: '\uA4D0-\uA4FF' }, { name: 'Lycian', astral: '\uD800[\uDE80-\uDE9C]' }, { name: 'Lydian', astral: '\uD802[\uDD20-\uDD39\uDD3F]' }, { name: 'Mahajani', astral: '\uD804[\uDD50-\uDD76]' }, { name: 'Malayalam', bmp: '\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4F\u0D54-\u0D63\u0D66-\u0D7F' }, { name: 'Mandaic', bmp: '\u0840-\u085B\u085E' }, { name: 'Manichaean', astral: '\uD802[\uDEC0-\uDEE6\uDEEB-\uDEF6]' }, { name: 'Marchen', astral: '\uD807[\uDC70-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]' }, { name: 'Meetei_Mayek', bmp: '\uAAE0-\uAAF6\uABC0-\uABED\uABF0-\uABF9' }, { name: 'Mende_Kikakui', astral: '\uD83A[\uDC00-\uDCC4\uDCC7-\uDCD6]' }, { name: 'Meroitic_Cursive', astral: '\uD802[\uDDA0-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDDFF]' }, { name: 'Meroitic_Hieroglyphs', astral: '\uD802[\uDD80-\uDD9F]' }, { name: 'Miao', astral: '\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]' }, { name: 'Modi', astral: '\uD805[\uDE00-\uDE44\uDE50-\uDE59]' }, { name: 'Mongolian', bmp: '\u1800\u1801\u1804\u1806-\u180E\u1810-\u1819\u1820-\u1877\u1880-\u18AA', astral: '\uD805[\uDE60-\uDE6C]' }, { name: 'Mro', astral: '\uD81A[\uDE40-\uDE5E\uDE60-\uDE69\uDE6E\uDE6F]' }, { name: 'Multani', astral: '\uD804[\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA9]' }, { name: 'Myanmar', bmp: '\u1000-\u109F\uA9E0-\uA9FE\uAA60-\uAA7F' }, { name: 'Nabataean', astral: '\uD802[\uDC80-\uDC9E\uDCA7-\uDCAF]' }, { name: 'New_Tai_Lue', bmp: '\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u19DE\u19DF' }, { name: 'Newa', astral: '\uD805[\uDC00-\uDC59\uDC5B\uDC5D]' }, { name: 'Nko', bmp: '\u07C0-\u07FA' }, { name: 'Ogham', bmp: '\u1680-\u169C' }, { name: 'Ol_Chiki', bmp: '\u1C50-\u1C7F' }, { name: 'Old_Hungarian', astral: '\uD803[\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDCFF]' }, { name: 'Old_Italic', astral: '\uD800[\uDF00-\uDF23]' }, { name: 'Old_North_Arabian', astral: '\uD802[\uDE80-\uDE9F]' }, { name: 'Old_Permic', astral: '\uD800[\uDF50-\uDF7A]' }, { name: 'Old_Persian', astral: '\uD800[\uDFA0-\uDFC3\uDFC8-\uDFD5]' }, { name: 'Old_South_Arabian', astral: '\uD802[\uDE60-\uDE7F]' }, { name: 'Old_Turkic', astral: '\uD803[\uDC00-\uDC48]' }, { name: 'Oriya', bmp: '\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B77' }, { name: 'Osage', astral: '\uD801[\uDCB0-\uDCD3\uDCD8-\uDCFB]' }, { name: 'Osmanya', astral: '\uD801[\uDC80-\uDC9D\uDCA0-\uDCA9]' }, { name: 'Pahawh_Hmong', astral: '\uD81A[\uDF00-\uDF45\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]' }, { name: 'Palmyrene', astral: '\uD802[\uDC60-\uDC7F]' }, { name: 'Pau_Cin_Hau', astral: '\uD806[\uDEC0-\uDEF8]' }, { name: 'Phags_Pa', bmp: '\uA840-\uA877' }, { name: 'Phoenician', astral: '\uD802[\uDD00-\uDD1B\uDD1F]' }, { name: 'Psalter_Pahlavi', astral: '\uD802[\uDF80-\uDF91\uDF99-\uDF9C\uDFA9-\uDFAF]' }, { name: 'Rejang', bmp: '\uA930-\uA953\uA95F' }, { name: 'Runic', bmp: '\u16A0-\u16EA\u16EE-\u16F8' }, { name: 'Samaritan', bmp: '\u0800-\u082D\u0830-\u083E' }, { name: 'Saurashtra', bmp: '\uA880-\uA8C5\uA8CE-\uA8D9' }, { name: 'Sharada', astral: '\uD804[\uDD80-\uDDCD\uDDD0-\uDDDF]' }, { name: 'Shavian', astral: '\uD801[\uDC50-\uDC7F]' }, { name: 'Siddham', astral: '\uD805[\uDD80-\uDDB5\uDDB8-\uDDDD]' }, { name: 'SignWriting', astral: '\uD836[\uDC00-\uDE8B\uDE9B-\uDE9F\uDEA1-\uDEAF]' }, { name: 'Sinhala', bmp: '\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2-\u0DF4', astral: '\uD804[\uDDE1-\uDDF4]' }, { name: 'Sora_Sompeng', astral: '\uD804[\uDCD0-\uDCE8\uDCF0-\uDCF9]' }, { name: 'Sundanese', bmp: '\u1B80-\u1BBF\u1CC0-\u1CC7' }, { name: 'Syloti_Nagri', bmp: '\uA800-\uA82B' }, { name: 'Syriac', bmp: '\u0700-\u070D\u070F-\u074A\u074D-\u074F' }, { name: 'Tagalog', bmp: '\u1700-\u170C\u170E-\u1714' }, { name: 'Tagbanwa', bmp: '\u1760-\u176C\u176E-\u1770\u1772\u1773' }, { name: 'Tai_Le', bmp: '\u1950-\u196D\u1970-\u1974' }, { name: 'Tai_Tham', bmp: '\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA0-\u1AAD' }, { name: 'Tai_Viet', bmp: '\uAA80-\uAAC2\uAADB-\uAADF' }, { name: 'Takri', astral: '\uD805[\uDE80-\uDEB7\uDEC0-\uDEC9]' }, { name: 'Tamil', bmp: '\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BFA' }, { name: 'Tangut', astral: '\uD81B\uDFE0|[\uD81C-\uD820][\uDC00-\uDFFF]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]' }, { name: 'Telugu', bmp: '\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C78-\u0C7F' }, { name: 'Thaana', bmp: '\u0780-\u07B1' }, { name: 'Thai', bmp: '\u0E01-\u0E3A\u0E40-\u0E5B' }, { name: 'Tibetan', bmp: '\u0F00-\u0F47\u0F49-\u0F6C\u0F71-\u0F97\u0F99-\u0FBC\u0FBE-\u0FCC\u0FCE-\u0FD4\u0FD9\u0FDA' }, { name: 'Tifinagh', bmp: '\u2D30-\u2D67\u2D6F\u2D70\u2D7F' }, { name: 'Tirhuta', astral: '\uD805[\uDC80-\uDCC7\uDCD0-\uDCD9]' }, { name: 'Ugaritic', astral: '\uD800[\uDF80-\uDF9D\uDF9F]' }, { name: 'Vai', bmp: '\uA500-\uA62B' }, { name: 'Warang_Citi', astral: '\uD806[\uDCA0-\uDCF2\uDCFF]' }, { name: 'Yi', bmp: '\uA000-\uA48C\uA490-\uA4C6' } ]); }; },{}],8:[function(require,module,exports){ var XRegExp = require('./xregexp'); require('./addons/build')(XRegExp); require('./addons/matchrecursive')(XRegExp); require('./addons/unicode-base')(XRegExp); require('./addons/unicode-blocks')(XRegExp); require('./addons/unicode-categories')(XRegExp); require('./addons/unicode-properties')(XRegExp); require('./addons/unicode-scripts')(XRegExp); module.exports = XRegExp; },{"./addons/build":1,"./addons/matchrecursive":2,"./addons/unicode-base":3,"./addons/unicode-blocks":4,"./addons/unicode-categories":5,"./addons/unicode-properties":6,"./addons/unicode-scripts":7,"./xregexp":9}],9:[function(require,module,exports){ /*! * XRegExp 3.2.0 * * Steven Levithan (c) 2007-2017 MIT License */ 'use strict'; /** * XRegExp provides augmented, extensible regular expressions. You get additional regex syntax and * flags, beyond what browsers support natively. XRegExp is also a regex utility belt with tools to * make your client-side grepping simpler and more powerful, while freeing you from related * cross-browser inconsistencies. */ // ==--------------------------== // Private stuff // ==--------------------------== // Property name used for extended regex instance data var REGEX_DATA = 'xregexp'; // Optional features that can be installed and uninstalled var features = { astral: false, natives: false }; // Native methods to use and restore ('native' is an ES3 reserved keyword) var nativ = { exec: RegExp.prototype.exec, test: RegExp.prototype.test, match: String.prototype.match, replace: String.prototype.replace, split: String.prototype.split }; // Storage for fixed/extended native methods var fixed = {}; // Storage for regexes cached by `XRegExp.cache` var regexCache = {}; // Storage for pattern details cached by the `XRegExp` constructor var patternCache = {}; // Storage for regex syntax tokens added internally or by `XRegExp.addToken` var tokens = []; // Token scopes var defaultScope = 'default'; var classScope = 'class'; // Regexes that match native regex syntax, including octals var nativeTokens = { // Any native multicharacter token in default scope, or any single character 'default': /\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/, // Any native multicharacter token in character class scope, or any single character 'class': /\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/ }; // Any backreference or dollar-prefixed character in replacement strings var replacementToken = /\$(?:{([\w$]+)}|(\d\d?|[\s\S]))/g; // Check for correct `exec` handling of nonparticipating capturing groups var correctExecNpcg = nativ.exec.call(/()??/, '')[1] === undefined; // Check for ES6 `flags` prop support var hasFlagsProp = /x/.flags !== undefined; // Shortcut to `Object.prototype.toString` var toString = {}.toString; function hasNativeFlag(flag) { // Can't check based on the presence of properties/getters since browsers might support such // properties even when they don't support the corresponding flag in regex construction (tested // in Chrome 48, where `'unicode' in /x/` is true but trying to construct a regex with flag `u` // throws an error) var isSupported = true; try { // Can't use regex literals for testing even in a `try` because regex literals with // unsupported flags cause a compilation error in IE new RegExp('', flag); } catch (exception) { isSupported = false; } return isSupported; } // Check for ES6 `u` flag support var hasNativeU = hasNativeFlag('u'); // Check for ES6 `y` flag support var hasNativeY = hasNativeFlag('y'); // Tracker for known flags, including addon flags var registeredFlags = { g: true, i: true, m: true, u: hasNativeU, y: hasNativeY }; /** * Attaches extended data and `XRegExp.prototype` properties to a regex object. * * @private * @param {RegExp} regex Regex to augment. * @param {Array} captureNames Array with capture names, or `null`. * @param {String} xSource XRegExp pattern used to generate `regex`, or `null` if N/A. * @param {String} xFlags XRegExp flags used to generate `regex`, or `null` if N/A. * @param {Boolean} [isInternalOnly=false] Whether the regex will be used only for internal * operations, and never exposed to users. For internal-only regexes, we can improve perf by * skipping some operations like attaching `XRegExp.prototype` properties. * @returns {RegExp} Augmented regex. */ function augment(regex, captureNames, xSource, xFlags, isInternalOnly) { var p; regex[REGEX_DATA] = { captureNames: captureNames }; if (isInternalOnly) { return regex; } // Can't auto-inherit these since the XRegExp constructor returns a nonprimitive value if (regex.__proto__) { regex.__proto__ = XRegExp.prototype; } else { for (p in XRegExp.prototype) { // An `XRegExp.prototype.hasOwnProperty(p)` check wouldn't be worth it here, since this // is performance sensitive, and enumerable `Object.prototype` or `RegExp.prototype` // extensions exist on `regex.prototype` anyway regex[p] = XRegExp.prototype[p]; } } regex[REGEX_DATA].source = xSource; // Emulate the ES6 `flags` prop by ensuring flags are in alphabetical order regex[REGEX_DATA].flags = xFlags ? xFlags.split('').sort().join('') : xFlags; return regex; } /** * Removes any duplicate characters from the provided string. * * @private * @param {String} str String to remove duplicate characters from. * @returns {String} String with any duplicate characters removed. */ function clipDuplicates(str) { return nativ.replace.call(str, /([\s\S])(?=[\s\S]*\1)/g, ''); } /** * Copies a regex object while preserving extended data and augmenting with `XRegExp.prototype` * properties. The copy has a fresh `lastIndex` property (set to zero). Allows adding and removing * flags g and y while copying the regex. * * @private * @param {RegExp} regex Regex to copy. * @param {Object} [options] Options object with optional properties: * - `addG` {Boolean} Add flag g while copying the regex. * - `addY` {Boolean} Add flag y while copying the regex. * - `removeG` {Boolean} Remove flag g while copying the regex. * - `removeY` {Boolean} Remove flag y while copying the regex. * - `isInternalOnly` {Boolean} Whether the copied regex will be used only for internal * operations, and never exposed to users. For internal-only regexes, we can improve perf by * skipping some operations like attaching `XRegExp.prototype` properties. * - `source` {String} Overrides `.source`, for special cases. * @returns {RegExp} Copy of the provided regex, possibly with modified flags. */ function copyRegex(regex, options) { if (!XRegExp.isRegExp(regex)) { throw new TypeError('Type RegExp expected'); } var xData = regex[REGEX_DATA] || {}; var flags = getNativeFlags(regex); var flagsToAdd = ''; var flagsToRemove = ''; var xregexpSource = null; var xregexpFlags = null; options = options || {}; if (options.removeG) {flagsToRemove += 'g';} if (options.removeY) {flagsToRemove += 'y';} if (flagsToRemove) { flags = nativ.replace.call(flags, new RegExp('[' + flagsToRemove + ']+', 'g'), ''); } if (options.addG) {flagsToAdd += 'g';} if (options.addY) {flagsToAdd += 'y';} if (flagsToAdd) { flags = clipDuplicates(flags + flagsToAdd); } if (!options.isInternalOnly) { if (xData.source !== undefined) { xregexpSource = xData.source; } // null or undefined; don't want to add to `flags` if the previous value was null, since // that indicates we're not tracking original precompilation flags if (xData.flags != null) { // Flags are only added for non-internal regexes by `XRegExp.globalize`. Flags are never // removed for non-internal regexes, so don't need to handle it xregexpFlags = flagsToAdd ? clipDuplicates(xData.flags + flagsToAdd) : xData.flags; } } // Augment with `XRegExp.prototype` properties, but use the native `RegExp` constructor to avoid // searching for special tokens. That would be wrong for regexes constructed by `RegExp`, and // unnecessary for regexes constructed by `XRegExp` because the regex has already undergone the // translation to native regex syntax regex = augment( new RegExp(options.source || regex.source, flags), hasNamedCapture(regex) ? xData.captureNames.slice(0) : null, xregexpSource, xregexpFlags, options.isInternalOnly ); return regex; } /** * Converts hexadecimal to decimal. * * @private * @param {String} hex * @returns {Number} */ function dec(hex) { return parseInt(hex, 16); } /** * Returns a pattern that can be used in a native RegExp in place of an ignorable token such as an * inline comment or whitespace with flag x. This is used directly as a token handler function * passed to `XRegExp.addToken`. * * @private * @param {String} match Match arg of `XRegExp.addToken` handler * @param {String} scope Scope arg of `XRegExp.addToken` handler * @param {String} flags Flags arg of `XRegExp.addToken` handler * @returns {String} Either '' or '(?:)', depending on which is needed in the context of the match. */ function getContextualTokenSeparator(match, scope, flags) { if ( // No need to separate tokens if at the beginning or end of a group match.input.charAt(match.index - 1) === '(' || match.input.charAt(match.index + match[0].length) === ')' || // Avoid separating tokens when the following token is a quantifier isPatternNext(match.input, match.index + match[0].length, flags, '[?*+]|{\\d+(?:,\\d*)?}') ) { return ''; } // Keep tokens separated. This avoids e.g. inadvertedly changing `\1 1` or `\1(?#)1` to `\11`. // This also ensures all tokens remain as discrete atoms, e.g. it avoids converting the syntax // error `(? :` into `(?:`. return '(?:)'; } /** * Returns native `RegExp` flags used by a regex object. * * @private * @param {RegExp} regex Regex to check. * @returns {String} Native flags in use. */ function getNativeFlags(regex) { return hasFlagsProp ? regex.flags : // Explicitly using `RegExp.prototype.toString` (rather than e.g. `String` or concatenation // with an empty string) allows this to continue working predictably when // `XRegExp.proptotype.toString` is overridden nativ.exec.call(/\/([a-z]*)$/i, RegExp.prototype.toString.call(regex))[1]; } /** * Determines whether a regex has extended instance data used to track capture names. * * @private * @param {RegExp} regex Regex to check. * @returns {Boolean} Whether the regex uses named capture. */ function hasNamedCapture(regex) { return !!(regex[REGEX_DATA] && regex[REGEX_DATA].captureNames); } /** * Converts decimal to hexadecimal. * * @private * @param {Number|String} dec * @returns {String} */ function hex(dec) { return parseInt(dec, 10).toString(16); } /** * Returns the first index at which a given value can be found in an array. * * @private * @param {Array} array Array to search. * @param {*} value Value to locate in the array. * @returns {Number} Zero-based index at which the item is found, or -1. */ function indexOf(array, value) { var len = array.length; var i; for (i = 0; i < len; ++i) { if (array[i] === value) { return i; } } return -1; } /** * Checks whether the next nonignorable token after the specified position matches the * `needlePattern` * * @private * @param {String} pattern Pattern to search within. * @param {Number} pos Index in `pattern` to search at. * @param {String} flags Flags used by the pattern. * @param {String} needlePattern Pattern to match the next token against. * @returns {Boolean} Whether the next nonignorable token matches `needlePattern` */ function isPatternNext(pattern, pos, flags, needlePattern) { var inlineCommentPattern = '\\(\\?#[^)]*\\)'; var lineCommentPattern = '#[^#\\n]*'; var patternsToIgnore = flags.indexOf('x') > -1 ? // Ignore any leading whitespace, line comments, and inline comments ['\\s', lineCommentPattern, inlineCommentPattern] : // Ignore any leading inline comments [inlineCommentPattern]; return nativ.test.call( new RegExp('^(?:' + patternsToIgnore.join('|') + ')*(?:' + needlePattern + ')'), pattern.slice(pos) ); } /** * Determines whether a value is of the specified type, by resolving its internal [[Class]]. * * @private * @param {*} value Object to check. * @param {String} type Type to check for, in TitleCase. * @returns {Boolean} Whether the object matches the type. */ function isType(value, type) { return toString.call(value) === '[object ' + type + ']'; } /** * Adds leading zeros if shorter than four characters. Used for fixed-length hexadecimal values. * * @private * @param {String} str * @returns {String} */ function pad4(str) { while (str.length < 4) { str = '0' + str; } return str; } /** * Checks for flag-related errors, and strips/applies flags in a leading mode modifier. Offloads * the flag preparation logic from the `XRegExp` constructor. * * @private * @param {String} pattern Regex pattern, possibly with a leading mode modifier. * @param {String} flags Any combination of flags. * @returns {Object} Object with properties `pattern` and `flags`. */ function prepareFlags(pattern, flags) { var i; // Recent browsers throw on duplicate flags, so copy this behavior for nonnative flags if (clipDuplicates(flags) !== flags) { throw new SyntaxError('Invalid duplicate regex flag ' + flags); } // Strip and apply a leading mode modifier with any combination of flags except g or y pattern = nativ.replace.call(pattern, /^\(\?([\w$]+)\)/, function($0, $1) { if (nativ.test.call(/[gy]/, $1)) { throw new SyntaxError('Cannot use flag g or y in mode modifier ' + $0); } // Allow duplicate flags within the mode modifier flags = clipDuplicates(flags + $1); return ''; }); // Throw on unknown native or nonnative flags for (i = 0; i < flags.length; ++i) { if (!registeredFlags[flags.charAt(i)]) { throw new SyntaxError('Unknown regex flag ' + flags.charAt(i)); } } return { pattern: pattern, flags: flags }; } /** * Prepares an options object from the given value. * * @private * @param {String|Object} value Value to convert to an options object. * @returns {Object} Options object. */ function prepareOptions(value) { var options = {}; if (isType(value, 'String')) { XRegExp.forEach(value, /[^\s,]+/, function(match) { options[match] = true; }); return options; } return value; } /** * Registers a flag so it doesn't throw an 'unknown flag' error. * * @private * @param {String} flag Single-character flag to register. */ function registerFlag(flag) { if (!/^[\w$]$/.test(flag)) { throw new Error('Flag must be a single character A-Za-z0-9_$'); } registeredFlags[flag] = true; } /** * Runs built-in and custom regex syntax tokens in reverse insertion order at the specified * position, until a match is found. * * @private * @param {String} pattern Original pattern from which an XRegExp object is being built. * @param {String} flags Flags being used to construct the regex. * @param {Number} pos Position to search for tokens within `pattern`. * @param {Number} scope Regex scope to apply: 'default' or 'class'. * @param {Object} context Context object to use for token handler functions. * @returns {Object} Object with properties `matchLength`, `output`, and `reparse`; or `null`. */ function runTokens(pattern, flags, pos, scope, context) { var i = tokens.length; var leadChar = pattern.charAt(pos); var result = null; var match; var t; // Run in reverse insertion order while (i--) { t = tokens[i]; if ( (t.leadChar && t.leadChar !== leadChar) || (t.scope !== scope && t.scope !== 'all') || (t.flag && flags.indexOf(t.flag) === -1) ) { continue; } match = XRegExp.exec(pattern, t.regex, pos, 'sticky'); if (match) { result = { matchLength: match[0].length, output: t.handler.call(context, match, scope, flags), reparse: t.reparse }; // Finished with token tests break; } } return result; } /** * Enables or disables implicit astral mode opt-in. When enabled, flag A is automatically added to * all new regexes created by XRegExp. This causes an error to be thrown when creating regexes if * the Unicode Base addon is not available, since flag A is registered by that addon. * * @private * @param {Boolean} on `true` to enable; `false` to disable. */ function setAstral(on) { features.astral = on; } /** * Enables or disables native method overrides. * * @private * @param {Boolean} on `true` to enable; `false` to disable. */ function setNatives(on) { RegExp.prototype.exec = (on ? fixed : nativ).exec; RegExp.prototype.test = (on ? fixed : nativ).test; String.prototype.match = (on ? fixed : nativ).match; String.prototype.replace = (on ? fixed : nativ).replace; String.prototype.split = (on ? fixed : nativ).split; features.natives = on; } /** * Returns the object, or throws an error if it is `null` or `undefined`. This is used to follow * the ES5 abstract operation `ToObject`. * * @private * @param {*} value Object to check and return. * @returns {*} The provided object. */ function toObject(value) { // null or undefined if (value == null) { throw new TypeError('Cannot convert null or undefined to object'); } return value; } // ==--------------------------== // Constructor // ==--------------------------== /** * Creates an extended regular expression object for matching text with a pattern. Differs from a * native regular expression in that additional syntax and flags are supported. The returned object * is in fact a native `RegExp` and works with all native methods. * * @class XRegExp * @constructor * @param {String|RegExp} pattern Regex pattern string, or an existing regex object to copy. * @param {String} [flags] Any combination of flags. * Native flags: * - `g` - global * - `i` - ignore case * - `m` - multiline anchors * - `u` - unicode (ES6) * - `y` - sticky (Firefox 3+, ES6) * Additional XRegExp flags: * - `n` - explicit capture * - `s` - dot matches all (aka singleline) * - `x` - free-spacing and line comments (aka extended) * - `A` - astral (requires the Unicode Base addon) * Flags cannot be provided when constructing one `RegExp` from another. * @returns {RegExp} Extended regular expression object. * @example * * // With named capture and flag x * XRegExp('(? [0-9]{4} ) -? # year \n\ * (? [0-9]{2} ) -? # month \n\ * (? [0-9]{2} ) # day ', 'x'); * * // Providing a regex object copies it. Native regexes are recompiled using native (not XRegExp) * // syntax. Copies maintain extended data, are augmented with `XRegExp.prototype` properties, and * // have fresh `lastIndex` properties (set to zero). * XRegExp(/regex/); */ function XRegExp(pattern, flags) { if (XRegExp.isRegExp(pattern)) { if (flags !== undefined) { throw new TypeError('Cannot supply flags when copying a RegExp'); } return copyRegex(pattern); } // Copy the argument behavior of `RegExp` pattern = pattern === undefined ? '' : String(pattern); flags = flags === undefined ? '' : String(flags); if (XRegExp.isInstalled('astral') && flags.indexOf('A') === -1) { // This causes an error to be thrown if the Unicode Base addon is not available flags += 'A'; } if (!patternCache[pattern]) { patternCache[pattern] = {}; } if (!patternCache[pattern][flags]) { var context = { hasNamedCapture: false, captureNames: [] }; var scope = defaultScope; var output = ''; var pos = 0; var result; // Check for flag-related errors, and strip/apply flags in a leading mode modifier var applied = prepareFlags(pattern, flags); var appliedPattern = applied.pattern; var appliedFlags = applied.flags; // Use XRegExp's tokens to translate the pattern to a native regex pattern. // `appliedPattern.length` may change on each iteration if tokens use `reparse` while (pos < appliedPattern.length) { do { // Check for custom tokens at the current position result = runTokens(appliedPattern, appliedFlags, pos, scope, context); // If the matched token used the `reparse` option, splice its output into the // pattern before running tokens again at the same position if (result && result.reparse) { appliedPattern = appliedPattern.slice(0, pos) + result.output + appliedPattern.slice(pos + result.matchLength); } } while (result && result.reparse); if (result) { output += result.output; pos += (result.matchLength || 1); } else { // Get the native token at the current position var token = XRegExp.exec(appliedPattern, nativeTokens[scope], pos, 'sticky')[0]; output += token; pos += token.length; if (token === '[' && scope === defaultScope) { scope = classScope; } else if (token === ']' && scope === classScope) { scope = defaultScope; } } } patternCache[pattern][flags] = { // Use basic cleanup to collapse repeated empty groups like `(?:)(?:)` to `(?:)`. Empty // groups are sometimes inserted during regex transpilation in order to keep tokens // separated. However, more than one empty group in a row is never needed. pattern: nativ.replace.call(output, /(?:\(\?:\))+/g, '(?:)'), // Strip all but native flags flags: nativ.replace.call(appliedFlags, /[^gimuy]+/g, ''), // `context.captureNames` has an item for each capturing group, even if unnamed captures: context.hasNamedCapture ? context.captureNames : null }; } var generated = patternCache[pattern][flags]; return augment( new RegExp(generated.pattern, generated.flags), generated.captures, pattern, flags ); } // Add `RegExp.prototype` to the prototype chain XRegExp.prototype = new RegExp(); // ==--------------------------== // Public properties // ==--------------------------== /** * The XRegExp version number as a string containing three dot-separated parts. For example, * '2.0.0-beta-3'. * * @static * @memberOf XRegExp * @type String */ XRegExp.version = '3.2.0'; // ==--------------------------== // Public methods // ==--------------------------== // Intentionally undocumented; used in tests and addons XRegExp._clipDuplicates = clipDuplicates; XRegExp._hasNativeFlag = hasNativeFlag; XRegExp._dec = dec; XRegExp._hex = hex; XRegExp._pad4 = pad4; /** * Extends XRegExp syntax and allows custom flags. This is used internally and can be used to * create XRegExp addons. If more than one token can match the same string, the last added wins. * * @memberOf XRegExp * @param {RegExp} regex Regex object that matches the new token. * @param {Function} handler Function that returns a new pattern string (using native regex syntax) * to replace the matched token within all future XRegExp regexes. Has access to persistent * properties of the regex being built, through `this`. Invoked with three arguments: * - The match array, with named backreference properties. * - The regex scope where the match was found: 'default' or 'class'. * - The flags used by the regex, including any flags in a leading mode modifier. * The handler function becomes part of the XRegExp construction process, so be careful not to * construct XRegExps within the function or you will trigger infinite recursion. * @param {Object} [options] Options object with optional properties: * - `scope` {String} Scope where the token applies: 'default', 'class', or 'all'. * - `flag` {String} Single-character flag that triggers the token. This also registers the * flag, which prevents XRegExp from throwing an 'unknown flag' error when the flag is used. * - `optionalFlags` {String} Any custom flags checked for within the token `handler` that are * not required to trigger the token. This registers the flags, to prevent XRegExp from * throwing an 'unknown flag' error when any of the flags are used. * - `reparse` {Boolean} Whether the `handler` function's output should not be treated as * final, and instead be reparseable by other tokens (including the current token). Allows * token chaining or deferring. * - `leadChar` {String} Single character that occurs at the beginning of any successful match * of the token (not always applicable). This doesn't change the behavior of the token unless * you provide an erroneous value. However, providing it can increase the token's performance * since the token can be skipped at any positions where this character doesn't appear. * @example * * // Basic usage: Add \a for the ALERT control code * XRegExp.addToken( * /\\a/, * function() {return '\\x07';}, * {scope: 'all'} * ); * XRegExp('\\a[\\a-\\n]+').test('\x07\n\x07'); // -> true * * // Add the U (ungreedy) flag from PCRE and RE2, which reverses greedy and lazy quantifiers. * // Since `scope` is not specified, it uses 'default' (i.e., transformations apply outside of * // character classes only) * XRegExp.addToken( * /([?*+]|{\d+(?:,\d*)?})(\??)/, * function(match) {return match[1] + (match[2] ? '' : '?');}, * {flag: 'U'} * ); * XRegExp('a+', 'U').exec('aaa')[0]; // -> 'a' * XRegExp('a+?', 'U').exec('aaa')[0]; // -> 'aaa' */ XRegExp.addToken = function(regex, handler, options) { options = options || {}; var optionalFlags = options.optionalFlags; var i; if (options.flag) { registerFlag(options.flag); } if (optionalFlags) { optionalFlags = nativ.split.call(optionalFlags, ''); for (i = 0; i < optionalFlags.length; ++i) { registerFlag(optionalFlags[i]); } } // Add to the private list of syntax tokens tokens.push({ regex: copyRegex(regex, { addG: true, addY: hasNativeY, isInternalOnly: true }), handler: handler, scope: options.scope || defaultScope, flag: options.flag, reparse: options.reparse, leadChar: options.leadChar }); // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and flags // might now produce different results XRegExp.cache.flush('patterns'); }; /** * Caches and returns the result of calling `XRegExp(pattern, flags)`. On any subsequent call with * the same pattern and flag combination, the cached copy of the regex is returned. * * @memberOf XRegExp * @param {String} pattern Regex pattern string. * @param {String} [flags] Any combination of XRegExp flags. * @returns {RegExp} Cached XRegExp object. * @example * * while (match = XRegExp.cache('.', 'gs').exec(str)) { * // The regex is compiled once only * } */ XRegExp.cache = function(pattern, flags) { if (!regexCache[pattern]) { regexCache[pattern] = {}; } return regexCache[pattern][flags] || ( regexCache[pattern][flags] = XRegExp(pattern, flags) ); }; // Intentionally undocumented; used in tests XRegExp.cache.flush = function(cacheName) { if (cacheName === 'patterns') { // Flush the pattern cache used by the `XRegExp` constructor patternCache = {}; } else { // Flush the regex cache populated by `XRegExp.cache` regexCache = {}; } }; /** * Escapes any regular expression metacharacters, for use when matching literal strings. The result * can safely be used at any point within a regex that uses any flags. * * @memberOf XRegExp * @param {String} str String to escape. * @returns {String} String with regex metacharacters escaped. * @example * * XRegExp.escape('Escaped? <.>'); * // -> 'Escaped\?\ <\.>' */ XRegExp.escape = function(str) { return nativ.replace.call(toObject(str), /[-\[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); }; /** * Executes a regex search in a specified string. Returns a match array or `null`. If the provided * regex uses named capture, named backreference properties are included on the match array. * Optional `pos` and `sticky` arguments specify the search start position, and whether the match * must start at the specified position only. The `lastIndex` property of the provided regex is not * used, but is updated for compatibility. Also fixes browser bugs compared to the native * `RegExp.prototype.exec` and can be used reliably cross-browser. * * @memberOf XRegExp * @param {String} str String to search. * @param {RegExp} regex Regex to search with. * @param {Number} [pos=0] Zero-based index at which to start the search. * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position * only. The string `'sticky'` is accepted as an alternative to `true`. * @returns {Array} Match array with named backreference properties, or `null`. * @example * * // Basic use, with named backreference * var match = XRegExp.exec('U+2620', XRegExp('U\\+(?[0-9A-F]{4})')); * match.hex; // -> '2620' * * // With pos and sticky, in a loop * var pos = 2, result = [], match; * while (match = XRegExp.exec('<1><2><3><4>5<6>', /<(\d)>/, pos, 'sticky')) { * result.push(match[1]); * pos = match.index + match[0].length; * } * // result -> ['2', '3', '4'] */ XRegExp.exec = function(str, regex, pos, sticky) { var cacheKey = 'g'; var addY = false; var fakeY = false; var match; var r2; addY = hasNativeY && !!(sticky || (regex.sticky && sticky !== false)); if (addY) { cacheKey += 'y'; } else if (sticky) { // Simulate sticky matching by appending an empty capture to the original regex. The // resulting regex will succeed no matter what at the current index (set with `lastIndex`), // and will not search the rest of the subject string. We'll know that the original regex // has failed if that last capture is `''` rather than `undefined` (i.e., if that last // capture participated in the match). fakeY = true; cacheKey += 'FakeY'; } regex[REGEX_DATA] = regex[REGEX_DATA] || {}; // Shares cached copies with `XRegExp.match`/`replace` r2 = regex[REGEX_DATA][cacheKey] || ( regex[REGEX_DATA][cacheKey] = copyRegex(regex, { addG: true, addY: addY, source: fakeY ? regex.source + '|()' : undefined, removeY: sticky === false, isInternalOnly: true }) ); pos = pos || 0; r2.lastIndex = pos; // Fixed `exec` required for `lastIndex` fix, named backreferences, etc. match = fixed.exec.call(r2, str); // Get rid of the capture added by the pseudo-sticky matcher if needed. An empty string means // the original regexp failed (see above). if (fakeY && match && match.pop() === '') { match = null; } if (regex.global) { regex.lastIndex = match ? r2.lastIndex : 0; } return match; }; /** * Executes a provided function once per regex match. Searches always start at the beginning of the * string and continue until the end, regardless of the state of the regex's `global` property and * initial `lastIndex`. * * @memberOf XRegExp * @param {String} str String to search. * @param {RegExp} regex Regex to search with. * @param {Function} callback Function to execute for each match. Invoked with four arguments: * - The match array, with named backreference properties. * - The zero-based match index. * - The string being traversed. * - The regex object being used to traverse the string. * @example * * // Extracts every other digit from a string * var evens = []; * XRegExp.forEach('1a2345', /\d/, function(match, i) { * if (i % 2) evens.push(+match[0]); * }); * // evens -> [2, 4] */ XRegExp.forEach = function(str, regex, callback) { var pos = 0; var i = -1; var match; while ((match = XRegExp.exec(str, regex, pos))) { // Because `regex` is provided to `callback`, the function could use the deprecated/ // nonstandard `RegExp.prototype.compile` to mutate the regex. However, since `XRegExp.exec` // doesn't use `lastIndex` to set the search position, this can't lead to an infinite loop, // at least. Actually, because of the way `XRegExp.exec` caches globalized versions of // regexes, mutating the regex will not have any effect on the iteration or matched strings, // which is a nice side effect that brings extra safety. callback(match, ++i, str, regex); pos = match.index + (match[0].length || 1); } }; /** * Copies a regex object and adds flag `g`. The copy maintains extended data, is augmented with * `XRegExp.prototype` properties, and has a fresh `lastIndex` property (set to zero). Native * regexes are not recompiled using XRegExp syntax. * * @memberOf XRegExp * @param {RegExp} regex Regex to globalize. * @returns {RegExp} Copy of the provided regex with flag `g` added. * @example * * var globalCopy = XRegExp.globalize(/regex/); * globalCopy.global; // -> true */ XRegExp.globalize = function(regex) { return copyRegex(regex, {addG: true}); }; /** * Installs optional features according to the specified options. Can be undone using * `XRegExp.uninstall`. * * @memberOf XRegExp * @param {Object|String} options Options object or string. * @example * * // With an options object * XRegExp.install({ * // Enables support for astral code points in Unicode addons (implicitly sets flag A) * astral: true, * * // DEPRECATED: Overrides native regex methods with fixed/extended versions * natives: true * }); * * // With an options string * XRegExp.install('astral natives'); */ XRegExp.install = function(options) { options = prepareOptions(options); if (!features.astral && options.astral) { setAstral(true); } if (!features.natives && options.natives) { setNatives(true); } }; /** * Checks whether an individual optional feature is installed. * * @memberOf XRegExp * @param {String} feature Name of the feature to check. One of: * - `astral` * - `natives` * @returns {Boolean} Whether the feature is installed. * @example * * XRegExp.isInstalled('astral'); */ XRegExp.isInstalled = function(feature) { return !!(features[feature]); }; /** * Returns `true` if an object is a regex; `false` if it isn't. This works correctly for regexes * created in another frame, when `instanceof` and `constructor` checks would fail. * * @memberOf XRegExp * @param {*} value Object to check. * @returns {Boolean} Whether the object is a `RegExp` object. * @example * * XRegExp.isRegExp('string'); // -> false * XRegExp.isRegExp(/regex/i); // -> true * XRegExp.isRegExp(RegExp('^', 'm')); // -> true * XRegExp.isRegExp(XRegExp('(?s).')); // -> true */ XRegExp.isRegExp = function(value) { return toString.call(value) === '[object RegExp]'; //return isType(value, 'RegExp'); }; /** * Returns the first matched string, or in global mode, an array containing all matched strings. * This is essentially a more convenient re-implementation of `String.prototype.match` that gives * the result types you actually want (string instead of `exec`-style array in match-first mode, * and an empty array instead of `null` when no matches are found in match-all mode). It also lets * you override flag g and ignore `lastIndex`, and fixes browser bugs. * * @memberOf XRegExp * @param {String} str String to search. * @param {RegExp} regex Regex to search with. * @param {String} [scope='one'] Use 'one' to return the first match as a string. Use 'all' to * return an array of all matched strings. If not explicitly specified and `regex` uses flag g, * `scope` is 'all'. * @returns {String|Array} In match-first mode: First match as a string, or `null`. In match-all * mode: Array of all matched strings, or an empty array. * @example * * // Match first * XRegExp.match('abc', /\w/); // -> 'a' * XRegExp.match('abc', /\w/g, 'one'); // -> 'a' * XRegExp.match('abc', /x/g, 'one'); // -> null * * // Match all * XRegExp.match('abc', /\w/g); // -> ['a', 'b', 'c'] * XRegExp.match('abc', /\w/, 'all'); // -> ['a', 'b', 'c'] * XRegExp.match('abc', /x/, 'all'); // -> [] */ XRegExp.match = function(str, regex, scope) { var global = (regex.global && scope !== 'one') || scope === 'all'; var cacheKey = ((global ? 'g' : '') + (regex.sticky ? 'y' : '')) || 'noGY'; var result; var r2; regex[REGEX_DATA] = regex[REGEX_DATA] || {}; // Shares cached copies with `XRegExp.exec`/`replace` r2 = regex[REGEX_DATA][cacheKey] || ( regex[REGEX_DATA][cacheKey] = copyRegex(regex, { addG: !!global, removeG: scope === 'one', isInternalOnly: true }) ); result = nativ.match.call(toObject(str), r2); if (regex.global) { regex.lastIndex = ( (scope === 'one' && result) ? // Can't use `r2.lastIndex` since `r2` is nonglobal in this case (result.index + result[0].length) : 0 ); } return global ? (result || []) : (result && result[0]); }; /** * Retrieves the matches from searching a string using a chain of regexes that successively search * within previous matches. The provided `chain` array can contain regexes and or objects with * `regex` and `backref` properties. When a backreference is specified, the named or numbered * backreference is passed forward to the next regex or returned. * * @memberOf XRegExp * @param {String} str String to search. * @param {Array} chain Regexes that each search for matches within preceding results. * @returns {Array} Matches by the last regex in the chain, or an empty array. * @example * * // Basic usage; matches numbers within tags * XRegExp.matchChain('1 2 3 4 a 56', [ * XRegExp('(?is).*?'), * /\d+/ * ]); * // -> ['2', '4', '56'] * * // Passing forward and returning specific backreferences * html = 'XRegExp\ * Google'; * XRegExp.matchChain(html, [ * {regex: //i, backref: 1}, * {regex: XRegExp('(?i)^https?://(?[^/?#]+)'), backref: 'domain'} * ]); * // -> ['xregexp.com', 'www.google.com'] */ XRegExp.matchChain = function(str, chain) { return (function recurseChain(values, level) { var item = chain[level].regex ? chain[level] : {regex: chain[level]}; var matches = []; function addMatch(match) { if (item.backref) { // Safari 4.0.5 (but not 5.0.5+) inappropriately uses sparse arrays to hold the // `undefined`s for backreferences to nonparticipating capturing groups. In such // cases, a `hasOwnProperty` or `in` check on its own would inappropriately throw // the exception, so also check if the backreference is a number that is within the // bounds of the array. if (!(match.hasOwnProperty(item.backref) || +item.backref < match.length)) { throw new ReferenceError('Backreference to undefined group: ' + item.backref); } matches.push(match[item.backref] || ''); } else { matches.push(match[0]); } } for (var i = 0; i < values.length; ++i) { XRegExp.forEach(values[i], item.regex, addMatch); } return ((level === chain.length - 1) || !matches.length) ? matches : recurseChain(matches, level + 1); }([str], 0)); }; /** * Returns a new string with one or all matches of a pattern replaced. The pattern can be a string * or regex, and the replacement can be a string or a function to be called for each match. To * perform a global search and replace, use the optional `scope` argument or include flag g if using * a regex. Replacement strings can use `${n}` for named and numbered backreferences. Replacement * functions can use named backreferences via `arguments[0].name`. Also fixes browser bugs compared * to the native `String.prototype.replace` and can be used reliably cross-browser. * * @memberOf XRegExp * @param {String} str String to search. * @param {RegExp|String} search Search pattern to be replaced. * @param {String|Function} replacement Replacement string or a function invoked to create it. * Replacement strings can include special replacement syntax: * - $$ - Inserts a literal $ character. * - $&, $0 - Inserts the matched substring. * - $` - Inserts the string that precedes the matched substring (left context). * - $' - Inserts the string that follows the matched substring (right context). * - $n, $nn - Where n/nn are digits referencing an existent capturing group, inserts * backreference n/nn. * - ${n} - Where n is a name or any number of digits that reference an existent capturing * group, inserts backreference n. * Replacement functions are invoked with three or more arguments: * - The matched substring (corresponds to $& above). Named backreferences are accessible as * properties of this first argument. * - 0..n arguments, one for each backreference (corresponding to $1, $2, etc. above). * - The zero-based index of the match within the total search string. * - The total string being searched. * @param {String} [scope='one'] Use 'one' to replace the first match only, or 'all'. If not * explicitly specified and using a regex with flag g, `scope` is 'all'. * @returns {String} New string with one or all matches replaced. * @example * * // Regex search, using named backreferences in replacement string * var name = XRegExp('(?\\w+) (?\\w+)'); * XRegExp.replace('John Smith', name, '${last}, ${first}'); * // -> 'Smith, John' * * // Regex search, using named backreferences in replacement function * XRegExp.replace('John Smith', name, function(match) { * return match.last + ', ' + match.first; * }); * // -> 'Smith, John' * * // String search, with replace-all * XRegExp.replace('RegExp builds RegExps', 'RegExp', 'XRegExp', 'all'); * // -> 'XRegExp builds XRegExps' */ XRegExp.replace = function(str, search, replacement, scope) { var isRegex = XRegExp.isRegExp(search); var global = (search.global && scope !== 'one') || scope === 'all'; var cacheKey = ((global ? 'g' : '') + (search.sticky ? 'y' : '')) || 'noGY'; var s2 = search; var result; if (isRegex) { search[REGEX_DATA] = search[REGEX_DATA] || {}; // Shares cached copies with `XRegExp.exec`/`match`. Since a copy is used, `search`'s // `lastIndex` isn't updated *during* replacement iterations s2 = search[REGEX_DATA][cacheKey] || ( search[REGEX_DATA][cacheKey] = copyRegex(search, { addG: !!global, removeG: scope === 'one', isInternalOnly: true }) ); } else if (global) { s2 = new RegExp(XRegExp.escape(String(search)), 'g'); } // Fixed `replace` required for named backreferences, etc. result = fixed.replace.call(toObject(str), s2, replacement); if (isRegex && search.global) { // Fixes IE, Safari bug (last tested IE 9, Safari 5.1) search.lastIndex = 0; } return result; }; /** * Performs batch processing of string replacements. Used like `XRegExp.replace`, but accepts an * array of replacement details. Later replacements operate on the output of earlier replacements. * Replacement details are accepted as an array with a regex or string to search for, the * replacement string or function, and an optional scope of 'one' or 'all'. Uses the XRegExp * replacement text syntax, which supports named backreference properties via `${name}`. * * @memberOf XRegExp * @param {String} str String to search. * @param {Array} replacements Array of replacement detail arrays. * @returns {String} New string with all replacements. * @example * * str = XRegExp.replaceEach(str, [ * [XRegExp('(?a)'), 'z${name}'], * [/b/gi, 'y'], * [/c/g, 'x', 'one'], // scope 'one' overrides /g * [/d/, 'w', 'all'], // scope 'all' overrides lack of /g * ['e', 'v', 'all'], // scope 'all' allows replace-all for strings * [/f/g, function($0) { * return $0.toUpperCase(); * }] * ]); */ XRegExp.replaceEach = function(str, replacements) { var i; var r; for (i = 0; i < replacements.length; ++i) { r = replacements[i]; str = XRegExp.replace(str, r[0], r[1], r[2]); } return str; }; /** * Splits a string into an array of strings using a regex or string separator. Matches of the * separator are not included in the result array. However, if `separator` is a regex that contains * capturing groups, backreferences are spliced into the result each time `separator` is matched. * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably * cross-browser. * * @memberOf XRegExp * @param {String} str String to split. * @param {RegExp|String} separator Regex or string to use for separating the string. * @param {Number} [limit] Maximum number of items to include in the result array. * @returns {Array} Array of substrings. * @example * * // Basic use * XRegExp.split('a b c', ' '); * // -> ['a', 'b', 'c'] * * // With limit * XRegExp.split('a b c', ' ', 2); * // -> ['a', 'b'] * * // Backreferences in result array * XRegExp.split('..word1..', /([a-z]+)(\d+)/i); * // -> ['..', 'word', '1', '..'] */ XRegExp.split = function(str, separator, limit) { return fixed.split.call(toObject(str), separator, limit); }; /** * Executes a regex search in a specified string. Returns `true` or `false`. Optional `pos` and * `sticky` arguments specify the search start position, and whether the match must start at the * specified position only. The `lastIndex` property of the provided regex is not used, but is * updated for compatibility. Also fixes browser bugs compared to the native * `RegExp.prototype.test` and can be used reliably cross-browser. * * @memberOf XRegExp * @param {String} str String to search. * @param {RegExp} regex Regex to search with. * @param {Number} [pos=0] Zero-based index at which to start the search. * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position * only. The string `'sticky'` is accepted as an alternative to `true`. * @returns {Boolean} Whether the regex matched the provided value. * @example * * // Basic use * XRegExp.test('abc', /c/); // -> true * * // With pos and sticky * XRegExp.test('abc', /c/, 0, 'sticky'); // -> false * XRegExp.test('abc', /c/, 2, 'sticky'); // -> true */ XRegExp.test = function(str, regex, pos, sticky) { // Do this the easy way :-) return !!XRegExp.exec(str, regex, pos, sticky); }; /** * Uninstalls optional features according to the specified options. All optional features start out * uninstalled, so this is used to undo the actions of `XRegExp.install`. * * @memberOf XRegExp * @param {Object|String} options Options object or string. * @example * * // With an options object * XRegExp.uninstall({ * // Disables support for astral code points in Unicode addons * astral: true, * * // DEPRECATED: Restores native regex methods * natives: true * }); * * // With an options string * XRegExp.uninstall('astral natives'); */ XRegExp.uninstall = function(options) { options = prepareOptions(options); if (features.astral && options.astral) { setAstral(false); } if (features.natives && options.natives) { setNatives(false); } }; /** * Returns an XRegExp object that is the union of the given patterns. Patterns can be provided as * regex objects or strings. Metacharacters are escaped in patterns provided as strings. * Backreferences in provided regex objects are automatically renumbered to work correctly within * the larger combined pattern. Native flags used by provided regexes are ignored in favor of the * `flags` argument. * * @memberOf XRegExp * @param {Array} patterns Regexes and strings to combine. * @param {String} [flags] Any combination of XRegExp flags. * @param {Object} [options] Options object with optional properties: * - `conjunction` {String} Type of conjunction to use: 'or' (default) or 'none'. * @returns {RegExp} Union of the provided regexes and strings. * @example * * XRegExp.union(['a+b*c', /(dogs)\1/, /(cats)\1/], 'i'); * // -> /a\+b\*c|(dogs)\1|(cats)\2/i * * XRegExp.union([/man/, /bear/, /pig/], 'i', {conjunction: 'none'}); * // -> /manbearpig/i */ XRegExp.union = function(patterns, flags, options) { options = options || {}; var conjunction = options.conjunction || 'or'; var numCaptures = 0; var numPriorCaptures; var captureNames; function rewrite(match, paren, backref) { var name = captureNames[numCaptures - numPriorCaptures]; // Capturing group if (paren) { ++numCaptures; // If the current capture has a name, preserve the name if (name) { return '(?<' + name + '>'; } // Backreference } else if (backref) { // Rewrite the backreference return '\\' + (+backref + numPriorCaptures); } return match; } if (!(isType(patterns, 'Array') && patterns.length)) { throw new TypeError('Must provide a nonempty array of patterns to merge'); } var parts = /(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g; var output = []; var pattern; for (var i = 0; i < patterns.length; ++i) { pattern = patterns[i]; if (XRegExp.isRegExp(pattern)) { numPriorCaptures = numCaptures; captureNames = (pattern[REGEX_DATA] && pattern[REGEX_DATA].captureNames) || []; // Rewrite backreferences. Passing to XRegExp dies on octals and ensures patterns are // independently valid; helps keep this simple. Named captures are put back output.push(nativ.replace.call(XRegExp(pattern.source).source, parts, rewrite)); } else { output.push(XRegExp.escape(pattern)); } } var separator = conjunction === 'none' ? '' : '|'; return XRegExp(output.join(separator), flags); }; // ==--------------------------== // Fixed/extended native methods // ==--------------------------== /** * Adds named capture support (with backreferences returned as `result.name`), and fixes browser * bugs in the native `RegExp.prototype.exec`. Calling `XRegExp.install('natives')` uses this to * override the native method. Use via `XRegExp.exec` without overriding natives. * * @memberOf RegExp * @param {String} str String to search. * @returns {Array} Match array with named backreference properties, or `null`. */ fixed.exec = function(str) { var origLastIndex = this.lastIndex; var match = nativ.exec.apply(this, arguments); var name; var r2; var i; if (match) { // Fix browsers whose `exec` methods don't return `undefined` for nonparticipating capturing // groups. This fixes IE 5.5-8, but not IE 9's quirks mode or emulation of older IEs. IE 9 // in standards mode follows the spec. if (!correctExecNpcg && match.length > 1 && indexOf(match, '') > -1) { r2 = copyRegex(this, { removeG: true, isInternalOnly: true }); // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed // matching due to characters outside the match nativ.replace.call(String(str).slice(match.index), r2, function() { var len = arguments.length; var i; // Skip index 0 and the last 2 for (i = 1; i < len - 2; ++i) { if (arguments[i] === undefined) { match[i] = undefined; } } }); } // Attach named capture properties if (this[REGEX_DATA] && this[REGEX_DATA].captureNames) { // Skip index 0 for (i = 1; i < match.length; ++i) { name = this[REGEX_DATA].captureNames[i - 1]; if (name) { match[name] = match[i]; } } } // Fix browsers that increment `lastIndex` after zero-length matches if (this.global && !match[0].length && (this.lastIndex > match.index)) { this.lastIndex = match.index; } } if (!this.global) { // Fixes IE, Opera bug (last tested IE 9, Opera 11.6) this.lastIndex = origLastIndex; } return match; }; /** * Fixes browser bugs in the native `RegExp.prototype.test`. Calling `XRegExp.install('natives')` * uses this to override the native method. * * @memberOf RegExp * @param {String} str String to search. * @returns {Boolean} Whether the regex matched the provided value. */ fixed.test = function(str) { // Do this the easy way :-) return !!fixed.exec.call(this, str); }; /** * Adds named capture support (with backreferences returned as `result.name`), and fixes browser * bugs in the native `String.prototype.match`. Calling `XRegExp.install('natives')` uses this to * override the native method. * * @memberOf String * @param {RegExp|*} regex Regex to search with. If not a regex object, it is passed to `RegExp`. * @returns {Array} If `regex` uses flag g, an array of match strings or `null`. Without flag g, * the result of calling `regex.exec(this)`. */ fixed.match = function(regex) { var result; if (!XRegExp.isRegExp(regex)) { // Use the native `RegExp` rather than `XRegExp` regex = new RegExp(regex); } else if (regex.global) { result = nativ.match.apply(this, arguments); // Fixes IE bug regex.lastIndex = 0; return result; } return fixed.exec.call(regex, toObject(this)); }; /** * Adds support for `${n}` tokens for named and numbered backreferences in replacement text, and * provides named backreferences to replacement functions as `arguments[0].name`. Also fixes browser * bugs in replacement text syntax when performing a replacement using a nonregex search value, and * the value of a replacement regex's `lastIndex` property during replacement iterations and upon * completion. Calling `XRegExp.install('natives')` uses this to override the native method. Note * that this doesn't support SpiderMonkey's proprietary third (`flags`) argument. Use via * `XRegExp.replace` without overriding natives. * * @memberOf String * @param {RegExp|String} search Search pattern to be replaced. * @param {String|Function} replacement Replacement string or a function invoked to create it. * @returns {String} New string with one or all matches replaced. */ fixed.replace = function(search, replacement) { var isRegex = XRegExp.isRegExp(search); var origLastIndex; var captureNames; var result; if (isRegex) { if (search[REGEX_DATA]) { captureNames = search[REGEX_DATA].captureNames; } // Only needed if `search` is nonglobal origLastIndex = search.lastIndex; } else { search += ''; // Type-convert } // Don't use `typeof`; some older browsers return 'function' for regex objects if (isType(replacement, 'Function')) { // Stringifying `this` fixes a bug in IE < 9 where the last argument in replacement // functions isn't type-converted to a string result = nativ.replace.call(String(this), search, function() { var args = arguments; var i; if (captureNames) { // Change the `arguments[0]` string primitive to a `String` object that can store // properties. This really does need to use `String` as a constructor args[0] = new String(args[0]); // Store named backreferences on the first argument for (i = 0; i < captureNames.length; ++i) { if (captureNames[i]) { args[0][captureNames[i]] = args[i + 1]; } } } // Update `lastIndex` before calling `replacement`. Fixes IE, Chrome, Firefox, Safari // bug (last tested IE 9, Chrome 17, Firefox 11, Safari 5.1) if (isRegex && search.global) { search.lastIndex = args[args.length - 2] + args[0].length; } // ES6 specs the context for replacement functions as `undefined` return replacement.apply(undefined, args); }); } else { // Ensure that the last value of `args` will be a string when given nonstring `this`, // while still throwing on null or undefined context result = nativ.replace.call(this == null ? this : String(this), search, function() { // Keep this function's `arguments` available through closure var args = arguments; return nativ.replace.call(String(replacement), replacementToken, function($0, $1, $2) { var n; // Named or numbered backreference with curly braces if ($1) { // XRegExp behavior for `${n}`: // 1. Backreference to numbered capture, if `n` is an integer. Use `0` for the // entire match. Any number of leading zeros may be used. // 2. Backreference to named capture `n`, if it exists and is not an integer // overridden by numbered capture. In practice, this does not overlap with // numbered capture since XRegExp does not allow named capture to use a bare // integer as the name. // 3. If the name or number does not refer to an existing capturing group, it's // an error. n = +$1; // Type-convert; drop leading zeros if (n <= args.length - 3) { return args[n] || ''; } // Groups with the same name is an error, else would need `lastIndexOf` n = captureNames ? indexOf(captureNames, $1) : -1; if (n < 0) { throw new SyntaxError('Backreference to undefined group ' + $0); } return args[n + 1] || ''; } // Else, special variable or numbered backreference without curly braces if ($2 === '$') { // $$ return '$'; } if ($2 === '&' || +$2 === 0) { // $&, $0 (not followed by 1-9), $00 return args[0]; } if ($2 === '`') { // $` (left context) return args[args.length - 1].slice(0, args[args.length - 2]); } if ($2 === "'") { // $' (right context) return args[args.length - 1].slice(args[args.length - 2] + args[0].length); } // Else, numbered backreference without curly braces $2 = +$2; // Type-convert; drop leading zero // XRegExp behavior for `$n` and `$nn`: // - Backrefs end after 1 or 2 digits. Use `${..}` for more digits. // - `$1` is an error if no capturing groups. // - `$10` is an error if less than 10 capturing groups. Use `${1}0` instead. // - `$01` is `$1` if at least one capturing group, else it's an error. // - `$0` (not followed by 1-9) and `$00` are the entire match. // Native behavior, for comparison: // - Backrefs end after 1 or 2 digits. Cannot reference capturing group 100+. // - `$1` is a literal `$1` if no capturing groups. // - `$10` is `$1` followed by a literal `0` if less than 10 capturing groups. // - `$01` is `$1` if at least one capturing group, else it's a literal `$01`. // - `$0` is a literal `$0`. if (!isNaN($2)) { if ($2 > args.length - 3) { throw new SyntaxError('Backreference to undefined group ' + $0); } return args[$2] || ''; } // `$` followed by an unsupported char is an error, unlike native JS throw new SyntaxError('Invalid token ' + $0); }); }); } if (isRegex) { if (search.global) { // Fixes IE, Safari bug (last tested IE 9, Safari 5.1) search.lastIndex = 0; } else { // Fixes IE, Opera bug (last tested IE 9, Opera 11.6) search.lastIndex = origLastIndex; } } return result; }; /** * Fixes browser bugs in the native `String.prototype.split`. Calling `XRegExp.install('natives')` * uses this to override the native method. Use via `XRegExp.split` without overriding natives. * * @memberOf String * @param {RegExp|String} separator Regex or string to use for separating the string. * @param {Number} [limit] Maximum number of items to include in the result array. * @returns {Array} Array of substrings. */ fixed.split = function(separator, limit) { if (!XRegExp.isRegExp(separator)) { // Browsers handle nonregex split correctly, so use the faster native method return nativ.split.apply(this, arguments); } var str = String(this); var output = []; var origLastIndex = separator.lastIndex; var lastLastIndex = 0; var lastLength; // Values for `limit`, per the spec: // If undefined: pow(2,32) - 1 // If 0, Infinity, or NaN: 0 // If positive number: limit = floor(limit); if (limit >= pow(2,32)) limit -= pow(2,32); // If negative number: pow(2,32) - floor(abs(limit)) // If other: Type-convert, then use the above rules // This line fails in very strange ways for some values of `limit` in Opera 10.5-10.63, unless // Opera Dragonfly is open (go figure). It works in at least Opera 9.5-10.1 and 11+ limit = (limit === undefined ? -1 : limit) >>> 0; XRegExp.forEach(str, separator, function(match) { // This condition is not the same as `if (match[0].length)` if ((match.index + match[0].length) > lastLastIndex) { output.push(str.slice(lastLastIndex, match.index)); if (match.length > 1 && match.index < str.length) { Array.prototype.push.apply(output, match.slice(1)); } lastLength = match[0].length; lastLastIndex = match.index + lastLength; } }); if (lastLastIndex === str.length) { if (!nativ.test.call(separator, '') || lastLength) { output.push(''); } } else { output.push(str.slice(lastLastIndex)); } separator.lastIndex = origLastIndex; return output.length > limit ? output.slice(0, limit) : output; }; // ==--------------------------== // Built-in syntax/flag tokens // ==--------------------------== /* * Letter escapes that natively match literal characters: `\a`, `\A`, etc. These should be * SyntaxErrors but are allowed in web reality. XRegExp makes them errors for cross-browser * consistency and to reserve their syntax, but lets them be superseded by addons. */ XRegExp.addToken( /\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/, function(match, scope) { // \B is allowed in default scope only if (match[1] === 'B' && scope === defaultScope) { return match[0]; } throw new SyntaxError('Invalid escape ' + match[0]); }, { scope: 'all', leadChar: '\\' } ); /* * Unicode code point escape with curly braces: `\u{N..}`. `N..` is any one or more digit * hexadecimal number from 0-10FFFF, and can include leading zeros. Requires the native ES6 `u` flag * to support code points greater than U+FFFF. Avoids converting code points above U+FFFF to * surrogate pairs (which could be done without flag `u`), since that could lead to broken behavior * if you follow a `\u{N..}` token that references a code point above U+FFFF with a quantifier, or * if you use the same in a character class. */ XRegExp.addToken( /\\u{([\dA-Fa-f]+)}/, function(match, scope, flags) { var code = dec(match[1]); if (code > 0x10FFFF) { throw new SyntaxError('Invalid Unicode code point ' + match[0]); } if (code <= 0xFFFF) { // Converting to \uNNNN avoids needing to escape the literal character and keep it // separate from preceding tokens return '\\u' + pad4(hex(code)); } // If `code` is between 0xFFFF and 0x10FFFF, require and defer to native handling if (hasNativeU && flags.indexOf('u') > -1) { return match[0]; } throw new SyntaxError('Cannot use Unicode code point above \\u{FFFF} without flag u'); }, { scope: 'all', leadChar: '\\' } ); /* * Empty character class: `[]` or `[^]`. This fixes a critical cross-browser syntax inconsistency. * Unless this is standardized (per the ES spec), regex syntax can't be accurately parsed because * character class endings can't be determined. */ XRegExp.addToken( /\[(\^?)\]/, function(match) { // For cross-browser compatibility with ES3, convert [] to \b\B and [^] to [\s\S]. // (?!) should work like \b\B, but is unreliable in some versions of Firefox return match[1] ? '[\\s\\S]' : '\\b\\B'; }, {leadChar: '['} ); /* * Comment pattern: `(?# )`. Inline comments are an alternative to the line comments allowed in * free-spacing mode (flag x). */ XRegExp.addToken( /\(\?#[^)]*\)/, getContextualTokenSeparator, {leadChar: '('} ); /* * Whitespace and line comments, in free-spacing mode (aka extended mode, flag x) only. */ XRegExp.addToken( /\s+|#[^\n]*\n?/, getContextualTokenSeparator, {flag: 'x'} ); /* * Dot, in dotall mode (aka singleline mode, flag s) only. */ XRegExp.addToken( /\./, function() { return '[\\s\\S]'; }, { flag: 's', leadChar: '.' } ); /* * Named backreference: `\k`. Backreference names can use the characters A-Z, a-z, 0-9, _, * and $ only. Also allows numbered backreferences as `\k`. */ XRegExp.addToken( /\\k<([\w$]+)>/, function(match) { // Groups with the same name is an error, else would need `lastIndexOf` var index = isNaN(match[1]) ? (indexOf(this.captureNames, match[1]) + 1) : +match[1]; var endIndex = match.index + match[0].length; if (!index || index > this.captureNames.length) { throw new SyntaxError('Backreference to undefined group ' + match[0]); } // Keep backreferences separate from subsequent literal numbers. This avoids e.g. // inadvertedly changing `(?)\k1` to `()\11`. return '\\' + index + ( endIndex === match.input.length || isNaN(match.input.charAt(endIndex)) ? '' : '(?:)' ); }, {leadChar: '\\'} ); /* * Numbered backreference or octal, plus any following digits: `\0`, `\11`, etc. Octals except `\0` * not followed by 0-9 and backreferences to unopened capture groups throw an error. Other matches * are returned unaltered. IE < 9 doesn't support backreferences above `\99` in regex syntax. */ XRegExp.addToken( /\\(\d+)/, function(match, scope) { if ( !( scope === defaultScope && /^[1-9]/.test(match[1]) && +match[1] <= this.captureNames.length ) && match[1] !== '0' ) { throw new SyntaxError('Cannot use octal escape or backreference to undefined group ' + match[0]); } return match[0]; }, { scope: 'all', leadChar: '\\' } ); /* * Named capturing group; match the opening delimiter only: `(?`. Capture names can use the * characters A-Z, a-z, 0-9, _, and $ only. Names can't be integers. Supports Python-style * `(?P` as an alternate syntax to avoid issues in some older versions of Opera which natively * supported the Python-style syntax. Otherwise, XRegExp might treat numbered backreferences to * Python-style named capture as octals. */ XRegExp.addToken( /\(\?P?<([\w$]+)>/, function(match) { // Disallow bare integers as names because named backreferences are added to match arrays // and therefore numeric properties may lead to incorrect lookups if (!isNaN(match[1])) { throw new SyntaxError('Cannot use integer as capture name ' + match[0]); } if (match[1] === 'length' || match[1] === '__proto__') { throw new SyntaxError('Cannot use reserved word as capture name ' + match[0]); } if (indexOf(this.captureNames, match[1]) > -1) { throw new SyntaxError('Cannot use same name for multiple groups ' + match[0]); } this.captureNames.push(match[1]); this.hasNamedCapture = true; return '('; }, {leadChar: '('} ); /* * Capturing group; match the opening parenthesis only. Required for support of named capturing * groups. Also adds explicit capture mode (flag n). */ XRegExp.addToken( /\((?!\?)/, function(match, scope, flags) { if (flags.indexOf('n') > -1) { return '(?:'; } this.captureNames.push(null); return '('; }, { optionalFlags: 'n', leadChar: '(' } ); module.exports = XRegExp; },{}]},{},[8])(8) });]]>
    templates common/ips.loader.js common/ui common/utils common controllers underscore jquery mustache Debug.js app.js jquery.js jquery-migrate.js jquery.history.js jquery.transform.js linkify.min.js linkify-jquery.min.js