# HG changeset patch # User Julien Cristau # Date 1458809005 -3600 # Node ID a4fcee1e9789c280ac011a9cfe2e2018a3fedbc9 # Parent e5207f392e7c6c0d0ac266660da2d6a5bb6d3d88# Parent d4d36b583f408b3adf7cfc3a89c036ff5a9aafcd merge 3.20.14 in 3.21 branch diff -r d4d36b583f40 -r a4fcee1e9789 .hgignore --- a/.hgignore Mon Mar 21 18:08:47 2016 +0100 +++ b/.hgignore Thu Mar 24 09:43:25 2016 +0100 @@ -1,6 +1,8 @@ \.svn ^build$ ^dist$ +\.egg-info$ +^.tox$ \.pyc$ \.pyo$ \.bak$ @@ -11,11 +13,16 @@ ^doc/book/en/apidoc$ \.old$ syntax: regexp -.*/data/database/.*\.sqlite -.*/data/database/.*\.config +.*/data.*/database/.*\.sqlite +.*/data.*/database/.*\.config .*/data/database/tmpdb.* .*/data/ldapdb/.* +.*/data/uicache/ +.*/data/cubes/.*/i18n/.*\.po ^doc/html/ ^doc/doctrees/ ^doc/book/en/devweb/js_api/ +^doc/_build +^doc/js_api/ data/pgdb/ +data.*/pgdb.* diff -r d4d36b583f40 -r a4fcee1e9789 .hgtags --- a/.hgtags Mon Mar 21 18:08:47 2016 +0100 +++ b/.hgtags Thu Mar 24 09:43:25 2016 +0100 @@ -520,3 +520,25 @@ f66a4895759e0913b1203943fc2cd7be1a821e05 3.20.14 f66a4895759e0913b1203943fc2cd7be1a821e05 debian/3.20.14-1 f66a4895759e0913b1203943fc2cd7be1a821e05 centos/3.20.14-1 +887c6eef807781560adcd4ecd2dea9011f5a6681 3.21.0 +887c6eef807781560adcd4ecd2dea9011f5a6681 debian/3.21.0-1 +887c6eef807781560adcd4ecd2dea9011f5a6681 centos/3.21.0-1 +a8a0de0298a58306d63dbc998ad60c48bf18c80a 3.21.1 +a8a0de0298a58306d63dbc998ad60c48bf18c80a debian/3.21.1-1 +a8a0de0298a58306d63dbc998ad60c48bf18c80a centos/3.21.1-1 +a5428e1ab36491a8e6d66ce09d23b708b97e1337 3.21.2 +a5428e1ab36491a8e6d66ce09d23b708b97e1337 debian/3.21.2-1 +a5428e1ab36491a8e6d66ce09d23b708b97e1337 centos/3.21.2-1 +9edfe9429209848e31d1998df48da7a84db0c819 3.21.3 +9edfe9429209848e31d1998df48da7a84db0c819 debian/3.21.3-1 +9edfe9429209848e31d1998df48da7a84db0c819 centos/3.21.3-1 +d3b92d3a7db098b25168beef9b3ee7b36263a652 3.21.4 +d3b92d3a7db098b25168beef9b3ee7b36263a652 debian/3.21.4-1 +d3b92d3a7db098b25168beef9b3ee7b36263a652 centos/3.21.4-1 +e0572a786e6b4b0965d405dd95cf5bce754005a2 3.21.5 +e0572a786e6b4b0965d405dd95cf5bce754005a2 debian/3.21.5-1 +e0572a786e6b4b0965d405dd95cf5bce754005a2 centos/3.21.5-1 +228b6d2777e44d7bc158d0b4579d09960acea926 debian/3.21.5-2 +b3cbbb7690b6e193570ffe4846615d372868a923 3.21.6 +b3cbbb7690b6e193570ffe4846615d372868a923 debian/3.21.6-1 +b3cbbb7690b6e193570ffe4846615d372868a923 centos/3.21.6-1 diff -r d4d36b583f40 -r a4fcee1e9789 MANIFEST.in --- a/MANIFEST.in Mon Mar 21 18:08:47 2016 +0100 +++ b/MANIFEST.in Thu Mar 24 09:43:25 2016 +0100 @@ -6,9 +6,18 @@ include man/cubicweb-ctl.1 include doc/*.rst +include doc/Makefile recursive-include doc/book * recursive-include doc/tools *.py recursive-include doc/tutorials *.rst *.py +include doc/api/*.rst +recursive-include doc/_themes * +recursive-include doc/_static * +include doc/_templates/*.html +include doc/changes/*.rst +recursive-include doc/dev .txt *.rst +recursive-include doc/images *.png *.svg +include doc/conf.py recursive-include misc *.py *.png *.display @@ -25,18 +34,18 @@ recursive-include sobjects/test/data bootstrap_cubes *.py recursive-include hooks/test/data bootstrap_cubes *.py recursive-include server/test/data bootstrap_cubes *.py source* *.conf.in *.ldif -recursive-include devtools/test/data bootstrap_cubes *.py *.txt *.js +recursive-include devtools/test/data bootstrap_cubes *.py *.txt *.js *.po.ref recursive-include web/test/data bootstrap_cubes pouet.css *.py +recursive-include etwist/test/data *.py recursive-include web/test/jstests *.js *.html *.css *.json recursive-include web/test/windmill *.py -recursive-include skeleton *.py *.css *.js *.po compat *.in *.tmpl +recursive-include skeleton *.py *.css *.js *.po compat *.in *.tmpl rules prune doc/book/en/.static prune doc/book/fr/.static prune doc/html/_sources/ prune misc/cwfs -prune goa -prune doc/book/en/devweb/js_api +prune doc/js_api global-exclude *.pyc diff -r d4d36b583f40 -r a4fcee1e9789 README --- a/README Mon Mar 21 18:08:47 2016 +0100 +++ b/README Thu Mar 24 09:43:25 2016 +0100 @@ -14,7 +14,7 @@ Install ------- -More details at http://docs.cubicweb.org/admin/setup +More details at http://docs.cubicweb.org/book/admin/setup Getting started --------------- diff -r d4d36b583f40 -r a4fcee1e9789 __pkginfo__.py --- a/__pkginfo__.py Mon Mar 21 18:08:47 2016 +0100 +++ b/__pkginfo__.py Thu Mar 24 09:43:25 2016 +0100 @@ -22,7 +22,7 @@ modname = distname = "cubicweb" -numversion = (3, 20, 14) +numversion = (3, 21, 6) version = '.'.join(str(num) for num in numversion) description = "a repository of entities / relations for knowledge management" @@ -42,7 +42,7 @@ 'logilab-common': '>= 0.63.1', 'logilab-mtconverter': '>= 0.8.0', 'rql': '>= 0.31.2, < 0.34', - 'yams': '>= 0.40.0, < 0.42', + 'yams': '>= 0.40.0', #gettext # for xgettext, msgcat, etc... # web dependencies 'lxml': '', @@ -55,7 +55,6 @@ __recommends__ = { 'docutils': '>= 0.6', - 'Pyro': '>= 3.9.1, < 4.0.0', 'Pillow': '', # for captcha 'pycrypto': '', # for crypto extensions 'fyzz': '>= 0.1.0', # for sparql @@ -115,8 +114,6 @@ [join('share', 'cubicweb', 'cubes', 'shared', 'data'), [join(_data_dir, fname) for fname in listdir(_data_dir) if not isdir(join(_data_dir, fname))]], - [join('share', 'cubicweb', 'cubes', 'shared', 'data', 'timeline'), - [join(_data_dir, 'timeline', fname) for fname in listdir(join(_data_dir, 'timeline'))]], [join('share', 'cubicweb', 'cubes', 'shared', 'data', 'images'), [join(_data_dir, 'images', fname) for fname in listdir(join(_data_dir, 'images'))]], [join('share', 'cubicweb', 'cubes', 'shared', 'data', 'jquery-treeview'), diff -r d4d36b583f40 -r a4fcee1e9789 _exceptions.py --- a/_exceptions.py Mon Mar 21 18:08:47 2016 +0100 +++ b/_exceptions.py Thu Mar 24 09:43:25 2016 +0100 @@ -82,6 +82,8 @@ self.session = session assert 'rtypes' in kwargs or 'cstrname' in kwargs self.kwargs = kwargs + # fill cache while the session is open + self.rtypes @cachedproperty def rtypes(self): @@ -100,6 +102,12 @@ return None, self.rtypes +class ViolatedConstraint(RepositoryError): + def __init__(self, cnx, cstrname): + self.cnx = cnx + self.cstrname = cstrname + + # security exceptions ######################################################### class Unauthorized(SecurityError): diff -r d4d36b583f40 -r a4fcee1e9789 _gcdebug.py --- a/_gcdebug.py Mon Mar 21 18:08:47 2016 +0100 +++ b/_gcdebug.py Thu Mar 24 09:43:25 2016 +0100 @@ -19,6 +19,10 @@ import gc, types, weakref from cubicweb.schema import CubicWebRelationSchema, CubicWebEntitySchema +try: + from cubicweb.web.request import _NeedAuthAccessMock +except ImportError: + _NeedAuthAccessMock = None listiterator = type(iter([])) @@ -30,6 +34,8 @@ types.ModuleType, types.FunctionType, types.MethodType, types.MemberDescriptorType, types.GetSetDescriptorType, ) +if _NeedAuthAccessMock is not None: + IGNORE_CLASSES = IGNORE_CLASSES + (_NeedAuthAccessMock,) def _get_counted_class(obj, classes): for cls in classes: @@ -63,7 +69,8 @@ ocounters[key] = 1 if isinstance(obj, viewreferrersclasses): print ' ', obj, referrers(obj, showobjs, maxlevel) - return counters, ocounters, gc.garbage + garbage = [repr(obj) for obj in gc.garbage] + return counters, ocounters, garbage def referrers(obj, showobj=False, maxlevel=1): diff -r d4d36b583f40 -r a4fcee1e9789 appobject.py --- a/appobject.py Mon Mar 21 18:08:47 2016 +0100 +++ b/appobject.py Thu Mar 24 09:43:25 2016 +0100 @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License along # with CubicWeb. If not, see . """ -.. _appobject: The `AppObject` class --------------------- @@ -27,7 +26,6 @@ We can find a certain number of attributes and methods defined in this class and common to all the application objects. -.. autoclass:: AppObject """ __docformat__ = "restructuredtext en" diff -r d4d36b583f40 -r a4fcee1e9789 bin/clone_deps.py --- a/bin/clone_deps.py Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,117 +0,0 @@ -#!/usr/bin/python -import sys - -from subprocess import call as sbp_call, Popen, PIPE -from urllib import urlopen -import os -from os import path as osp, pardir, chdir - - -def find_mercurial(): - print "trying to find mercurial from the command line ..." - print '-' * 20 - tryhg = sbp_call(['hg', '--version']) - if tryhg: - print 'mercurial seems to be unavailable, please install it' - raise - print '-' * 20 - def hg_call(args): - return sbp_call(['hg'] + args) - - return hg_call - - -BASE_URL = 'http://www.logilab.org/hg/' - -to_clone = ['fyzz', 'yams', 'rql', - 'logilab/common', 'logilab/constraint', 'logilab/database', - 'logilab/devtools', 'logilab/mtconverter', - 'cubes/blog', 'cubes/calendar', 'cubes/card', 'cubes/comment', - 'cubes/datafeed', 'cubes/email', 'cubes/file', 'cubes/folder', - 'cubes/forgotpwd', 'cubes/keyword', 'cubes/link', 'cubes/localperms', - 'cubes/mailinglist', 'cubes/nosylist', 'cubes/person', - 'cubes/preview', 'cubes/registration', 'cubes/rememberme', - 'cubes/tag', 'cubes/vcsfile', 'cubes/zone'] - -# a couple of functions to be used to explore available -# repositories and cubes -def list_repos(repos_root): - assert repos_root.startswith('http://') - hgwebdir_repos = (repo.strip() - for repo in urlopen(repos_root + '?style=raw').readlines() - if repo.strip()) - prefix = osp.commonprefix(hgwebdir_repos) - return (repo[len(prefix):].strip('/') - for repo in hgwebdir_repos) - -def list_all_cubes(base_url=BASE_URL): - all_repos = list_repos(base_url) - #search for cubes - for repo in all_repos: - if repo.startswith('cubes'): - to_clone.append(repo) - -def get_latest_debian_tag(path): - proc = Popen(['hg', '-R', path, 'tags'], stdout=PIPE) - out, _err = proc.communicate() - for line in out.splitlines(): - if 'debian-version' in line: - return line.split()[0] - -def main(): - if len(sys.argv) == 1: - base_url = BASE_URL - elif len(sys.argv) == 2: - base_url = sys.argv[1] - else: - sys.stderr.write('usage %s [base_url]\n' % sys.argv[0]) - sys.exit(1) - hg_call = find_mercurial() - print len(to_clone), 'repositories will be cloned' - base_dir = osp.normpath(osp.join(osp.dirname(__file__), pardir, pardir)) - chdir(base_dir) - not_updated = [] - for repo in to_clone: - url = base_url + repo - if '/' not in repo: - target_path = repo - else: - assert repo.count('/') == 1, repo - directory, repo = repo.split('/') - if not osp.isdir(directory): - os.mkdir(directory) - open(osp.join(directory, '__init__.py'), 'w').close() - target_path = osp.join(directory, repo) - if osp.exists(target_path): - print target_path, 'seems already cloned. Skipping it.' - else: - hg_call(['clone', '-U', url, target_path]) - tag = get_latest_debian_tag(target_path) - if tag: - print 'updating to', tag - hg_call(['update', '-R', target_path, tag]) - else: - not_updated.append(target_path) - print """ -CubicWeb dependencies and standard set of cubes have been fetched and -update to the latest stable version. - -You should ensure your PYTHONPATH contains `%(basedir)s`. -You might want to read the environment configuration section of the documentation -at http://docs.cubicweb.org/admin/setup.html#environment-configuration - -You can find more cubes at http://www.cubicweb.org. -Clone them from `%(baseurl)scubes/` into the `%(basedir)s%(sep)scubes%(sep)s` directory. - -To get started you may read http://docs.cubicweb.org/tutorials/base/index.html. -""" % {'basedir': os.getcwd(), 'baseurl': base_url, 'sep': os.sep} - if not_updated: - sys.stderr.write('WARNING: The following repositories were not updated (no debian tag found):\n') - for path in not_updated: - sys.stderr.write('\t-%s\n' % path) - -if __name__ == '__main__': - main() - - - diff -r d4d36b583f40 -r a4fcee1e9789 cubicweb.spec --- a/cubicweb.spec Mon Mar 21 18:08:47 2016 +0100 +++ b/cubicweb.spec Thu Mar 24 09:43:25 2016 +0100 @@ -7,7 +7,7 @@ %endif Name: cubicweb -Version: 3.20.14 +Version: 3.21.6 Release: logilab.1%{?dist} Summary: CubicWeb is a semantic web application framework Source0: http://download.logilab.org/pub/cubicweb/cubicweb-%{version}.tar.gz diff -r d4d36b583f40 -r a4fcee1e9789 cwconfig.py --- a/cwconfig.py Mon Mar 21 18:08:47 2016 +0100 +++ b/cwconfig.py Thu Mar 24 09:43:25 2016 +0100 @@ -279,7 +279,7 @@ ('default-text-format', {'type' : 'choice', 'choices': ('text/plain', 'text/rest', 'text/html', 'text/markdown'), - 'default': 'text/html', # use fckeditor in the web ui + 'default': 'text/plain', 'help': _('default text format for rich text fields.'), 'group': 'ui', }), @@ -835,7 +835,7 @@ # set by upgrade command verbosity = 0 - + cmdline_options = None options = CubicWebNoAppConfiguration.options + ( ('log-file', {'type' : 'string', @@ -843,6 +843,13 @@ 'help': 'file where output logs should be written', 'group': 'main', 'level': 2, }), + ('statsd-endpoint', + {'type' : 'string', + 'default': '', + 'help': 'UDP address of the statsd endpoint; it must be formatted' + 'like :; disabled is unset.', + 'group': 'main', 'level': 2, + }), # email configuration ('smtp-host', {'type' : 'string', @@ -870,6 +877,18 @@ the repository', 'group': 'email', 'level': 1, }), + ('logstat-interval', + {'type' : 'int', + 'default': 0, + 'help': 'interval (in seconds) at which stats are dumped in the logstat file; set 0 to disable', + 'group': 'main', 'level': 2, + }), + ('logstat-file', + {'type' : 'string', + 'default': Method('default_stats_file'), + 'help': 'file where stats for the instance should be written', + 'group': 'main', 'level': 2, + }), ) @classmethod @@ -953,6 +972,13 @@ log_path = os.path.join(_INSTALL_PREFIX, 'var', 'log', 'cubicweb', '%s-%s.log') return log_path % (self.appid, self.name) + def default_stats_file(self): + """return default path to the stats file of the instance'server""" + logfile = self.default_log_file() + if logfile.endswith('.log'): + logfile = logfile[:-4] + return logfile + '.stats' + def default_pid_file(self): """return default path to the pid file of the instance'server""" if self.mode == 'system': @@ -1010,7 +1036,7 @@ # or site_cubicweb files self.load_file_configuration(self.main_config_file()) # configuration initialization hook - self.load_configuration() + self.load_configuration(**(self.cmdline_options or {})) def add_cubes(self, cubes): """add given cubes to the list of used cubes""" @@ -1077,9 +1103,9 @@ infos.append('cubicweb-%s' % str(self.cubicweb_version())) return md5(';'.join(infos)).hexdigest() - def load_configuration(self): + def load_configuration(self, **kw): """load instance's configuration files""" - super(CubicWebConfiguration, self).load_configuration() + super(CubicWebConfiguration, self).load_configuration(**kw) if self.apphome and not self.creating: # init gettext self._gettext_init() @@ -1102,6 +1128,17 @@ logconfig = join(self.apphome, 'logging.conf') if exists(logconfig): logging.config.fileConfig(logconfig) + # set the statsd address, if any + if self.get('statsd-endpoint'): + try: + address, port = self.get('statsd-endpoint').split(':') + port = int(port) + except: + self.error('statsd-endpoint: invalid address format ({}); ' + 'it should be "ip:port"'.format(self.get('statsd-endpoint'))) + else: + import statsd_logger + statsd_logger.setup('cubicweb.%s' % self.appid, (address, port)) def available_languages(self, *args): """return available translation for an instance, by looking for diff -r d4d36b583f40 -r a4fcee1e9789 cwctl.py --- a/cwctl.py Mon Mar 21 18:08:47 2016 +0100 +++ b/cwctl.py Thu Mar 24 09:43:25 2016 +0100 @@ -1,4 +1,4 @@ -# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb. @@ -25,7 +25,7 @@ # possible (for cubicweb-ctl reactivity, necessary for instance for usable bash # completion). So import locally in command helpers. import sys -from warnings import warn +from warnings import warn, filterwarnings from os import remove, listdir, system, pathsep from os.path import exists, join, isfile, isdir, dirname, abspath from urlparse import urlparse @@ -401,7 +401,7 @@ if 'type' in odict and odict.get('level') <= self.config.config_level) for section in sections: - if section not in ('main', 'email', 'pyro', 'web'): + if section not in ('main', 'email', 'web'): print '\n' + underline_title('%s options' % section) config.input_config(section, self.config.config_level) # write down configuration @@ -520,7 +520,12 @@ 'default': None, 'choices': ('debug', 'info', 'warning', 'error'), 'help': 'debug if -D is set, error otherwise', }), - ) + ('param', + {'short': 'p', 'type' : 'named', 'metavar' : 'key1:value1,key2:value2', + 'default': {}, + 'help': 'override configuration file option with .', + }), + ) def start_instance(self, appid): """start the instance's server""" @@ -534,6 +539,8 @@ "- '{ctl} pyramid {appid}' (requires the pyramid cube)\n") raise ExecutionError(msg.format(ctl='cubicweb-ctl', appid=appid)) config = cwcfg.config_for(appid, debugmode=self['debug']) + # override config file values with cmdline options + config.cmdline_options = self.config.param init_cmdline_log_threshold(config, self['loglevel']) if self['profile']: config.global_set_option('profile', self.config.profile) @@ -900,9 +907,7 @@ ('repo-uri', {'short': 'H', 'type' : 'string', 'metavar': '://<[host][:port]>', 'help': 'URI of the CubicWeb repository to connect to. URI can be \ -pyro://[host:port] the Pyro name server host; if the pyro nameserver is not set, \ -it will be detected by using a broadcast query, a ZMQ URL or \ -inmemory:// (default) use an in-memory repository. THIS OPTION IS DEPRECATED, \ +a ZMQ URL or inmemory:// (default) use an in-memory repository. THIS OPTION IS DEPRECATED, \ directly give URI as instance id instead', 'group': 'remote' }), @@ -953,7 +958,7 @@ if self.config.repo_uri: warn('[3.16] --repo-uri option is deprecated, directly give the URI as instance id', DeprecationWarning) - if urlparse(self.config.repo_uri).scheme in ('pyro', 'inmemory'): + if urlparse(self.config.repo_uri).scheme == 'inmemory': appuri = '%s/%s' % (self.config.repo_uri.rstrip('/'), appuri) from cubicweb.utils import parse_repo_uri @@ -1135,6 +1140,7 @@ import os sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0) sys.stderr = os.fdopen(sys.stderr.fileno(), 'w', 0) + filterwarnings('default', category=DeprecationWarning) cwcfg.load_cwctl_plugins() try: CWCTL.run(args) diff -r d4d36b583f40 -r a4fcee1e9789 cwvreg.py --- a/cwvreg.py Mon Mar 21 18:08:47 2016 +0100 +++ b/cwvreg.py Thu Mar 24 09:43:25 2016 +0100 @@ -15,179 +15,8 @@ # # You should have received a copy of the GNU Lesser General Public License along # with CubicWeb. If not, see . -""".. RegistryStore: - -The `RegistryStore` -------------------- - -The `RegistryStore` can be seen as a two-level dictionary. It contains -all dynamically loaded objects (subclasses of :ref:`appobject`) to -build a |cubicweb| application. Basically: - -* the first level key returns a *registry*. This key corresponds to the - `__registry__` attribute of application object classes - -* the second level key returns a list of application objects which - share the same identifier. This key corresponds to the `__regid__` - attribute of application object classes. - -A *registry* holds a specific kind of application objects. There is -for instance a registry for entity classes, another for views, etc... - -The `RegistryStore` has two main responsibilities: - -- being the access point to all registries - -- handling the registration process at startup time, and during automatic - reloading in debug mode. - -.. _AppObjectRecording: - -Details of the recording process -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. index:: - vregistry: registration_callback - -On startup, |cubicweb| loads application objects defined in its library -and in cubes used by the instance. Application objects from the -library are loaded first, then those provided by cubes are loaded in -dependency order (e.g. if your cube depends on an other, objects from -the dependency will be loaded first). The layout of the modules or packages -in a cube is explained in :ref:`cubelayout`. - -For each module: - -* by default all objects are registered automatically - -* if some objects have to replace other objects, or have to be - included only if some condition is met, you'll have to define a - `registration_callback(vreg)` function in your module and explicitly - register **all objects** in this module, using the api defined - below. - -.. Note:: - Once the function `registration_callback(vreg)` is implemented in a module, - all the objects from this module have to be explicitly registered as it - disables the automatic objects registration. - - -API for objects registration -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Here are the registration methods that you can use in the `registration_callback` -to register your objects to the `RegistryStore` instance given as argument (usually -named `vreg`): - -.. automethod:: cubicweb.cwvreg.CWRegistryStore.register_all -.. automethod:: cubicweb.cwvreg.CWRegistryStore.register_and_replace -.. automethod:: cubicweb.cwvreg.CWRegistryStore.register -.. automethod:: cubicweb.cwvreg.CWRegistryStore.unregister - -Examples: - -.. sourcecode:: python - - # web/views/basecomponents.py - def registration_callback(vreg): - # register everything in the module except SeeAlsoComponent - vreg.register_all(globals().itervalues(), __name__, (SeeAlsoVComponent,)) - # conditionally register SeeAlsoVComponent - if 'see_also' in vreg.schema: - vreg.register(SeeAlsoVComponent) - -In this example, we register all application object classes defined in the module -except `SeeAlsoVComponent`. This class is then registered only if the 'see_also' -relation type is defined in the instance'schema. - -.. sourcecode:: python - - # goa/appobjects/sessions.py - def registration_callback(vreg): - vreg.register(SessionsCleaner) - # replace AuthenticationManager by GAEAuthenticationManager - vreg.register_and_replace(GAEAuthenticationManager, AuthenticationManager) - # replace PersistentSessionManager by GAEPersistentSessionManager - vreg.register_and_replace(GAEPersistentSessionManager, PersistentSessionManager) - -In this example, we explicitly register classes one by one: - -* the `SessionCleaner` class -* the `GAEAuthenticationManager` to replace the `AuthenticationManager` -* the `GAEPersistentSessionManager` to replace the `PersistentSessionManager` - -If at some point we register a new appobject class in this module, it won't be -registered at all without modification to the `registration_callback` -implementation. The previous example will register it though, thanks to the call -to the `register_all` method. - - -.. _Selection: - -Runtime objects selection -~~~~~~~~~~~~~~~~~~~~~~~~~ - -Now that we have all application objects loaded, the question is : when -I want some specific object, for instance the primary view for a given -entity, how do I get the proper object ? This is what we call the -**selection mechanism**. - -As explained in the :ref:`Concepts` section: - -* each application object has a **selector**, defined by its - `__select__` class attribute - -* this selector is responsible to return a **score** for a given context - - - 0 score means the object doesn't apply to this context - - - else, the higher the score, the better the object suits the context - -* the object with the highest score is selected. - -.. Note:: - - When no single object has the highest score, an exception is raised in development - mode to let you know that the engine was not able to identify the view to - apply. This error is silenced in production mode and one of the objects with - the highest score is picked. - - In such cases you would need to review your design and make sure - your selectors or appobjects are properly defined. Such an error is - typically caused by either forgetting to change the __regid__ in a - derived class, or by having copy-pasted some code. - -For instance, if you are selecting the primary (`__regid__ = -'primary'`) view (`__registry__ = 'views'`) for a result set -containing a `Card` entity, two objects will probably be selectable: - -* the default primary view (`__select__ = is_instance('Any')`), meaning - that the object is selectable for any kind of entity type - -* the specific `Card` primary view (`__select__ = is_instance('Card')`, - meaning that the object is selectable for Card entities - -Other primary views specific to other entity types won't be selectable in this -case. Among selectable objects, the `is_instance('Card')` selector will return a higher -score since it's more specific, so the correct view will be selected as expected. - -.. _SelectionAPI: - -API for objects selections -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Here is the selection API you'll get on every registry. Some of them, as the -'etypes' registry, containing entity classes, extend it. In those methods, -`*args, **kwargs` is what we call the **context**. Those arguments are given to -selectors that will inspect their content and return a score accordingly. - -.. automethod:: cubicweb.vregistry.Registry.select - -.. automethod:: cubicweb.vregistry.Registry.select_or_none - -.. automethod:: cubicweb.vregistry.Registry.possible_objects - -.. automethod:: cubicweb.vregistry.Registry.object_by_id +""" +Cubicweb registries """ __docformat__ = "restructuredtext en" @@ -229,6 +58,7 @@ sys.modules.pop('cubicweb.web.uicfg', None) sys.modules.pop('cubicweb.web.uihelper', None) + def require_appobject(obj): """return appobjects required by the given object by searching for `appobject_selectable` predicate @@ -241,11 +71,16 @@ class CWRegistry(Registry): def __init__(self, vreg): + """ + :param vreg: the :py:class:`CWRegistryStore` managing this registry. + """ super(CWRegistry, self).__init__(True) self.vreg = vreg @property def schema(self): + """The :py:class:`cubicweb.schema.CubicWebSchema` + """ return self.vreg.schema def poss_visible_objects(self, *args, **kwargs): @@ -269,7 +104,7 @@ def selected(self, winner, args, kwargs): """overriden to avoid the default 'instanciation' behaviour, ie - winner(*args, **kwargs) + `winner(*args, **kwargs)` """ return winner diff -r d4d36b583f40 -r a4fcee1e9789 dataimport.py --- a/dataimport.py Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1174 +0,0 @@ -# -*- coding: utf-8 -*- -# copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved. -# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr -# -# This file is part of CubicWeb. -# -# CubicWeb is free software: you can redistribute it and/or modify it under the -# terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 2.1 of the License, or (at your option) -# any later version. -# -# CubicWeb is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License along -# with CubicWeb. If not, see . -"""This module provides tools to import tabular data. - - -Example of use (run this with `cubicweb-ctl shell instance import-script.py`): - -.. sourcecode:: python - - from cubicweb.dataimport import * - # define data generators - GENERATORS = [] - - USERS = [('Prenom', 'firstname', ()), - ('Nom', 'surname', ()), - ('Identifiant', 'login', ()), - ] - - def gen_users(ctl): - for row in ctl.iter_and_commit('utilisateurs'): - entity = mk_entity(row, USERS) - entity['upassword'] = 'motdepasse' - ctl.check('login', entity['login'], None) - entity = ctl.store.create_entity('CWUser', **entity) - email = ctl.store.create_entity('EmailAddress', address=row['email']) - ctl.store.relate(entity.eid, 'use_email', email.eid) - ctl.store.rql('SET U in_group G WHERE G name "users", U eid %(x)s', {'x':entity['eid']}) - - CHK = [('login', check_doubles, 'Utilisateurs Login', - 'Deux utilisateurs ne devraient pas avoir le même login.'), - ] - - GENERATORS.append( (gen_users, CHK) ) - - # create controller - ctl = CWImportController(RQLObjectStore(cnx)) - ctl.askerror = 1 - ctl.generators = GENERATORS - ctl.data['utilisateurs'] = lazytable(ucsvreader(open('users.csv'))) - # run - ctl.run() - -.. BUG file with one column are not parsable -.. TODO rollback() invocation is not possible yet -""" -__docformat__ = "restructuredtext en" - -import csv -import sys -import threading -import traceback -import warnings -import cPickle -import os.path as osp -import inspect -from base64 import b64encode -from collections import defaultdict -from copy import copy -from datetime import date, datetime, time -from time import asctime -from StringIO import StringIO - -from logilab.common import shellutils, attrdict -from logilab.common.date import strptime -from logilab.common.decorators import cached -from logilab.common.deprecation import deprecated - -from cubicweb import QueryError -from cubicweb.utils import make_uid -from cubicweb.schema import META_RTYPES, VIRTUAL_RTYPES -from cubicweb.server.edition import EditedEntity -from cubicweb.server.sqlutils import SQL_PREFIX -from cubicweb.server.utils import eschema_eid - - -def count_lines(stream_or_filename): - if isinstance(stream_or_filename, basestring): - f = open(stream_or_filename) - else: - f = stream_or_filename - f.seek(0) - for i, line in enumerate(f): - pass - f.seek(0) - return i+1 - -def ucsvreader_pb(stream_or_path, encoding='utf-8', delimiter=',', quotechar='"', - skipfirst=False, withpb=True, skip_empty=True, separator=None, - quote=None): - """same as :func:`ucsvreader` but a progress bar is displayed as we iter on rows""" - if separator is not None: - delimiter = separator - warnings.warn("[3.20] 'separator' kwarg is deprecated, use 'delimiter' instead") - if quote is not None: - quotechar = quote - warnings.warn("[3.20] 'quote' kwarg is deprecated, use 'quotechar' instead") - if isinstance(stream_or_path, basestring): - if not osp.exists(stream_or_path): - raise Exception("file doesn't exists: %s" % stream_or_path) - stream = open(stream_or_path) - else: - stream = stream_or_path - rowcount = count_lines(stream) - if skipfirst: - rowcount -= 1 - if withpb: - pb = shellutils.ProgressBar(rowcount, 50) - for urow in ucsvreader(stream, encoding, delimiter, quotechar, - skipfirst=skipfirst, skip_empty=skip_empty): - yield urow - if withpb: - pb.update() - print ' %s rows imported' % rowcount - -def ucsvreader(stream, encoding='utf-8', delimiter=',', quotechar='"', - skipfirst=False, ignore_errors=False, skip_empty=True, - separator=None, quote=None): - """A csv reader that accepts files with any encoding and outputs unicode - strings - - if skip_empty (the default), lines without any values specified (only - separators) will be skipped. This is useful for Excel exports which may be - full of such lines. - """ - if separator is not None: - delimiter = separator - warnings.warn("[3.20] 'separator' kwarg is deprecated, use 'delimiter' instead") - if quote is not None: - quotechar = quote - warnings.warn("[3.20] 'quote' kwarg is deprecated, use 'quotechar' instead") - it = iter(csv.reader(stream, delimiter=delimiter, quotechar=quotechar)) - if not ignore_errors: - if skipfirst: - it.next() - for row in it: - decoded = [item.decode(encoding) for item in row] - if not skip_empty or any(decoded): - yield decoded - else: - if skipfirst: - try: - row = it.next() - except csv.Error: - pass - # Safe version, that can cope with error in CSV file - while True: - try: - row = it.next() - # End of CSV, break - except StopIteration: - break - # Error in CSV, ignore line and continue - except csv.Error: - continue - decoded = [item.decode(encoding) for item in row] - if not skip_empty or any(decoded): - yield decoded - - -def callfunc_every(func, number, iterable): - """yield items of `iterable` one by one and call function `func` - every `number` iterations. Always call function `func` at the end. - """ - for idx, item in enumerate(iterable): - yield item - if not idx % number: - func() - func() - -def lazytable(reader): - """The first row is taken to be the header of the table and - used to output a dict for each row of data. - - >>> data = lazytable(ucsvreader(open(filename))) - """ - header = reader.next() - for row in reader: - yield dict(zip(header, row)) - -def lazydbtable(cu, table, headers, orderby=None): - """return an iterator on rows of a sql table. On each row, fetch columns - defined in headers and return values as a dictionary. - - >>> data = lazydbtable(cu, 'experimentation', ('id', 'nickname', 'gps')) - """ - sql = 'SELECT %s FROM %s' % (','.join(headers), table,) - if orderby: - sql += ' ORDER BY %s' % ','.join(orderby) - cu.execute(sql) - while True: - row = cu.fetchone() - if row is None: - break - yield dict(zip(headers, row)) - -def mk_entity(row, map): - """Return a dict made from sanitized mapped values. - - ValueError can be raised on unexpected values found in checkers - - >>> row = {'myname': u'dupont'} - >>> map = [('myname', u'name', (call_transform_method('title'),))] - >>> mk_entity(row, map) - {'name': u'Dupont'} - >>> row = {'myname': u'dupont', 'optname': u''} - >>> map = [('myname', u'name', (call_transform_method('title'),)), - ... ('optname', u'MARKER', (optional,))] - >>> mk_entity(row, map) - {'name': u'Dupont', 'optname': None} - """ - res = {} - assert isinstance(row, dict) - assert isinstance(map, list) - for src, dest, funcs in map: - try: - res[dest] = row[src] - except KeyError: - continue - try: - for func in funcs: - res[dest] = func(res[dest]) - if res[dest] is None: - break - except ValueError as err: - raise ValueError('error with %r field: %s' % (src, err)), None, sys.exc_info()[-1] - return res - -# user interactions ############################################################ - -def tell(msg): - print msg - -def confirm(question): - """A confirm function that asks for yes/no/abort and exits on abort.""" - answer = shellutils.ASK.ask(question, ('Y', 'n', 'abort'), 'Y') - if answer == 'abort': - sys.exit(1) - return answer == 'Y' - - -class catch_error(object): - """Helper for @contextmanager decorator.""" - - def __init__(self, ctl, key='unexpected error', msg=None): - self.ctl = ctl - self.key = key - self.msg = msg - - def __enter__(self): - return self - - def __exit__(self, type, value, traceback): - if type is not None: - if issubclass(type, (KeyboardInterrupt, SystemExit)): - return # re-raise - if self.ctl.catcherrors: - self.ctl.record_error(self.key, None, type, value, traceback) - return True # silent - - -# base sanitizing/coercing functions ########################################### - -def optional(value): - """checker to filter optional field - - If value is undefined (ex: empty string), return None that will - break the checkers validation chain - - General use is to add 'optional' check in first condition to avoid - ValueError by further checkers - - >>> MAPPER = [(u'value', 'value', (optional, int))] - >>> row = {'value': u'XXX'} - >>> mk_entity(row, MAPPER) - {'value': None} - >>> row = {'value': u'100'} - >>> mk_entity(row, MAPPER) - {'value': 100} - """ - if value: - return value - return None - -def required(value): - """raise ValueError if value is empty - - This check should be often found in last position in the chain. - """ - if value: - return value - raise ValueError("required") - -def todatetime(format='%d/%m/%Y'): - """return a transformation function to turn string input value into a - `datetime.datetime` instance, using given format. - - Follow it by `todate` or `totime` functions from `logilab.common.date` if - you want a `date`/`time` instance instead of `datetime`. - """ - def coerce(value): - return strptime(value, format) - return coerce - -def call_transform_method(methodname, *args, **kwargs): - """return value returned by calling the given method on input""" - def coerce(value): - return getattr(value, methodname)(*args, **kwargs) - return coerce - -def call_check_method(methodname, *args, **kwargs): - """check value returned by calling the given method on input is true, - else raise ValueError - """ - def check(value): - if getattr(value, methodname)(*args, **kwargs): - return value - raise ValueError('%s not verified on %r' % (methodname, value)) - return check - -# base integrity checking functions ############################################ - -def check_doubles(buckets): - """Extract the keys that have more than one item in their bucket.""" - return [(k, len(v)) for k, v in buckets.items() if len(v) > 1] - -def check_doubles_not_none(buckets): - """Extract the keys that have more than one item in their bucket.""" - return [(k, len(v)) for k, v in buckets.items() - if k is not None and len(v) > 1] - -# sql generator utility functions ############################################# - - -def _import_statements(sql_connect, statements, nb_threads=3, - dump_output_dir=None, - support_copy_from=True, encoding='utf-8'): - """ - Import a bunch of sql statements, using different threads. - """ - try: - chunksize = (len(statements) / nb_threads) + 1 - threads = [] - for i in xrange(nb_threads): - chunks = statements[i*chunksize:(i+1)*chunksize] - thread = threading.Thread(target=_execmany_thread, - args=(sql_connect, chunks, - dump_output_dir, - support_copy_from, - encoding)) - thread.start() - threads.append(thread) - for t in threads: - t.join() - except Exception: - print 'Error in import statements' - -def _execmany_thread_not_copy_from(cu, statement, data, table=None, - columns=None, encoding='utf-8'): - """ Execute thread without copy from - """ - cu.executemany(statement, data) - -def _execmany_thread_copy_from(cu, statement, data, table, - columns, encoding='utf-8'): - """ Execute thread with copy from - """ - try: - buf = _create_copyfrom_buffer(data, columns, encoding=encoding) - except ValueError: - _execmany_thread_not_copy_from(cu, statement, data) - else: - if columns is None: - cu.copy_from(buf, table, null='NULL') - else: - cu.copy_from(buf, table, null='NULL', columns=columns) - -def _execmany_thread(sql_connect, statements, dump_output_dir=None, - support_copy_from=True, encoding='utf-8'): - """ - Execute sql statement. If 'INSERT INTO', try to use 'COPY FROM' command, - or fallback to execute_many. - """ - if support_copy_from: - execmany_func = _execmany_thread_copy_from - else: - execmany_func = _execmany_thread_not_copy_from - cnx = sql_connect() - cu = cnx.cursor() - try: - for statement, data in statements: - table = None - columns = None - try: - if not statement.startswith('INSERT INTO'): - cu.executemany(statement, data) - continue - table = statement.split()[2] - if isinstance(data[0], (tuple, list)): - columns = None - else: - columns = list(data[0]) - execmany_func(cu, statement, data, table, columns, encoding) - except Exception: - print 'unable to copy data into table %s' % table - # Error in import statement, save data in dump_output_dir - if dump_output_dir is not None: - pdata = {'data': data, 'statement': statement, - 'time': asctime(), 'columns': columns} - filename = make_uid() - try: - with open(osp.join(dump_output_dir, - '%s.pickle' % filename), 'w') as fobj: - fobj.write(cPickle.dumps(pdata)) - except IOError: - print 'ERROR while pickling in', dump_output_dir, filename+'.pickle' - pass - cnx.rollback() - raise - finally: - cnx.commit() - cu.close() - - -def _copyfrom_buffer_convert_None(value, **opts): - '''Convert None value to "NULL"''' - return 'NULL' - -def _copyfrom_buffer_convert_number(value, **opts): - '''Convert a number into its string representation''' - return str(value) - -def _copyfrom_buffer_convert_string(value, **opts): - '''Convert string value. - - Recognized keywords: - :encoding: resulting string encoding (default: utf-8) - :replace_sep: character used when input contains characters - that conflict with the column separator. - ''' - encoding = opts.get('encoding','utf-8') - replace_sep = opts.get('replace_sep', None) - # Remove separators used in string formatting - for _char in (u'\t', u'\r', u'\n'): - if _char in value: - # If a replace_sep is given, replace - # the separator - # (and thus avoid empty buffer) - if replace_sep is None: - raise ValueError('conflicting separator: ' - 'you must provide the replace_sep option') - value = value.replace(_char, replace_sep) - value = value.replace('\\', r'\\') - if isinstance(value, unicode): - value = value.encode(encoding) - return value - -def _copyfrom_buffer_convert_date(value, **opts): - '''Convert date into "YYYY-MM-DD"''' - # Do not use strftime, as it yields issue with date < 1900 - # (http://bugs.python.org/issue1777412) - return '%04d-%02d-%02d' % (value.year, value.month, value.day) - -def _copyfrom_buffer_convert_datetime(value, **opts): - '''Convert date into "YYYY-MM-DD HH:MM:SS.UUUUUU"''' - # Do not use strftime, as it yields issue with date < 1900 - # (http://bugs.python.org/issue1777412) - return '%s %s' % (_copyfrom_buffer_convert_date(value, **opts), - _copyfrom_buffer_convert_time(value, **opts)) - -def _copyfrom_buffer_convert_time(value, **opts): - '''Convert time into "HH:MM:SS.UUUUUU"''' - return '%02d:%02d:%02d.%06d' % (value.hour, value.minute, - value.second, value.microsecond) - -# (types, converter) list. -_COPYFROM_BUFFER_CONVERTERS = [ - (type(None), _copyfrom_buffer_convert_None), - ((long, int, float), _copyfrom_buffer_convert_number), - (basestring, _copyfrom_buffer_convert_string), - (datetime, _copyfrom_buffer_convert_datetime), - (date, _copyfrom_buffer_convert_date), - (time, _copyfrom_buffer_convert_time), -] - -def _create_copyfrom_buffer(data, columns=None, **convert_opts): - """ - Create a StringIO buffer for 'COPY FROM' command. - Deals with Unicode, Int, Float, Date... (see ``converters``) - - :data: a sequence/dict of tuples - :columns: list of columns to consider (default to all columns) - :converter_opts: keyword arguements given to converters - """ - # Create a list rather than directly create a StringIO - # to correctly write lines separated by '\n' in a single step - rows = [] - if columns is None: - if isinstance(data[0], (tuple, list)): - columns = range(len(data[0])) - elif isinstance(data[0], dict): - columns = data[0].keys() - else: - raise ValueError('Could not get columns: you must provide columns.') - for row in data: - # Iterate over the different columns and the different values - # and try to convert them to a correct datatype. - # If an error is raised, do not continue. - formatted_row = [] - for col in columns: - try: - value = row[col] - except KeyError: - warnings.warn(u"Column %s is not accessible in row %s" - % (col, row), RuntimeWarning) - # XXX 'value' set to None so that the import does not end in - # error. - # Instead, the extra keys are set to NULL from the - # database point of view. - value = None - for types, converter in _COPYFROM_BUFFER_CONVERTERS: - if isinstance(value, types): - value = converter(value, **convert_opts) - break - else: - raise ValueError("Unsupported value type %s" % type(value)) - # We push the value to the new formatted row - # if the value is not None and could be converted to a string. - formatted_row.append(value) - rows.append('\t'.join(formatted_row)) - return StringIO('\n'.join(rows)) - - -# object stores ################################################################# - -class ObjectStore(object): - """Store objects in memory for *faster* validation (development mode) - - But it will not enforce the constraints of the schema and hence will miss some problems - - >>> store = ObjectStore() - >>> user = store.create_entity('CWUser', login=u'johndoe') - >>> group = store.create_entity('CWUser', name=u'unknown') - >>> store.relate(user.eid, 'in_group', group.eid) - """ - def __init__(self): - self.items = [] - self.eids = {} - self.types = {} - self.relations = set() - self.indexes = {} - - def create_entity(self, etype, **data): - data = attrdict(data) - data['eid'] = eid = len(self.items) - self.items.append(data) - self.eids[eid] = data - self.types.setdefault(etype, []).append(eid) - return data - - def relate(self, eid_from, rtype, eid_to, **kwargs): - """Add new relation""" - relation = eid_from, rtype, eid_to - self.relations.add(relation) - return relation - - def commit(self): - """this commit method does nothing by default""" - return - - def flush(self): - """The method is provided so that all stores share a common API""" - pass - - @property - def nb_inserted_entities(self): - return len(self.eids) - @property - def nb_inserted_types(self): - return len(self.types) - @property - def nb_inserted_relations(self): - return len(self.relations) - -class RQLObjectStore(ObjectStore): - """ObjectStore that works with an actual RQL repository (production mode)""" - - def __init__(self, cnx, commit=None): - if commit is not None: - warnings.warn('[3.19] commit argument should not be specified ' - 'as the cnx object already provides it.', - DeprecationWarning, stacklevel=2) - super(RQLObjectStore, self).__init__() - self._cnx = cnx - self._commit = commit or cnx.commit - - def commit(self): - return self._commit() - - def rql(self, *args): - return self._cnx.execute(*args) - - @property - def session(self): - warnings.warn('[3.19] deprecated property.', DeprecationWarning, - stacklevel=2) - return self._cnx.repo._get_session(self._cnx.sessionid) - - def create_entity(self, *args, **kwargs): - entity = self._cnx.create_entity(*args, **kwargs) - self.eids[entity.eid] = entity - self.types.setdefault(args[0], []).append(entity.eid) - return entity - - def relate(self, eid_from, rtype, eid_to, **kwargs): - eid_from, rtype, eid_to = super(RQLObjectStore, self).relate( - eid_from, rtype, eid_to, **kwargs) - self.rql('SET X %s Y WHERE X eid %%(x)s, Y eid %%(y)s' % rtype, - {'x': int(eid_from), 'y': int(eid_to)}) - - @deprecated("[3.19] use cnx.find(*args, **kwargs).entities() instead") - def find_entities(self, *args, **kwargs): - return self._cnx.find(*args, **kwargs).entities() - - @deprecated("[3.19] use cnx.find(*args, **kwargs).one() instead") - def find_one_entity(self, *args, **kwargs): - return self._cnx.find(*args, **kwargs).one() - -# the import controller ######################################################## - -class CWImportController(object): - """Controller of the data import process. - - >>> ctl = CWImportController(store) - >>> ctl.generators = list_of_data_generators - >>> ctl.data = dict_of_data_tables - >>> ctl.run() - """ - - def __init__(self, store, askerror=0, catcherrors=None, tell=tell, - commitevery=50): - self.store = store - self.generators = None - self.data = {} - self.errors = None - self.askerror = askerror - if catcherrors is None: - catcherrors = askerror - self.catcherrors = catcherrors - self.commitevery = commitevery # set to None to do a single commit - self._tell = tell - - def check(self, type, key, value): - self._checks.setdefault(type, {}).setdefault(key, []).append(value) - - def check_map(self, entity, key, map, default): - try: - entity[key] = map[entity[key]] - except KeyError: - self.check(key, entity[key], None) - entity[key] = default - - def record_error(self, key, msg=None, type=None, value=None, tb=None): - tmp = StringIO() - if type is None: - traceback.print_exc(file=tmp) - else: - traceback.print_exception(type, value, tb, file=tmp) - # use a list to avoid counting a errors instead of one - errorlog = self.errors.setdefault(key, []) - if msg is None: - errorlog.append(tmp.getvalue().splitlines()) - else: - errorlog.append( (msg, tmp.getvalue().splitlines()) ) - - def run(self): - self.errors = {} - if self.commitevery is None: - self.tell('Will commit all or nothing.') - else: - self.tell('Will commit every %s iterations' % self.commitevery) - for func, checks in self.generators: - self._checks = {} - func_name = func.__name__ - self.tell("Run import function '%s'..." % func_name) - try: - func(self) - except Exception: - if self.catcherrors: - self.record_error(func_name, 'While calling %s' % func.__name__) - else: - self._print_stats() - raise - for key, func, title, help in checks: - buckets = self._checks.get(key) - if buckets: - err = func(buckets) - if err: - self.errors[title] = (help, err) - try: - txuuid = self.store.commit() - if txuuid is not None: - self.tell('Transaction commited (txuuid: %s)' % txuuid) - except QueryError as ex: - self.tell('Transaction aborted: %s' % ex) - self._print_stats() - if self.errors: - if self.askerror == 2 or (self.askerror and confirm('Display errors ?')): - from pprint import pformat - for errkey, error in self.errors.items(): - self.tell("\n%s (%s): %d\n" % (error[0], errkey, len(error[1]))) - self.tell(pformat(sorted(error[1]))) - - def _print_stats(self): - nberrors = sum(len(err) for err in self.errors.itervalues()) - self.tell('\nImport statistics: %i entities, %i types, %i relations and %i errors' - % (self.store.nb_inserted_entities, - self.store.nb_inserted_types, - self.store.nb_inserted_relations, - nberrors)) - - def get_data(self, key): - return self.data.get(key) - - def index(self, name, key, value, unique=False): - """create a new index - - If unique is set to True, only first occurence will be kept not the following ones - """ - if unique: - try: - if value in self.store.indexes[name][key]: - return - except KeyError: - # we're sure that one is the first occurence; so continue... - pass - self.store.indexes.setdefault(name, {}).setdefault(key, []).append(value) - - def tell(self, msg): - self._tell(msg) - - def iter_and_commit(self, datakey): - """iter rows, triggering commit every self.commitevery iterations""" - if self.commitevery is None: - return self.get_data(datakey) - else: - return callfunc_every(self.store.commit, - self.commitevery, - self.get_data(datakey)) - - -class NoHookRQLObjectStore(RQLObjectStore): - """ObjectStore that works with an actual RQL repository (production mode)""" - - def __init__(self, cnx, metagen=None, baseurl=None): - super(NoHookRQLObjectStore, self).__init__(cnx) - self.source = cnx.repo.system_source - self.rschema = cnx.repo.schema.rschema - self.add_relation = self.source.add_relation - if metagen is None: - metagen = MetaGenerator(cnx, baseurl) - self.metagen = metagen - self._nb_inserted_entities = 0 - self._nb_inserted_types = 0 - self._nb_inserted_relations = 0 - # deactivate security - cnx.read_security = False - cnx.write_security = False - - def create_entity(self, etype, **kwargs): - for k, v in kwargs.iteritems(): - kwargs[k] = getattr(v, 'eid', v) - entity, rels = self.metagen.base_etype_dicts(etype) - # make a copy to keep cached entity pristine - entity = copy(entity) - entity.cw_edited = copy(entity.cw_edited) - entity.cw_clear_relation_cache() - entity.cw_edited.update(kwargs, skipsec=False) - entity_source, extid = self.metagen.init_entity(entity) - cnx = self._cnx - self.source.add_entity(cnx, entity) - self.source.add_info(cnx, entity, entity_source, extid) - kwargs = dict() - if inspect.getargspec(self.add_relation).keywords: - kwargs['subjtype'] = entity.cw_etype - for rtype, targeteids in rels.iteritems(): - # targeteids may be a single eid or a list of eids - inlined = self.rschema(rtype).inlined - try: - for targeteid in targeteids: - self.add_relation(cnx, entity.eid, rtype, targeteid, - inlined, **kwargs) - except TypeError: - self.add_relation(cnx, entity.eid, rtype, targeteids, - inlined, **kwargs) - self._nb_inserted_entities += 1 - return entity - - def relate(self, eid_from, rtype, eid_to, **kwargs): - assert not rtype.startswith('reverse_') - self.add_relation(self._cnx, eid_from, rtype, eid_to, - self.rschema(rtype).inlined) - if self.rschema(rtype).symmetric: - self.add_relation(self._cnx, eid_to, rtype, eid_from, - self.rschema(rtype).inlined) - self._nb_inserted_relations += 1 - - @property - def nb_inserted_entities(self): - return self._nb_inserted_entities - @property - def nb_inserted_types(self): - return self._nb_inserted_types - @property - def nb_inserted_relations(self): - return self._nb_inserted_relations - - -class MetaGenerator(object): - META_RELATIONS = (META_RTYPES - - VIRTUAL_RTYPES - - set(('eid', 'cwuri', - 'is', 'is_instance_of', 'cw_source'))) - - def __init__(self, cnx, baseurl=None, source=None): - self._cnx = cnx - if baseurl is None: - config = cnx.vreg.config - baseurl = config['base-url'] or config.default_base_url() - if not baseurl[-1] == '/': - baseurl += '/' - self.baseurl = baseurl - if source is None: - source = cnx.repo.system_source - self.source = source - self.create_eid = cnx.repo.system_source.create_eid - self.time = datetime.now() - # attributes/relations shared by all entities of the same type - self.etype_attrs = [] - self.etype_rels = [] - # attributes/relations specific to each entity - self.entity_attrs = ['cwuri'] - #self.entity_rels = [] XXX not handled (YAGNI?) - schema = cnx.vreg.schema - rschema = schema.rschema - for rtype in self.META_RELATIONS: - # skip owned_by / created_by if user is the internal manager - if cnx.user.eid == -1 and rtype in ('owned_by', 'created_by'): - continue - if rschema(rtype).final: - self.etype_attrs.append(rtype) - else: - self.etype_rels.append(rtype) - - @cached - def base_etype_dicts(self, etype): - entity = self._cnx.vreg['etypes'].etype_class(etype)(self._cnx) - # entity are "surface" copied, avoid shared dict between copies - del entity.cw_extra_kwargs - entity.cw_edited = EditedEntity(entity) - for attr in self.etype_attrs: - genfunc = self.generate(attr) - if genfunc: - entity.cw_edited.edited_attribute(attr, genfunc(entity)) - rels = {} - for rel in self.etype_rels: - genfunc = self.generate(rel) - if genfunc: - rels[rel] = genfunc(entity) - return entity, rels - - def init_entity(self, entity): - entity.eid = self.create_eid(self._cnx) - extid = entity.cw_edited.get('cwuri') - for attr in self.entity_attrs: - if attr in entity.cw_edited: - # already set, skip this attribute - continue - genfunc = self.generate(attr) - if genfunc: - entity.cw_edited.edited_attribute(attr, genfunc(entity)) - if isinstance(extid, unicode): - extid = extid.encode('utf-8') - return self.source, extid - - def generate(self, rtype): - return getattr(self, 'gen_%s' % rtype, None) - - def gen_cwuri(self, entity): - assert self.baseurl, 'baseurl is None while generating cwuri' - return u'%s%s' % (self.baseurl, entity.eid) - - def gen_creation_date(self, entity): - return self.time - - def gen_modification_date(self, entity): - return self.time - - def gen_created_by(self, entity): - return self._cnx.user.eid - - def gen_owned_by(self, entity): - return self._cnx.user.eid - - -########################################################################### -## SQL object store ####################################################### -########################################################################### -class SQLGenObjectStore(NoHookRQLObjectStore): - """Controller of the data import process. This version is based - on direct insertions throught SQL command (COPY FROM or execute many). - - >>> store = SQLGenObjectStore(cnx) - >>> store.create_entity('Person', ...) - >>> store.flush() - """ - - def __init__(self, cnx, dump_output_dir=None, nb_threads_statement=3): - """ - Initialize a SQLGenObjectStore. - - Parameters: - - - cnx: connection on the cubicweb instance - - dump_output_dir: a directory to dump failed statements - for easier recovery. Default is None (no dump). - - nb_threads_statement: number of threads used - for SQL insertion (default is 3). - """ - super(SQLGenObjectStore, self).__init__(cnx) - ### hijack default source - self.source = SQLGenSourceWrapper( - self.source, cnx.vreg.schema, - dump_output_dir=dump_output_dir, - nb_threads_statement=nb_threads_statement) - ### XXX This is done in super().__init__(), but should be - ### redone here to link to the correct source - self.add_relation = self.source.add_relation - self.indexes_etypes = {} - - def flush(self): - """Flush data to the database""" - self.source.flush() - - def relate(self, subj_eid, rtype, obj_eid, **kwargs): - if subj_eid is None or obj_eid is None: - return - # XXX Could subjtype be inferred ? - self.source.add_relation(self._cnx, subj_eid, rtype, obj_eid, - self.rschema(rtype).inlined, **kwargs) - if self.rschema(rtype).symmetric: - self.source.add_relation(self._cnx, obj_eid, rtype, subj_eid, - self.rschema(rtype).inlined, **kwargs) - - def drop_indexes(self, etype): - """Drop indexes for a given entity type""" - if etype not in self.indexes_etypes: - cu = self._cnx.cnxset.cu - def index_to_attr(index): - """turn an index name to (database) attribute name""" - return index.replace(etype.lower(), '').replace('idx', '').strip('_') - indices = [(index, index_to_attr(index)) - for index in self.source.dbhelper.list_indices(cu, etype) - # Do not consider 'cw_etype_pkey' index - if not index.endswith('key')] - self.indexes_etypes[etype] = indices - for index, attr in self.indexes_etypes[etype]: - self._cnx.system_sql('DROP INDEX %s' % index) - - def create_indexes(self, etype): - """Recreate indexes for a given entity type""" - for index, attr in self.indexes_etypes.get(etype, []): - sql = 'CREATE INDEX %s ON cw_%s(%s)' % (index, etype, attr) - self._cnx.system_sql(sql) - - -########################################################################### -## SQL Source ############################################################# -########################################################################### - -class SQLGenSourceWrapper(object): - - def __init__(self, system_source, schema, - dump_output_dir=None, nb_threads_statement=3): - self.system_source = system_source - self._sql = threading.local() - # Explicitely backport attributes from system source - self._storage_handler = self.system_source._storage_handler - self.preprocess_entity = self.system_source.preprocess_entity - self.sqlgen = self.system_source.sqlgen - self.uri = self.system_source.uri - self.eid = self.system_source.eid - # Directory to write temporary files - self.dump_output_dir = dump_output_dir - # Allow to execute code with SQLite backend that does - # not support (yet...) copy_from - # XXX Should be dealt with in logilab.database - spcfrom = system_source.dbhelper.dbapi_module.support_copy_from - self.support_copy_from = spcfrom - self.dbencoding = system_source.dbhelper.dbencoding - self.nb_threads_statement = nb_threads_statement - # initialize thread-local data for main thread - self.init_thread_locals() - self._inlined_rtypes_cache = {} - self._fill_inlined_rtypes_cache(schema) - self.schema = schema - self.do_fti = False - - def _fill_inlined_rtypes_cache(self, schema): - cache = self._inlined_rtypes_cache - for eschema in schema.entities(): - for rschema in eschema.ordered_relations(): - if rschema.inlined: - cache[eschema.type] = SQL_PREFIX + rschema.type - - def init_thread_locals(self): - """initializes thread-local data""" - self._sql.entities = defaultdict(list) - self._sql.relations = {} - self._sql.inlined_relations = {} - # keep track, for each eid of the corresponding data dict - self._sql.eid_insertdicts = {} - - def flush(self): - print 'starting flush' - _entities_sql = self._sql.entities - _relations_sql = self._sql.relations - _inlined_relations_sql = self._sql.inlined_relations - _insertdicts = self._sql.eid_insertdicts - try: - # try, for each inlined_relation, to find if we're also creating - # the host entity (i.e. the subject of the relation). - # In that case, simply update the insert dict and remove - # the need to make the - # UPDATE statement - for statement, datalist in _inlined_relations_sql.iteritems(): - new_datalist = [] - # for a given inlined relation, - # browse each couple to be inserted - for data in datalist: - keys = list(data) - # For inlined relations, it exists only two case: - # (rtype, cw_eid) or (cw_eid, rtype) - if keys[0] == 'cw_eid': - rtype = keys[1] - else: - rtype = keys[0] - updated_eid = data['cw_eid'] - if updated_eid in _insertdicts: - _insertdicts[updated_eid][rtype] = data[rtype] - else: - # could not find corresponding insert dict, keep the - # UPDATE query - new_datalist.append(data) - _inlined_relations_sql[statement] = new_datalist - _import_statements(self.system_source.get_connection, - _entities_sql.items() - + _relations_sql.items() - + _inlined_relations_sql.items(), - dump_output_dir=self.dump_output_dir, - nb_threads=self.nb_threads_statement, - support_copy_from=self.support_copy_from, - encoding=self.dbencoding) - finally: - _entities_sql.clear() - _relations_sql.clear() - _insertdicts.clear() - _inlined_relations_sql.clear() - - def add_relation(self, cnx, subject, rtype, object, - inlined=False, **kwargs): - if inlined: - _sql = self._sql.inlined_relations - data = {'cw_eid': subject, SQL_PREFIX + rtype: object} - subjtype = kwargs.get('subjtype') - if subjtype is None: - # Try to infer it - targets = [t.type for t in - self.schema.rschema(rtype).subjects()] - if len(targets) == 1: - subjtype = targets[0] - else: - raise ValueError('You should give the subject etype for ' - 'inlined relation %s' - ', as it cannot be inferred: ' - 'this type is given as keyword argument ' - '``subjtype``'% rtype) - statement = self.sqlgen.update(SQL_PREFIX + subjtype, - data, ['cw_eid']) - else: - _sql = self._sql.relations - data = {'eid_from': subject, 'eid_to': object} - statement = self.sqlgen.insert('%s_relation' % rtype, data) - if statement in _sql: - _sql[statement].append(data) - else: - _sql[statement] = [data] - - def add_entity(self, cnx, entity): - with self._storage_handler(entity, 'added'): - attrs = self.preprocess_entity(entity) - rtypes = self._inlined_rtypes_cache.get(entity.cw_etype, ()) - if isinstance(rtypes, str): - rtypes = (rtypes,) - for rtype in rtypes: - if rtype not in attrs: - attrs[rtype] = None - sql = self.sqlgen.insert(SQL_PREFIX + entity.cw_etype, attrs) - self._sql.eid_insertdicts[entity.eid] = attrs - self._append_to_entities(sql, attrs) - - def _append_to_entities(self, sql, attrs): - self._sql.entities[sql].append(attrs) - - def _handle_insert_entity_sql(self, cnx, sql, attrs): - # We have to overwrite the source given in parameters - # as here, we directly use the system source - attrs['asource'] = self.system_source.uri - self._append_to_entities(sql, attrs) - - def _handle_is_relation_sql(self, cnx, sql, attrs): - self._append_to_entities(sql, attrs) - - def _handle_is_instance_of_sql(self, cnx, sql, attrs): - self._append_to_entities(sql, attrs) - - def _handle_source_relation_sql(self, cnx, sql, attrs): - self._append_to_entities(sql, attrs) - - # add_info is _copypasted_ from the one in NativeSQLSource. We want it - # there because it will use the _handlers of the SQLGenSourceWrapper, which - # are not like the ones in the native source. - def add_info(self, cnx, entity, source, extid): - """add type and source info for an eid into the system table""" - # begin by inserting eid/type/source/extid into the entities table - if extid is not None: - assert isinstance(extid, str) - extid = b64encode(extid) - attrs = {'type': entity.cw_etype, 'eid': entity.eid, 'extid': extid, - 'asource': source.uri} - self._handle_insert_entity_sql(cnx, self.sqlgen.insert('entities', attrs), attrs) - # insert core relations: is, is_instance_of and cw_source - try: - self._handle_is_relation_sql(cnx, 'INSERT INTO is_relation(eid_from,eid_to) VALUES (%s,%s)', - (entity.eid, eschema_eid(cnx, entity.e_schema))) - except IndexError: - # during schema serialization, skip - pass - else: - for eschema in entity.e_schema.ancestors() + [entity.e_schema]: - self._handle_is_relation_sql(cnx, - 'INSERT INTO is_instance_of_relation(eid_from,eid_to) VALUES (%s,%s)', - (entity.eid, eschema_eid(cnx, eschema))) - if 'CWSource' in self.schema and source.eid is not None: # else, cw < 3.10 - self._handle_is_relation_sql(cnx, 'INSERT INTO cw_source_relation(eid_from,eid_to) VALUES (%s,%s)', - (entity.eid, source.eid)) - # now we can update the full text index - if self.do_fti and self.need_fti_indexation(entity.cw_etype): - self.index_entity(cnx, entity=entity) diff -r d4d36b583f40 -r a4fcee1e9789 dataimport/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dataimport/__init__.py Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,35 @@ +# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr +# +# This file is part of CubicWeb. +# +# CubicWeb is free software: you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 2.1 of the License, or (at your option) +# any later version. +# +# CubicWeb is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with CubicWeb. If not, see . +"""Package containing various utilities to import data into cubicweb.""" + + +def callfunc_every(func, number, iterable): + """yield items of `iterable` one by one and call function `func` + every `number` iterations. Always call function `func` at the end. + """ + for idx, item in enumerate(iterable): + yield item + if not idx % number: + func() + func() + +# import for backward compat +from cubicweb.dataimport.stores import * +from cubicweb.dataimport.pgstore import * +from cubicweb.dataimport.csv import * +from cubicweb.dataimport.deprecated import * diff -r d4d36b583f40 -r a4fcee1e9789 dataimport/csv.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dataimport/csv.py Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,113 @@ +# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr +# +# This file is part of CubicWeb. +# +# CubicWeb is free software: you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 2.1 of the License, or (at your option) +# any later version. +# +# CubicWeb is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with CubicWeb. If not, see . +"""Functions to help importing CSV data""" + +from __future__ import absolute_import + +import csv as csvmod +import warnings +import os.path as osp + +from logilab.common import shellutils + + +def count_lines(stream_or_filename): + if isinstance(stream_or_filename, basestring): + f = open(stream_or_filename) + else: + f = stream_or_filename + f.seek(0) + for i, line in enumerate(f): + pass + f.seek(0) + return i+1 + + +def ucsvreader_pb(stream_or_path, encoding='utf-8', delimiter=',', quotechar='"', + skipfirst=False, withpb=True, skip_empty=True, separator=None, + quote=None): + """same as :func:`ucsvreader` but a progress bar is displayed as we iter on rows""" + if separator is not None: + delimiter = separator + warnings.warn("[3.20] 'separator' kwarg is deprecated, use 'delimiter' instead") + if quote is not None: + quotechar = quote + warnings.warn("[3.20] 'quote' kwarg is deprecated, use 'quotechar' instead") + if isinstance(stream_or_path, basestring): + if not osp.exists(stream_or_path): + raise Exception("file doesn't exists: %s" % stream_or_path) + stream = open(stream_or_path) + else: + stream = stream_or_path + rowcount = count_lines(stream) + if skipfirst: + rowcount -= 1 + if withpb: + pb = shellutils.ProgressBar(rowcount, 50) + for urow in ucsvreader(stream, encoding, delimiter, quotechar, + skipfirst=skipfirst, skip_empty=skip_empty): + yield urow + if withpb: + pb.update() + print ' %s rows imported' % rowcount + + +def ucsvreader(stream, encoding='utf-8', delimiter=',', quotechar='"', + skipfirst=False, ignore_errors=False, skip_empty=True, + separator=None, quote=None): + """A csv reader that accepts files with any encoding and outputs unicode + strings + + if skip_empty (the default), lines without any values specified (only + separators) will be skipped. This is useful for Excel exports which may be + full of such lines. + """ + if separator is not None: + delimiter = separator + warnings.warn("[3.20] 'separator' kwarg is deprecated, use 'delimiter' instead") + if quote is not None: + quotechar = quote + warnings.warn("[3.20] 'quote' kwarg is deprecated, use 'quotechar' instead") + it = iter(csvmod.reader(stream, delimiter=delimiter, quotechar=quotechar)) + if not ignore_errors: + if skipfirst: + it.next() + for row in it: + decoded = [item.decode(encoding) for item in row] + if not skip_empty or any(decoded): + yield decoded + else: + if skipfirst: + try: + row = it.next() + except csvmod.Error: + pass + # Safe version, that can cope with error in CSV file + while True: + try: + row = it.next() + # End of CSV, break + except StopIteration: + break + # Error in CSV, ignore line and continue + except csvmod.Error: + continue + decoded = [item.decode(encoding) for item in row] + if not skip_empty or any(decoded): + yield decoded + diff -r d4d36b583f40 -r a4fcee1e9789 dataimport/deprecated.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dataimport/deprecated.py Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,460 @@ +# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr +# +# This file is part of CubicWeb. +# +# CubicWeb is free software: you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 2.1 of the License, or (at your option) +# any later version. +# +# CubicWeb is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with CubicWeb. If not, see . +"""Old and deprecated dataimport API that provides tools to import tabular data. + + +Example of use (run this with `cubicweb-ctl shell instance import-script.py`): + +.. sourcecode:: python + + from cubicweb.dataimport import * + # define data generators + GENERATORS = [] + + USERS = [('Prenom', 'firstname', ()), + ('Nom', 'surname', ()), + ('Identifiant', 'login', ()), + ] + + def gen_users(ctl): + for row in ctl.iter_and_commit('utilisateurs'): + entity = mk_entity(row, USERS) + entity['upassword'] = 'motdepasse' + ctl.check('login', entity['login'], None) + entity = ctl.store.prepare_insert_entity('CWUser', **entity) + email = ctl.store.prepare_insert_entity('EmailAddress', address=row['email']) + ctl.store.prepare_insert_relation(entity, 'use_email', email) + ctl.store.rql('SET U in_group G WHERE G name "users", U eid %(x)s', {'x': entity}) + + CHK = [('login', check_doubles, 'Utilisateurs Login', + 'Deux utilisateurs ne devraient pas avoir le meme login.'), + ] + + GENERATORS.append( (gen_users, CHK) ) + + # create controller + ctl = CWImportController(RQLObjectStore(cnx)) + ctl.askerror = 1 + ctl.generators = GENERATORS + ctl.data['utilisateurs'] = lazytable(ucsvreader(open('users.csv'))) + # run + ctl.run() + +.. BUG file with one column are not parsable +.. TODO rollback() invocation is not possible yet +""" + +import sys +import traceback +from StringIO import StringIO + +from logilab.common import attrdict, shellutils +from logilab.common.date import strptime +from logilab.common.deprecation import deprecated, class_deprecated + +from cubicweb import QueryError +from cubicweb.dataimport import callfunc_every + + +@deprecated('[3.21] deprecated') +def lazytable(reader): + """The first row is taken to be the header of the table and + used to output a dict for each row of data. + + >>> data = lazytable(ucsvreader(open(filename))) + """ + header = reader.next() + for row in reader: + yield dict(zip(header, row)) + + +@deprecated('[3.21] deprecated') +def lazydbtable(cu, table, headers, orderby=None): + """return an iterator on rows of a sql table. On each row, fetch columns + defined in headers and return values as a dictionary. + + >>> data = lazydbtable(cu, 'experimentation', ('id', 'nickname', 'gps')) + """ + sql = 'SELECT %s FROM %s' % (','.join(headers), table,) + if orderby: + sql += ' ORDER BY %s' % ','.join(orderby) + cu.execute(sql) + while True: + row = cu.fetchone() + if row is None: + break + yield dict(zip(headers, row)) + + +@deprecated('[3.21] deprecated') +def tell(msg): + print msg + + +@deprecated('[3.21] deprecated') +def confirm(question): + """A confirm function that asks for yes/no/abort and exits on abort.""" + answer = shellutils.ASK.ask(question, ('Y', 'n', 'abort'), 'Y') + if answer == 'abort': + sys.exit(1) + return answer == 'Y' + + +class catch_error(object): + """Helper for @contextmanager decorator.""" + __metaclass__ = class_deprecated + __deprecation_warning__ = '[3.21] deprecated' + + def __init__(self, ctl, key='unexpected error', msg=None): + self.ctl = ctl + self.key = key + self.msg = msg + + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + if type is not None: + if issubclass(type, (KeyboardInterrupt, SystemExit)): + return # re-raise + if self.ctl.catcherrors: + self.ctl.record_error(self.key, None, type, value, traceback) + return True # silent + +@deprecated('[3.21] deprecated') +def mk_entity(row, map): + """Return a dict made from sanitized mapped values. + + ValueError can be raised on unexpected values found in checkers + + >>> row = {'myname': u'dupont'} + >>> map = [('myname', u'name', (call_transform_method('title'),))] + >>> mk_entity(row, map) + {'name': u'Dupont'} + >>> row = {'myname': u'dupont', 'optname': u''} + >>> map = [('myname', u'name', (call_transform_method('title'),)), + ... ('optname', u'MARKER', (optional,))] + >>> mk_entity(row, map) + {'name': u'Dupont', 'optname': None} + """ + res = {} + assert isinstance(row, dict) + assert isinstance(map, list) + for src, dest, funcs in map: + try: + res[dest] = row[src] + except KeyError: + continue + try: + for func in funcs: + res[dest] = func(res[dest]) + if res[dest] is None: + break + except ValueError as err: + raise ValueError('error with %r field: %s' % (src, err)), None, sys.exc_info()[-1] + return res + + +# base sanitizing/coercing functions ########################################### + +@deprecated('[3.21] deprecated') +def optional(value): + """checker to filter optional field + + If value is undefined (ex: empty string), return None that will + break the checkers validation chain + + General use is to add 'optional' check in first condition to avoid + ValueError by further checkers + + >>> MAPPER = [(u'value', 'value', (optional, int))] + >>> row = {'value': u'XXX'} + >>> mk_entity(row, MAPPER) + {'value': None} + >>> row = {'value': u'100'} + >>> mk_entity(row, MAPPER) + {'value': 100} + """ + if value: + return value + return None + + +@deprecated('[3.21] deprecated') +def required(value): + """raise ValueError if value is empty + + This check should be often found in last position in the chain. + """ + if value: + return value + raise ValueError("required") + + +@deprecated('[3.21] deprecated') +def todatetime(format='%d/%m/%Y'): + """return a transformation function to turn string input value into a + `datetime.datetime` instance, using given format. + + Follow it by `todate` or `totime` functions from `logilab.common.date` if + you want a `date`/`time` instance instead of `datetime`. + """ + def coerce(value): + return strptime(value, format) + return coerce + + +@deprecated('[3.21] deprecated') +def call_transform_method(methodname, *args, **kwargs): + """return value returned by calling the given method on input""" + def coerce(value): + return getattr(value, methodname)(*args, **kwargs) + return coerce + + +@deprecated('[3.21] deprecated') +def call_check_method(methodname, *args, **kwargs): + """check value returned by calling the given method on input is true, + else raise ValueError + """ + def check(value): + if getattr(value, methodname)(*args, **kwargs): + return value + raise ValueError('%s not verified on %r' % (methodname, value)) + return check + + +# base integrity checking functions ############################################ + +@deprecated('[3.21] deprecated') +def check_doubles(buckets): + """Extract the keys that have more than one item in their bucket.""" + return [(k, len(v)) for k, v in buckets.items() if len(v) > 1] + + +@deprecated('[3.21] deprecated') +def check_doubles_not_none(buckets): + """Extract the keys that have more than one item in their bucket.""" + return [(k, len(v)) for k, v in buckets.items() + if k is not None and len(v) > 1] + + +class ObjectStore(object): + """Store objects in memory for *faster* validation (development mode) + + But it will not enforce the constraints of the schema and hence will miss some problems + + >>> store = ObjectStore() + >>> user = store.prepare_insert_entity('CWUser', login=u'johndoe') + >>> group = store.prepare_insert_entity('CWUser', name=u'unknown') + >>> store.prepare_insert_relation(user, 'in_group', group) + """ + __metaclass__ = class_deprecated + __deprecation_warning__ = '[3.21] use the new importer API' + + def __init__(self): + self.items = [] + self.eids = {} + self.types = {} + self.relations = set() + self.indexes = {} + + def prepare_insert_entity(self, etype, **data): + """Given an entity type, attributes and inlined relations, return an eid for the entity that + would be inserted with a real store. + """ + data = attrdict(data) + data['eid'] = eid = len(self.items) + self.items.append(data) + self.eids[eid] = data + self.types.setdefault(etype, []).append(eid) + return eid + + def prepare_update_entity(self, etype, eid, **kwargs): + """Given an entity type and eid, updates the corresponding fake entity with specified + attributes and inlined relations. + """ + assert eid in self.types[etype], 'Trying to update with wrong type {}'.format(etype) + data = self.eids[eid] + data.update(kwargs) + + def prepare_insert_relation(self, eid_from, rtype, eid_to, **kwargs): + """Store into the `relations` attribute that a relation ``rtype`` exists between entities + with eids ``eid_from`` and ``eid_to``. + """ + relation = eid_from, rtype, eid_to + self.relations.add(relation) + return relation + + def flush(self): + """Nothing to flush for this store.""" + pass + + def commit(self): + """Nothing to commit for this store.""" + return + + def finish(self): + """Nothing to do once import is terminated for this store.""" + pass + + @property + def nb_inserted_entities(self): + return len(self.eids) + + @property + def nb_inserted_types(self): + return len(self.types) + + @property + def nb_inserted_relations(self): + return len(self.relations) + + @deprecated('[3.21] use prepare_insert_entity instead') + def create_entity(self, etype, **data): + self.prepare_insert_entity(etype, **data) + return attrdict(data) + + @deprecated('[3.21] use prepare_insert_relation instead') + def relate(self, eid_from, rtype, eid_to, **kwargs): + self.prepare_insert_relation(eid_from, rtype, eid_to, **kwargs) + + +class CWImportController(object): + """Controller of the data import process. + + >>> ctl = CWImportController(store) + >>> ctl.generators = list_of_data_generators + >>> ctl.data = dict_of_data_tables + >>> ctl.run() + """ + __metaclass__ = class_deprecated + __deprecation_warning__ = '[3.21] use the new importer API' + + def __init__(self, store, askerror=0, catcherrors=None, tell=tell, + commitevery=50): + self.store = store + self.generators = None + self.data = {} + self.errors = None + self.askerror = askerror + if catcherrors is None: + catcherrors = askerror + self.catcherrors = catcherrors + self.commitevery = commitevery # set to None to do a single commit + self._tell = tell + + def check(self, type, key, value): + self._checks.setdefault(type, {}).setdefault(key, []).append(value) + + def check_map(self, entity, key, map, default): + try: + entity[key] = map[entity[key]] + except KeyError: + self.check(key, entity[key], None) + entity[key] = default + + def record_error(self, key, msg=None, type=None, value=None, tb=None): + tmp = StringIO() + if type is None: + traceback.print_exc(file=tmp) + else: + traceback.print_exception(type, value, tb, file=tmp) + # use a list to avoid counting a errors instead of one + errorlog = self.errors.setdefault(key, []) + if msg is None: + errorlog.append(tmp.getvalue().splitlines()) + else: + errorlog.append( (msg, tmp.getvalue().splitlines()) ) + + def run(self): + self.errors = {} + if self.commitevery is None: + self.tell('Will commit all or nothing.') + else: + self.tell('Will commit every %s iterations' % self.commitevery) + for func, checks in self.generators: + self._checks = {} + func_name = func.__name__ + self.tell("Run import function '%s'..." % func_name) + try: + func(self) + except Exception: + if self.catcherrors: + self.record_error(func_name, 'While calling %s' % func.__name__) + else: + self._print_stats() + raise + for key, func, title, help in checks: + buckets = self._checks.get(key) + if buckets: + err = func(buckets) + if err: + self.errors[title] = (help, err) + try: + txuuid = self.store.commit() + if txuuid is not None: + self.tell('Transaction commited (txuuid: %s)' % txuuid) + except QueryError as ex: + self.tell('Transaction aborted: %s' % ex) + self._print_stats() + if self.errors: + if self.askerror == 2 or (self.askerror and confirm('Display errors ?')): + from pprint import pformat + for errkey, error in self.errors.items(): + self.tell("\n%s (%s): %d\n" % (error[0], errkey, len(error[1]))) + self.tell(pformat(sorted(error[1]))) + + def _print_stats(self): + nberrors = sum(len(err) for err in self.errors.itervalues()) + self.tell('\nImport statistics: %i entities, %i types, %i relations and %i errors' + % (self.store.nb_inserted_entities, + self.store.nb_inserted_types, + self.store.nb_inserted_relations, + nberrors)) + + def get_data(self, key): + return self.data.get(key) + + def index(self, name, key, value, unique=False): + """create a new index + + If unique is set to True, only first occurence will be kept not the following ones + """ + if unique: + try: + if value in self.store.indexes[name][key]: + return + except KeyError: + # we're sure that one is the first occurence; so continue... + pass + self.store.indexes.setdefault(name, {}).setdefault(key, []).append(value) + + def tell(self, msg): + self._tell(msg) + + def iter_and_commit(self, datakey): + """iter rows, triggering commit every self.commitevery iterations""" + if self.commitevery is None: + return self.get_data(datakey) + else: + return callfunc_every(self.store.commit, + self.commitevery, + self.get_data(datakey)) + + diff -r d4d36b583f40 -r a4fcee1e9789 dataimport/importer.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dataimport/importer.py Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,417 @@ +# copyright 2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# contact http://www.logilab.fr -- mailto:contact@logilab.fr +# +# This program is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 2.1 of the License, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with this program. If not, see . +"""Data import of external entities. + +Main entry points: + +.. autoclass:: ExtEntitiesImporter +.. autoclass:: ExtEntity + +Utilities: + +.. autofunction:: cwuri2eid +.. autoclass:: RelationMapping +.. autofunction:: cubicweb.dataimport.importer.use_extid_as_cwuri +""" + +from collections import defaultdict +import logging + +from logilab.mtconverter import xml_escape + + +def cwuri2eid(cnx, etypes, source_eid=None): + """Return a dictionary mapping cwuri to eid for entities of the given entity types and / or + source. + """ + assert source_eid or etypes, 'no entity types nor source specified' + rql = 'Any U, X WHERE X cwuri U' + args = {} + if len(etypes) == 1: + rql += ', X is %s' % etypes[0] + elif etypes: + rql += ', X is IN (%s)' % ','.join(etypes) + if source_eid is not None: + rql += ', X cw_source S, S eid %(s)s' + args['s'] = source_eid + return dict(cnx.execute(rql, args)) + + +def use_extid_as_cwuri(extid2eid): + """Return a generator of :class:`ExtEntity` objects that will set `cwuri` + using entity's extid if the entity does not exist yet and has no `cwuri` + defined. + + `extid2eid` is an extid to eid dictionary coming from an + :class:`ExtEntitiesImporter` instance. + + Example usage: + + .. code-block:: python + + importer = SKOSExtEntitiesImporter(cnx, store, import_log) + set_cwuri = use_extid_as_cwuri(importer.extid2eid) + importer.import_entities(set_cwuri(extentities)) + """ + def use_extid_as_cwuri_filter(extentities): + for extentity in extentities: + if extentity.extid not in extid2eid: + extentity.values.setdefault('cwuri', set([unicode(extentity.extid)])) + yield extentity + return use_extid_as_cwuri_filter + + +class RelationMapping(object): + """Read-only mapping from relation type to set of related (subject, object) eids. + + If `source` is specified, only returns relations implying entities from + this source. + """ + + def __init__(self, cnx, source=None): + self.cnx = cnx + self._rql_template = 'Any S,O WHERE S {} O' + self._kwargs = {} + if source is not None: + self._rql_template += ', S cw_source SO, O cw_source SO, SO eid %(s)s' + self._kwargs['s'] = source.eid + + def __getitem__(self, rtype): + """Return a set of (subject, object) eids already related by `rtype`""" + rql = self._rql_template.format(rtype) + return set(tuple(x) for x in self.cnx.execute(rql, self._kwargs)) + + +class ExtEntity(object): + """Transitional representation of an entity for use in data importer. + + An external entity has the following properties: + + * ``extid`` (external id), an identifier for the ext entity, + + * ``etype`` (entity type), a string which must be the name of one entity type in the schema + (eg. ``'Person'``, ``'Animal'``, ...), + + * ``values``, a dictionary whose keys are attribute or relation names from the schema (eg. + ``'first_name'``, ``'friend'``), and whose values are *sets* + + For instance: + + .. code-block:: python + + ext_entity.extid = 'http://example.org/person/debby' + ext_entity.etype = 'Person' + ext_entity.values = {'first_name': set([u"Deborah", u"Debby"]), + 'friend': set(['http://example.org/person/john'])} + + """ + + def __init__(self, etype, extid, values=None): + self.etype = etype + self.extid = extid + if values is None: + values = {} + self.values = values + self._schema = None + + def __repr__(self): + return '<%s %s %s>' % (self.etype, self.extid, self.values) + + def iter_rdefs(self): + """Yield (key, rtype, role) defined in `.values` dict, with: + + * `key` is the original key in `.values` (i.e. the relation type or a 2-uple (relation type, + role)) + + * `rtype` is a yams relation type, expected to be found in the schema (attribute or + relation) + + * `role` is the role of the entity in the relation, 'subject' or 'object' + + Iteration is done on a copy of the keys so values may be inserted/deleted during it. + """ + for key in list(self.values): + if isinstance(key, tuple): + rtype, role = key + assert role in ('subject', 'object'), key + yield key, rtype, role + else: + yield key, key, 'subject' + + def prepare(self, schema): + """Prepare an external entity for later insertion: + + * ensure attributes and inlined relations have a single value + * turn set([value]) into value and remove key associated to empty set + * remove non inlined relations and return them as a [(e1key, relation, e2key)] list + + Return a list of non inlined relations that may be inserted later, each relations defined by + a 3-tuple (subject extid, relation type, object extid). + + Take care the importer may call this method several times. + """ + assert self._schema is None, 'prepare() has already been called for %s' % self + self._schema = schema + eschema = schema.eschema(self.etype) + deferred = [] + entity_dict = self.values + for key, rtype, role in self.iter_rdefs(): + rschema = schema.rschema(rtype) + if rschema.final or (rschema.inlined and role == 'subject'): + assert len(entity_dict[key]) <= 1, \ + "more than one value for %s: %s (%s)" % (rtype, entity_dict[key], self.extid) + if entity_dict[key]: + entity_dict[rtype] = entity_dict[key].pop() + if key != rtype: + del entity_dict[key] + if (rschema.final and eschema.has_metadata(rtype, 'format') + and not rtype + '_format' in entity_dict): + entity_dict[rtype + '_format'] = u'text/plain' + else: + del entity_dict[key] + else: + for target_extid in entity_dict.pop(key): + if role == 'subject': + deferred.append((self.extid, rtype, target_extid)) + else: + deferred.append((target_extid, rtype, self.extid)) + return deferred + + def is_ready(self, extid2eid): + """Return True if the ext entity is ready, i.e. has all the URIs used in inlined relations + currently existing. + """ + assert self._schema, 'prepare() method should be called first on %s' % self + # as .prepare has been called, we know that .values only contains subject relation *type* as + # key (no more (rtype, role) tuple) + schema = self._schema + entity_dict = self.values + for rtype in entity_dict: + rschema = schema.rschema(rtype) + if not rschema.final: + # .prepare() should drop other cases from the entity dict + assert rschema.inlined + if not entity_dict[rtype] in extid2eid: + return False + # entity is ready, replace all relation's extid by eids + for rtype in entity_dict: + rschema = schema.rschema(rtype) + if rschema.inlined: + entity_dict[rtype] = extid2eid[entity_dict[rtype]] + return True + + +class ExtEntitiesImporter(object): + """This class is responsible for importing externals entities, that is instances of + :class:`ExtEntity`, into CubicWeb entities. + + :param schema: the CubicWeb's instance schema + :param store: a CubicWeb `Store` + :param extid2eid: optional {extid: eid} dictionary giving information on existing entities. It + will be completed during import. You may want to use :func:`cwuri2eid` to build it. + :param existing_relation: optional {rtype: set((subj eid, obj eid))} mapping giving information on + existing relations of a given type. You may want to use :class:`RelationMapping` to build it. + :param etypes_order_hint: optional ordered iterable on entity types, giving an hint on the order in + which they should be attempted to be imported + :param import_log: optional object implementing the :class:`SimpleImportLog` interface to record + events occuring during the import + :param raise_on_error: optional boolean flag - default to false, indicating whether errors should + be raised or logged. You usually want them to be raised during test but to be logged in + production. + + Instances of this class are meant to import external entities through :meth:`import_entities` + which handles a stream of :class:`ExtEntity`. One may then plug arbitrary filters into the + external entities stream. + + .. automethod:: import_entities + + """ + + def __init__(self, schema, store, extid2eid=None, existing_relations=None, + etypes_order_hint=(), import_log=None, raise_on_error=False): + self.schema = schema + self.store = store + self.extid2eid = extid2eid if extid2eid is not None else {} + self.existing_relations = (existing_relations if existing_relations is not None + else defaultdict(set)) + self.etypes_order_hint = etypes_order_hint + if import_log is None: + import_log = SimpleImportLog('') + self.import_log = import_log + self.raise_on_error = raise_on_error + # set of created/updated eids + self.created = set() + self.updated = set() + + def import_entities(self, ext_entities): + """Import given external entities (:class:`ExtEntity`) stream (usually a generator).""" + # {etype: [etype dict]} of entities that are in the import queue + queue = {} + # order entity dictionaries then create/update them + deferred = self._import_entities(ext_entities, queue) + # create deferred relations that don't exist already + missing_relations = self.prepare_insert_deferred_relations(deferred) + self._warn_about_missing_work(queue, missing_relations) + + def _import_entities(self, ext_entities, queue): + extid2eid = self.extid2eid + deferred = {} # non inlined relations that may be deferred + self.import_log.record_debug('importing entities') + for ext_entity in self.iter_ext_entities(ext_entities, deferred, queue): + try: + eid = extid2eid[ext_entity.extid] + except KeyError: + self.prepare_insert_entity(ext_entity) + else: + if ext_entity.values: + self.prepare_update_entity(ext_entity, eid) + return deferred + + def iter_ext_entities(self, ext_entities, deferred, queue): + """Yield external entities in an order which attempts to satisfy + schema constraints (inlined / cardinality) and to optimize the import. + """ + schema = self.schema + extid2eid = self.extid2eid + for ext_entity in ext_entities: + # check data in the transitional representation and prepare it for + # later insertion in the database + for subject_uri, rtype, object_uri in ext_entity.prepare(schema): + deferred.setdefault(rtype, set()).add((subject_uri, object_uri)) + if not ext_entity.is_ready(extid2eid): + queue.setdefault(ext_entity.etype, []).append(ext_entity) + continue + yield ext_entity + # check for some entities in the queue that may now be ready. We'll have to restart + # search for ready entities until no one is generated + new = True + while new: + new = False + for etype in self.etypes_order_hint: + if etype in queue: + new_queue = [] + for ext_entity in queue[etype]: + if ext_entity.is_ready(extid2eid): + yield ext_entity + # may unlock entity previously handled within this loop + new = True + else: + new_queue.append(ext_entity) + if new_queue: + queue[etype][:] = new_queue + else: + del queue[etype] + + def prepare_insert_entity(self, ext_entity): + """Call the store to prepare insertion of the given external entity""" + eid = self.store.prepare_insert_entity(ext_entity.etype, **ext_entity.values) + self.extid2eid[ext_entity.extid] = eid + self.created.add(eid) + return eid + + def prepare_update_entity(self, ext_entity, eid): + """Call the store to prepare update of the given external entity""" + self.store.prepare_update_entity(ext_entity.etype, eid, **ext_entity.values) + self.updated.add(eid) + + def prepare_insert_deferred_relations(self, deferred): + """Call the store to insert deferred relations (not handled during insertion/update for + entities). Return a list of relations `[(subj ext id, obj ext id)]` that may not be inserted + because the target entities don't exists yet. + """ + prepare_insert_relation = self.store.prepare_insert_relation + rschema = self.schema.rschema + extid2eid = self.extid2eid + missing_relations = [] + for rtype, relations in deferred.items(): + self.import_log.record_debug('importing %s %s relations' % (len(relations), rtype)) + symmetric = rschema(rtype).symmetric + existing = self.existing_relations[rtype] + for subject_uri, object_uri in relations: + try: + subject_eid = extid2eid[subject_uri] + object_eid = extid2eid[object_uri] + except KeyError: + missing_relations.append((subject_uri, rtype, object_uri)) + continue + if (subject_eid, object_eid) not in existing: + prepare_insert_relation(subject_eid, rtype, object_eid) + existing.add((subject_eid, object_eid)) + if symmetric: + existing.add((object_eid, subject_eid)) + return missing_relations + + def _warn_about_missing_work(self, queue, missing_relations): + error = self.import_log.record_error + if queue: + msgs = ["can't create some entities, is there some cycle or " + "missing data?"] + for ext_entities in queue.values(): + for ext_entity in ext_entities: + msgs.append(str(ext_entity)) + map(error, msgs) + if self.raise_on_error: + raise Exception('\n'.join(msgs)) + if missing_relations: + msgs = ["can't create some relations, is there missing data?"] + for subject_uri, rtype, object_uri in missing_relations: + msgs.append("%s %s %s" % (subject_uri, rtype, object_uri)) + map(error, msgs) + if self.raise_on_error: + raise Exception('\n'.join(msgs)) + + +class SimpleImportLog(object): + """Fake CWDataImport log using a simple text format. + + Useful to display logs in the UI instead of storing them to the + database. + """ + + def __init__(self, filename): + self.logs = [] + self.filename = filename + + def record_debug(self, msg, path=None, line=None): + self._log(logging.DEBUG, msg, path, line) + + def record_info(self, msg, path=None, line=None): + self._log(logging.INFO, msg, path, line) + + def record_warning(self, msg, path=None, line=None): + self._log(logging.WARNING, msg, path, line) + + def record_error(self, msg, path=None, line=None): + self._log(logging.ERROR, msg, path, line) + + def record_fatal(self, msg, path=None, line=None): + self._log(logging.FATAL, msg, path, line) + + def _log(self, severity, msg, path, line): + encodedmsg = u'%s\t%s\t%s\t%s' % (severity, self.filename, + line or u'', msg) + self.logs.append(encodedmsg) + + +class HTMLImportLog(SimpleImportLog): + """Fake CWDataImport log using a simple HTML format.""" + def __init__(self, filename): + super(HTMLImportLog, self).__init__(xml_escape(filename)) + + def _log(self, severity, msg, path, line): + encodedmsg = u'%s\t%s\t%s\t%s
' % (severity, self.filename, + line or u'', xml_escape(msg)) + self.logs.append(encodedmsg) diff -r d4d36b583f40 -r a4fcee1e9789 dataimport/pgstore.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dataimport/pgstore.py Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,447 @@ +# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr +# +# This file is part of CubicWeb. +# +# CubicWeb is free software: you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 2.1 of the License, or (at your option) +# any later version. +# +# CubicWeb is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with CubicWeb. If not, see . +"""Postgres specific store""" + +import warnings +import cPickle +import os.path as osp +from StringIO import StringIO +from time import asctime +from datetime import date, datetime, time +from collections import defaultdict +from base64 import b64encode + +from cubicweb.utils import make_uid +from cubicweb.server.utils import eschema_eid +from cubicweb.server.sqlutils import SQL_PREFIX +from cubicweb.dataimport.stores import NoHookRQLObjectStore + + +def _execmany_thread_not_copy_from(cu, statement, data, table=None, + columns=None, encoding='utf-8'): + """ Execute thread without copy from + """ + cu.executemany(statement, data) + +def _execmany_thread_copy_from(cu, statement, data, table, + columns, encoding='utf-8'): + """ Execute thread with copy from + """ + try: + buf = _create_copyfrom_buffer(data, columns, encoding=encoding) + except ValueError: + _execmany_thread_not_copy_from(cu, statement, data) + else: + if columns is None: + cu.copy_from(buf, table, null='NULL') + else: + cu.copy_from(buf, table, null='NULL', columns=columns) + +def _execmany_thread(sql_connect, statements, dump_output_dir=None, + support_copy_from=True, encoding='utf-8'): + """ + Execute sql statement. If 'INSERT INTO', try to use 'COPY FROM' command, + or fallback to execute_many. + """ + if support_copy_from: + execmany_func = _execmany_thread_copy_from + else: + execmany_func = _execmany_thread_not_copy_from + cnx = sql_connect() + cu = cnx.cursor() + try: + for statement, data in statements: + table = None + columns = None + try: + if not statement.startswith('INSERT INTO'): + cu.executemany(statement, data) + continue + table = statement.split()[2] + if isinstance(data[0], (tuple, list)): + columns = None + else: + columns = list(data[0]) + execmany_func(cu, statement, data, table, columns, encoding) + except Exception: + print 'unable to copy data into table %s' % table + # Error in import statement, save data in dump_output_dir + if dump_output_dir is not None: + pdata = {'data': data, 'statement': statement, + 'time': asctime(), 'columns': columns} + filename = make_uid() + try: + with open(osp.join(dump_output_dir, + '%s.pickle' % filename), 'w') as fobj: + fobj.write(cPickle.dumps(pdata)) + except IOError: + print 'ERROR while pickling in', dump_output_dir, filename+'.pickle' + pass + cnx.rollback() + raise + finally: + cnx.commit() + cu.close() + + +def _copyfrom_buffer_convert_None(value, **opts): + '''Convert None value to "NULL"''' + return 'NULL' + +def _copyfrom_buffer_convert_number(value, **opts): + '''Convert a number into its string representation''' + return str(value) + +def _copyfrom_buffer_convert_string(value, **opts): + '''Convert string value. + + Recognized keywords: + :encoding: resulting string encoding (default: utf-8) + ''' + encoding = opts.get('encoding','utf-8') + escape_chars = ((u'\\', ur'\\'), (u'\t', u'\\t'), (u'\r', u'\\r'), + (u'\n', u'\\n')) + for char, replace in escape_chars: + value = value.replace(char, replace) + if isinstance(value, unicode): + value = value.encode(encoding) + return value + +def _copyfrom_buffer_convert_date(value, **opts): + '''Convert date into "YYYY-MM-DD"''' + # Do not use strftime, as it yields issue with date < 1900 + # (http://bugs.python.org/issue1777412) + return '%04d-%02d-%02d' % (value.year, value.month, value.day) + +def _copyfrom_buffer_convert_datetime(value, **opts): + '''Convert date into "YYYY-MM-DD HH:MM:SS.UUUUUU"''' + # Do not use strftime, as it yields issue with date < 1900 + # (http://bugs.python.org/issue1777412) + return '%s %s' % (_copyfrom_buffer_convert_date(value, **opts), + _copyfrom_buffer_convert_time(value, **opts)) + +def _copyfrom_buffer_convert_time(value, **opts): + '''Convert time into "HH:MM:SS.UUUUUU"''' + return '%02d:%02d:%02d.%06d' % (value.hour, value.minute, + value.second, value.microsecond) + +# (types, converter) list. +_COPYFROM_BUFFER_CONVERTERS = [ + (type(None), _copyfrom_buffer_convert_None), + ((long, int, float), _copyfrom_buffer_convert_number), + (basestring, _copyfrom_buffer_convert_string), + (datetime, _copyfrom_buffer_convert_datetime), + (date, _copyfrom_buffer_convert_date), + (time, _copyfrom_buffer_convert_time), +] + +def _create_copyfrom_buffer(data, columns=None, **convert_opts): + """ + Create a StringIO buffer for 'COPY FROM' command. + Deals with Unicode, Int, Float, Date... (see ``converters``) + + :data: a sequence/dict of tuples + :columns: list of columns to consider (default to all columns) + :converter_opts: keyword arguements given to converters + """ + # Create a list rather than directly create a StringIO + # to correctly write lines separated by '\n' in a single step + rows = [] + if columns is None: + if isinstance(data[0], (tuple, list)): + columns = range(len(data[0])) + elif isinstance(data[0], dict): + columns = data[0].keys() + else: + raise ValueError('Could not get columns: you must provide columns.') + for row in data: + # Iterate over the different columns and the different values + # and try to convert them to a correct datatype. + # If an error is raised, do not continue. + formatted_row = [] + for col in columns: + try: + value = row[col] + except KeyError: + warnings.warn(u"Column %s is not accessible in row %s" + % (col, row), RuntimeWarning) + # XXX 'value' set to None so that the import does not end in + # error. + # Instead, the extra keys are set to NULL from the + # database point of view. + value = None + for types, converter in _COPYFROM_BUFFER_CONVERTERS: + if isinstance(value, types): + value = converter(value, **convert_opts) + break + else: + raise ValueError("Unsupported value type %s" % type(value)) + # We push the value to the new formatted row + # if the value is not None and could be converted to a string. + formatted_row.append(value) + rows.append('\t'.join(formatted_row)) + return StringIO('\n'.join(rows)) + + +class SQLGenObjectStore(NoHookRQLObjectStore): + """Controller of the data import process. This version is based + on direct insertions throught SQL command (COPY FROM or execute many). + + >>> store = SQLGenObjectStore(cnx) + >>> store.create_entity('Person', ...) + >>> store.flush() + """ + + def __init__(self, cnx, dump_output_dir=None, nb_threads_statement=1): + """ + Initialize a SQLGenObjectStore. + + Parameters: + + - cnx: connection on the cubicweb instance + - dump_output_dir: a directory to dump failed statements + for easier recovery. Default is None (no dump). + """ + super(SQLGenObjectStore, self).__init__(cnx) + ### hijack default source + self.source = SQLGenSourceWrapper( + self.source, cnx.vreg.schema, + dump_output_dir=dump_output_dir) + ### XXX This is done in super().__init__(), but should be + ### redone here to link to the correct source + self.add_relation = self.source.add_relation + self.indexes_etypes = {} + if nb_threads_statement != 1: + warn('[3.21] SQLGenObjectStore is no longer threaded', DeprecationWarning) + + def flush(self): + """Flush data to the database""" + self.source.flush() + + def relate(self, subj_eid, rtype, obj_eid, **kwargs): + if subj_eid is None or obj_eid is None: + return + # XXX Could subjtype be inferred ? + self.source.add_relation(self._cnx, subj_eid, rtype, obj_eid, + self.rschema(rtype).inlined, **kwargs) + if self.rschema(rtype).symmetric: + self.source.add_relation(self._cnx, obj_eid, rtype, subj_eid, + self.rschema(rtype).inlined, **kwargs) + + def drop_indexes(self, etype): + """Drop indexes for a given entity type""" + if etype not in self.indexes_etypes: + cu = self._cnx.cnxset.cu + def index_to_attr(index): + """turn an index name to (database) attribute name""" + return index.replace(etype.lower(), '').replace('idx', '').strip('_') + indices = [(index, index_to_attr(index)) + for index in self.source.dbhelper.list_indices(cu, etype) + # Do not consider 'cw_etype_pkey' index + if not index.endswith('key')] + self.indexes_etypes[etype] = indices + for index, attr in self.indexes_etypes[etype]: + self._cnx.system_sql('DROP INDEX %s' % index) + + def create_indexes(self, etype): + """Recreate indexes for a given entity type""" + for index, attr in self.indexes_etypes.get(etype, []): + sql = 'CREATE INDEX %s ON cw_%s(%s)' % (index, etype, attr) + self._cnx.system_sql(sql) + + +########################################################################### +## SQL Source ############################################################# +########################################################################### + +class SQLGenSourceWrapper(object): + + def __init__(self, system_source, schema, + dump_output_dir=None): + self.system_source = system_source + # Explicitely backport attributes from system source + self._storage_handler = self.system_source._storage_handler + self.preprocess_entity = self.system_source.preprocess_entity + self.sqlgen = self.system_source.sqlgen + self.uri = self.system_source.uri + self.eid = self.system_source.eid + # Directory to write temporary files + self.dump_output_dir = dump_output_dir + # Allow to execute code with SQLite backend that does + # not support (yet...) copy_from + # XXX Should be dealt with in logilab.database + spcfrom = system_source.dbhelper.dbapi_module.support_copy_from + self.support_copy_from = spcfrom + self.dbencoding = system_source.dbhelper.dbencoding + self.init_statement_lists() + self._inlined_rtypes_cache = {} + self._fill_inlined_rtypes_cache(schema) + self.schema = schema + self.do_fti = False + + def _fill_inlined_rtypes_cache(self, schema): + cache = self._inlined_rtypes_cache + for eschema in schema.entities(): + for rschema in eschema.ordered_relations(): + if rschema.inlined: + cache[eschema.type] = SQL_PREFIX + rschema.type + + def init_statement_lists(self): + self._sql_entities = defaultdict(list) + self._sql_relations = {} + self._sql_inlined_relations = {} + self._sql_eids = defaultdict(list) + # keep track, for each eid of the corresponding data dict + self._sql_eid_insertdicts = {} + + def flush(self): + print 'starting flush' + _entities_sql = self._sql_entities + _relations_sql = self._sql_relations + _inlined_relations_sql = self._sql_inlined_relations + _insertdicts = self._sql_eid_insertdicts + try: + # try, for each inlined_relation, to find if we're also creating + # the host entity (i.e. the subject of the relation). + # In that case, simply update the insert dict and remove + # the need to make the + # UPDATE statement + for statement, datalist in _inlined_relations_sql.iteritems(): + new_datalist = [] + # for a given inlined relation, + # browse each couple to be inserted + for data in datalist: + keys = list(data) + # For inlined relations, it exists only two case: + # (rtype, cw_eid) or (cw_eid, rtype) + if keys[0] == 'cw_eid': + rtype = keys[1] + else: + rtype = keys[0] + updated_eid = data['cw_eid'] + if updated_eid in _insertdicts: + _insertdicts[updated_eid][rtype] = data[rtype] + else: + # could not find corresponding insert dict, keep the + # UPDATE query + new_datalist.append(data) + _inlined_relations_sql[statement] = new_datalist + _execmany_thread(self.system_source.get_connection, + self._sql_eids.items() + + _entities_sql.items() + + _relations_sql.items() + + _inlined_relations_sql.items(), + dump_output_dir=self.dump_output_dir, + support_copy_from=self.support_copy_from, + encoding=self.dbencoding) + finally: + _entities_sql.clear() + _relations_sql.clear() + _insertdicts.clear() + _inlined_relations_sql.clear() + + def add_relation(self, cnx, subject, rtype, object, + inlined=False, **kwargs): + if inlined: + _sql = self._sql_inlined_relations + data = {'cw_eid': subject, SQL_PREFIX + rtype: object} + subjtype = kwargs.get('subjtype') + if subjtype is None: + # Try to infer it + targets = [t.type for t in + self.schema.rschema(rtype).subjects()] + if len(targets) == 1: + subjtype = targets[0] + else: + raise ValueError('You should give the subject etype for ' + 'inlined relation %s' + ', as it cannot be inferred: ' + 'this type is given as keyword argument ' + '``subjtype``'% rtype) + statement = self.sqlgen.update(SQL_PREFIX + subjtype, + data, ['cw_eid']) + else: + _sql = self._sql_relations + data = {'eid_from': subject, 'eid_to': object} + statement = self.sqlgen.insert('%s_relation' % rtype, data) + if statement in _sql: + _sql[statement].append(data) + else: + _sql[statement] = [data] + + def add_entity(self, cnx, entity): + with self._storage_handler(cnx, entity, 'added'): + attrs = self.preprocess_entity(entity) + rtypes = self._inlined_rtypes_cache.get(entity.cw_etype, ()) + if isinstance(rtypes, str): + rtypes = (rtypes,) + for rtype in rtypes: + if rtype not in attrs: + attrs[rtype] = None + sql = self.sqlgen.insert(SQL_PREFIX + entity.cw_etype, attrs) + self._sql_eid_insertdicts[entity.eid] = attrs + self._append_to_entities(sql, attrs) + + def _append_to_entities(self, sql, attrs): + self._sql_entities[sql].append(attrs) + + def _handle_insert_entity_sql(self, cnx, sql, attrs): + # We have to overwrite the source given in parameters + # as here, we directly use the system source + attrs['asource'] = self.system_source.uri + self._sql_eids[sql].append(attrs) + + def _handle_is_relation_sql(self, cnx, sql, attrs): + self._append_to_entities(sql, attrs) + + def _handle_is_instance_of_sql(self, cnx, sql, attrs): + self._append_to_entities(sql, attrs) + + def _handle_source_relation_sql(self, cnx, sql, attrs): + self._append_to_entities(sql, attrs) + + # add_info is _copypasted_ from the one in NativeSQLSource. We want it + # there because it will use the _handlers of the SQLGenSourceWrapper, which + # are not like the ones in the native source. + def add_info(self, cnx, entity, source, extid): + """add type and source info for an eid into the system table""" + # begin by inserting eid/type/source/extid into the entities table + if extid is not None: + assert isinstance(extid, str) + extid = b64encode(extid) + attrs = {'type': entity.cw_etype, 'eid': entity.eid, 'extid': extid, + 'asource': source.uri} + self._handle_insert_entity_sql(cnx, self.sqlgen.insert('entities', attrs), attrs) + # insert core relations: is, is_instance_of and cw_source + try: + self._handle_is_relation_sql(cnx, 'INSERT INTO is_relation(eid_from,eid_to) VALUES (%s,%s)', + (entity.eid, eschema_eid(cnx, entity.e_schema))) + except IndexError: + # during schema serialization, skip + pass + else: + for eschema in entity.e_schema.ancestors() + [entity.e_schema]: + self._handle_is_relation_sql(cnx, + 'INSERT INTO is_instance_of_relation(eid_from,eid_to) VALUES (%s,%s)', + (entity.eid, eschema_eid(cnx, eschema))) + if 'CWSource' in self.schema and source.eid is not None: # else, cw < 3.10 + self._handle_is_relation_sql(cnx, 'INSERT INTO cw_source_relation(eid_from,eid_to) VALUES (%s,%s)', + (entity.eid, source.eid)) + # now we can update the full text index + if self.do_fti and self.need_fti_indexation(entity.cw_etype): + self.index_entity(cnx, entity=entity) diff -r d4d36b583f40 -r a4fcee1e9789 dataimport/stores.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dataimport/stores.py Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,323 @@ +# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr +# +# This file is part of CubicWeb. +# +# CubicWeb is free software: you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 2.1 of the License, or (at your option) +# any later version. +# +# CubicWeb is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with CubicWeb. If not, see . +""" +Stores are responsible to insert properly formatted entities and relations into the database. They +have the following API:: + + >>> user_eid = store.prepare_insert_entity('CWUser', login=u'johndoe') + >>> group_eid = store.prepare_insert_entity('CWUser', name=u'unknown') + >>> store.relate(user_eid, 'in_group', group_eid) + >>> store.flush() + >>> store.commit() + >>> store.finish() + +Some store **requires a flush** to copy data in the database, so if you want to have store +independant code you should explicitly call it. (There may be multiple flushes during the +process, or only one at the end if there is no memory issue). This is different from the +commit which validates the database transaction. At last, the `finish()` method should be called in +case the store requires additional work once everything is done. + +* ``prepare_insert_entity(, **kwargs) -> eid``: given an entity + type, attributes and inlined relations, return the eid of the entity to be + inserted, *with no guarantee that anything has been inserted in database*, + +* ``prepare_update_entity(, eid, **kwargs) -> None``: given an + entity type and eid, promise for update given attributes and inlined + relations *with no guarantee that anything has been inserted in database*, + +* ``prepare_insert_relation(eid_from, rtype, eid_to) -> None``: indicate that a + relation ``rtype`` should be added between entities with eids ``eid_from`` + and ``eid_to``. Similar to ``prepare_insert_entity()``, *there is no + guarantee that the relation will be inserted in database*, + +* ``flush() -> None``: flush any temporary data to database. May be called + several times during an import, + +* ``commit() -> None``: commit the database transaction, + +* ``finish() -> None``: additional stuff to do after import is terminated. + +.. autoclass:: cubicweb.dataimport.stores.RQLObjectStore +.. autoclass:: cubicweb.dataimport.stores.NoHookRQLObjectStore +.. autoclass:: cubicweb.dataimport.stores.MetaGenerator +""" +import inspect +import warnings +from datetime import datetime +from copy import copy + +from logilab.common.deprecation import deprecated +from logilab.common.decorators import cached + +from cubicweb.schema import META_RTYPES, VIRTUAL_RTYPES +from cubicweb.server.edition import EditedEntity + + +class RQLObjectStore(object): + """Store that works by making RQL queries, hence with all the cubicweb's machinery activated. + """ + + def __init__(self, cnx, commit=None): + if commit is not None: + warnings.warn('[3.19] commit argument should not be specified ' + 'as the cnx object already provides it.', + DeprecationWarning, stacklevel=2) + self._cnx = cnx + self._commit = commit or cnx.commit + # XXX 3.21 deprecated attributes + self.eids = {} + self.types = {} + + def rql(self, *args): + """Execute a RQL query. This is NOT part of the store API.""" + return self._cnx.execute(*args) + + def prepare_insert_entity(self, *args, **kwargs): + """Given an entity type, attributes and inlined relations, returns the inserted entity's + eid. + """ + entity = self._cnx.create_entity(*args, **kwargs) + self.eids[entity.eid] = entity + self.types.setdefault(args[0], []).append(entity.eid) + return entity.eid + + def prepare_update_entity(self, etype, eid, **kwargs): + """Given an entity type and eid, updates the corresponding entity with specified attributes + and inlined relations. + """ + entity = self._cnx.entity_from_eid(eid) + assert entity.cw_etype == etype, 'Trying to update with wrong type {}'.format(etype) + # XXX some inlined relations may already exists + entity.cw_set(**kwargs) + + def prepare_insert_relation(self, eid_from, rtype, eid_to, **kwargs): + """Insert into the database a relation ``rtype`` between entities with eids ``eid_from`` + and ``eid_to``. + """ + self.rql('SET X %s Y WHERE X eid %%(x)s, Y eid %%(y)s' % rtype, + {'x': int(eid_from), 'y': int(eid_to)}) + + def flush(self): + """Nothing to flush for this store.""" + pass + + def commit(self): + """Commit the database transaction.""" + return self._commit() + + @property + def session(self): + warnings.warn('[3.19] deprecated property.', DeprecationWarning, stacklevel=2) + return self._cnx.repo._get_session(self._cnx.sessionid) + + @deprecated("[3.19] use cnx.find(*args, **kwargs).entities() instead") + def find_entities(self, *args, **kwargs): + return self._cnx.find(*args, **kwargs).entities() + + @deprecated("[3.19] use cnx.find(*args, **kwargs).one() instead") + def find_one_entity(self, *args, **kwargs): + return self._cnx.find(*args, **kwargs).one() + + @deprecated('[3.21] use prepare_insert_entity instead') + def create_entity(self, *args, **kwargs): + eid = self.prepare_insert_entity(*args, **kwargs) + return self._cnx.entity_from_eid(eid) + + @deprecated('[3.21] use prepare_insert_relation instead') + def relate(self, eid_from, rtype, eid_to, **kwargs): + self.prepare_insert_relation(eid_from, rtype, eid_to, **kwargs) + + +class NoHookRQLObjectStore(RQLObjectStore): + """Store that works by accessing low-level CubicWeb's source API, with all hooks deactivated. It + must be given a metadata generator object to handle metadata which are usually handled by hooks + (see :class:`MetaGenerator`). + """ + + def __init__(self, cnx, metagen=None): + super(NoHookRQLObjectStore, self).__init__(cnx) + self.source = cnx.repo.system_source + self.rschema = cnx.repo.schema.rschema + self.add_relation = self.source.add_relation + if metagen is None: + metagen = MetaGenerator(cnx) + self.metagen = metagen + self._nb_inserted_entities = 0 + self._nb_inserted_types = 0 + self._nb_inserted_relations = 0 + # deactivate security + cnx.read_security = False + cnx.write_security = False + + def prepare_insert_entity(self, etype, **kwargs): + """Given an entity type, attributes and inlined relations, returns the inserted entity's + eid. + """ + for k, v in kwargs.iteritems(): + kwargs[k] = getattr(v, 'eid', v) + entity, rels = self.metagen.base_etype_dicts(etype) + # make a copy to keep cached entity pristine + entity = copy(entity) + entity.cw_edited = copy(entity.cw_edited) + entity.cw_clear_relation_cache() + entity.cw_edited.update(kwargs, skipsec=False) + entity_source, extid = self.metagen.init_entity(entity) + cnx = self._cnx + self.source.add_info(cnx, entity, entity_source, extid) + self.source.add_entity(cnx, entity) + kwargs = dict() + if inspect.getargspec(self.add_relation).keywords: + kwargs['subjtype'] = entity.cw_etype + for rtype, targeteids in rels.iteritems(): + # targeteids may be a single eid or a list of eids + inlined = self.rschema(rtype).inlined + try: + for targeteid in targeteids: + self.add_relation(cnx, entity.eid, rtype, targeteid, + inlined, **kwargs) + except TypeError: + self.add_relation(cnx, entity.eid, rtype, targeteids, + inlined, **kwargs) + self._nb_inserted_entities += 1 + return entity.eid + + # XXX: prepare_update_entity is inherited from RQLObjectStore, it should be reimplemented to + # actually skip hooks as prepare_insert_entity + + def prepare_insert_relation(self, eid_from, rtype, eid_to, **kwargs): + """Insert into the database a relation ``rtype`` between entities with eids ``eid_from`` + and ``eid_to``. + """ + assert not rtype.startswith('reverse_') + self.add_relation(self._cnx, eid_from, rtype, eid_to, + self.rschema(rtype).inlined) + if self.rschema(rtype).symmetric: + self.add_relation(self._cnx, eid_to, rtype, eid_from, + self.rschema(rtype).inlined) + self._nb_inserted_relations += 1 + + @property + @deprecated('[3.21] deprecated') + def nb_inserted_entities(self): + return self._nb_inserted_entities + + @property + @deprecated('[3.21] deprecated') + def nb_inserted_types(self): + return self._nb_inserted_types + + @property + @deprecated('[3.21] deprecated') + def nb_inserted_relations(self): + return self._nb_inserted_relations + + +class MetaGenerator(object): + """Class responsible for generating standard metadata for imported entities. You may want to + derive it to add application specific's metadata. + + Parameters: + * `cnx`: connection to the repository + * `baseurl`: optional base URL to be used for `cwuri` generation - default to config['base-url'] + * `source`: optional source to be used as `cw_source` for imported entities + """ + META_RELATIONS = (META_RTYPES + - VIRTUAL_RTYPES + - set(('eid', 'cwuri', + 'is', 'is_instance_of', 'cw_source'))) + + def __init__(self, cnx, baseurl=None, source=None): + self._cnx = cnx + if baseurl is None: + config = cnx.vreg.config + baseurl = config['base-url'] or config.default_base_url() + if not baseurl[-1] == '/': + baseurl += '/' + self.baseurl = baseurl + if source is None: + source = cnx.repo.system_source + self.source = source + self.create_eid = cnx.repo.system_source.create_eid + self.time = datetime.now() + # attributes/relations shared by all entities of the same type + self.etype_attrs = [] + self.etype_rels = [] + # attributes/relations specific to each entity + self.entity_attrs = ['cwuri'] + #self.entity_rels = [] XXX not handled (YAGNI?) + schema = cnx.vreg.schema + rschema = schema.rschema + for rtype in self.META_RELATIONS: + # skip owned_by / created_by if user is the internal manager + if cnx.user.eid == -1 and rtype in ('owned_by', 'created_by'): + continue + if rschema(rtype).final: + self.etype_attrs.append(rtype) + else: + self.etype_rels.append(rtype) + + @cached + def base_etype_dicts(self, etype): + entity = self._cnx.vreg['etypes'].etype_class(etype)(self._cnx) + # entity are "surface" copied, avoid shared dict between copies + del entity.cw_extra_kwargs + entity.cw_edited = EditedEntity(entity) + for attr in self.etype_attrs: + genfunc = self.generate(attr) + if genfunc: + entity.cw_edited.edited_attribute(attr, genfunc(entity)) + rels = {} + for rel in self.etype_rels: + genfunc = self.generate(rel) + if genfunc: + rels[rel] = genfunc(entity) + return entity, rels + + def init_entity(self, entity): + entity.eid = self.create_eid(self._cnx) + extid = entity.cw_edited.get('cwuri') + for attr in self.entity_attrs: + if attr in entity.cw_edited: + # already set, skip this attribute + continue + genfunc = self.generate(attr) + if genfunc: + entity.cw_edited.edited_attribute(attr, genfunc(entity)) + if isinstance(extid, unicode): + extid = extid.encode('utf-8') + return self.source, extid + + def generate(self, rtype): + return getattr(self, 'gen_%s' % rtype, None) + + def gen_cwuri(self, entity): + assert self.baseurl, 'baseurl is None while generating cwuri' + return u'%s%s' % (self.baseurl, entity.eid) + + def gen_creation_date(self, entity): + return self.time + + def gen_modification_date(self, entity): + return self.time + + def gen_created_by(self, entity): + return self._cnx.user.eid + + def gen_owned_by(self, entity): + return self._cnx.user.eid + diff -r d4d36b583f40 -r a4fcee1e9789 dataimport/test/data-massimport/schema.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dataimport/test/data-massimport/schema.py Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,154 @@ +# copyright 2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# contact http://www.logilab.fr -- mailto:contact@logilab.fr +# +# This program is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 2.1 of the License, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with this program. If not, see . + +"""cubicweb-geonames schema""" + +from yams.buildobjs import (EntityType, RelationDefinition, SubjectRelation, + String, Int, BigInt, Float, Date) +from cubicweb.schemas.base import ExternalUri + +""" +See geonames readme.txt for more details. +""" + +class TestLocation(EntityType): + """ + Entity type for location of Geonames. + See cities1000.zip, cities5000.zip, cities15000.zip and allCountries.txt + """ + name = String(maxsize=1024, indexed=True, fulltextindexed=True) + geonameid = Int(required=True, unique=True, indexed=True) + +class Location(EntityType): + """ + Entity type for location of Geonames. + See cities1000.zip, cities5000.zip, cities15000.zip and allCountries.txt + """ + name = String(maxsize=1024, indexed=True, fulltextindexed=True) + geonameid = Int(indexed=True) + asciiname = String(maxsize=200, fulltextindexed=True) + alternatenames = String(fulltextindexed=True) + names = SubjectRelation('LocationName', cardinality='**') + latitude = Float(indexed=True) + longitude = Float(indexed=True) + feature_class = String(maxsize=1, indexed=True) + feature_code = SubjectRelation('FeatureCode', cardinality='?*', inlined=True) + country = SubjectRelation('Country', cardinality='?*', inlined=True) + alternate_country_code = String(maxsize=60) + main_administrative_region = SubjectRelation('AdministrativeRegion', cardinality='?*', inlined=True) + second_administrative_region = SubjectRelation('AdministrativeRegion', cardinality='?*', inlined=True) + admin_code_1 = String(maxsize=124) + admin_code_2 = String(maxsize=124) + admin_code_3 = String(maxsize=20) + admin_code_4 = String(maxsize=20) + population = BigInt(indexed=True) + elevation = Int(indexed=True) + gtopo30 = Int(indexed=True) + timezone = SubjectRelation('TimeZone', cardinality='?*', inlined=True) + geonames_date = Date() + +class LocationName(EntityType): + """ + Name of a Location + """ + name = String(maxsize=1024, indexed=True, fulltextindexed=True) + language = SubjectRelation('Language', cardinality='?*', inlined=True) + alternatenamesid = Int(indexed=True) + +class FeatureCode(EntityType): + """ + Entity type for feature codes of Geonames. + See featureCodes_en.txt + """ + name = String(maxsize=1024, indexed=True, fulltextindexed=True) + main_code = String(maxsize=1, indexed=True) + code = String(maxsize=12) + description = String(maxsize=1024, fulltextindexed=True) + +class AdministrativeRegion(EntityType): + """ + Entity type for administrative regions of Geonames. + See admin1CodesASCII.txt and admin2Codes.txt + """ + name = String(maxsize=1024, indexed=True, fulltextindexed=True) + code = String(maxsize=64, indexed=True) + country = SubjectRelation('Country', cardinality='?*', inlined=True) + geonameid = Int(indexed=True) + asciiname = String(maxsize=200, fulltextindexed=True) + +class Language(EntityType): + """ + Entity type for languages of Geonames. + See admin1CodesASCII.txt and admin2Codes.txt + """ + name = String(maxsize=1024, indexed=True, fulltextindexed=True) + iso_639_3 = String(maxsize=3, indexed=True) + iso_639_2 = String(maxsize=64, indexed=True) + iso_639_1 = String(maxsize=3, indexed=True) + +class Continent(EntityType): + """ + Entity type for continents of geonames. + """ + name = String(maxsize=1024, indexed=True, fulltextindexed=True) + code = String(maxsize=2, indexed=True) + geonameid = Int(indexed=True) + +class Country(EntityType): + """ + Entity type for countries of geonames. + See countryInfo.txt + """ + name = String(maxsize=1024, indexed=True, fulltextindexed=True) + code = String(maxsize=2, indexed=True) + code3 = String(maxsize=3, indexed=True) + codenum = Int(indexed=True) + fips = String(maxsize=2) + capital = String(maxsize=1024, fulltextindexed=True) + area = Float(indexed=True) + population = BigInt(indexed=True) + continent_code = String(maxsize=3) + continent = SubjectRelation('Continent', cardinality='?*', inlined=True) + tld = String(maxsize=64) + currency = String(maxsize=1024, fulltextindexed=True) + currency_code = String(maxsize=64) + geonameid = Int(indexed=True) + phone = String(maxsize=64) + postal_code = String(maxsize=200) + postal_code_regex = String(maxsize=200) + languages_code = String(maxsize=200) + neighbours_code = String(maxsize=200) + equivalent_fips = String(maxsize=2) + +class TimeZone(EntityType): + """ + Entity type for timezone of geonames. + See timeZones.txt + """ + code = String(maxsize=1024, indexed=True) + gmt = Float() + dst = Float() + raw_offset = Float() + +class used_language(RelationDefinition): + subject = 'Country' + object = 'Language' + cardinality = '**' + +class neighbour_of(RelationDefinition): + subject = 'Country' + object = 'Country' + cardinality = '**' diff -r d4d36b583f40 -r a4fcee1e9789 dataimport/test/data/geonames.csv --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dataimport/test/data/geonames.csv Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,4000 @@ +3038814 Costa de Xurius Costa de Xurius 42.5 1.48333 T SLP AD 00 0 1316 Europe/Andorra 1993-12-23 +3038815 Font de la Xona Font de la Xona 42.55003 1.44986 H SPNG AD 04 0 2082 Europe/Andorra 2010-01-11 +3038816 Xixerella Xixerella 42.55327 1.48736 P PPL AD 04 0 1520 Europe/Andorra 2009-04-24 +3038817 Xixerella Xixerella Xixerella 42.55 1.48333 A ADMD AD 00 0 1548 Europe/Andorra 2011-11-05 +3038818 Riu Xic Riu Xic 42.56667 1.68333 H STM AD 00 0 2340 Europe/Andorra 1993-12-23 +3038819 Pas del Xic Pas del Xic 42.5 1.58333 R TRL AD 00 0 1888 Europe/Andorra 1993-12-23 +3038820 Roc del Xeig Roc del Xeig 42.56667 1.48333 T RK AD 00 0 1508 Europe/Andorra 1993-12-23 +3038821 Collada del Xeig Collada del Xeig 42.56667 1.48333 T PK AD 00 0 1508 Europe/Andorra 1993-12-23 +3038822 Fonts Vives Fonts Vives 42.5 1.56667 H SPNG AD 00 0 1776 Europe/Andorra 1993-12-23 +3038823 Roc de Vista Roc de Vista 42.5 1.48333 T RK AD 00 0 1316 Europe/Andorra 1993-12-23 +3038824 Obaga de Vista Obaga de Vista 42.48333 1.45 T SLP AD 00 0 1195 Europe/Andorra 1993-12-23 +3038825 Coll de Vista Coll de Vista 42.46667 1.58333 T SPUR AD 00 0 2367 Europe/Andorra 1993-12-23 +3038826 Coll de Vista Coll de Vista Coll de Vista 42.48333 1.43333 T PASS AD 00 0 1938 Europe/Andorra 2011-11-05 +3038827 Visanseny Visanseny Visanceny,Visanseny 42.56667 1.61667 L LCTY AD AD 00 0 1920 Europe/Andorra 2011-11-05 +3038828 Roc de la Vinya Roc de la Vinya 42.53333 1.56667 T RK AD 00 0 1418 Europe/Andorra 1993-12-23 +3038829 Canal de la Vinya Canal de la Vinya 42.51667 1.51667 H STM AD 00 0 1265 Europe/Andorra 1993-12-23 +3038830 Bosc de Villar Bosc de Villar 42.6 1.55 V FRST AD 00 0 2298 Europe/Andorra 1993-12-23 +3038831 Torrent de Vila Torrent de Vila 42.53333 1.56667 H STM AD 00 0 1418 Europe/Andorra 1993-12-23 +3038832 Vila Vila Casas Vila,Vila 42.53222 1.57392 P PPL AD 03 0 1418 Europe/Andorra 2011-11-05 +3038833 Basers de Vicenç Basers de Vicenc 42.48333 1.48333 T CLF AD 00 0 981 Europe/Andorra 1993-12-23 +3038834 Pla de Viàs Pla de Vias 42.58333 1.66667 T UPLD AD 00 0 2159 Europe/Andorra 1993-12-23 +3038835 Vial del Cardaire Vial del Cardaire 42.56667 1.5 L LCTY AD 00 0 1636 Europe/Andorra 1993-12-23 +3038836 Font del Vi Font del Vi 42.51667 1.48333 H SPNG AD 00 0 1839 Europe/Andorra 1993-12-23 +3038837 Font Verda Font Verda 42.55 1.56667 H SPNG AD 00 0 1828 Europe/Andorra 1993-12-23 +3038838 Costa Verda Costa Verda 42.48333 1.66667 T SLP AD 00 0 2524 Europe/Andorra 1993-12-23 +3038839 Costa Verda Costa Verda 42.48333 1.56667 T SLP AD 00 0 2231 Europe/Andorra 1993-12-23 +3038840 Serrat de Ventader Serrat de Ventader 42.48333 1.43333 T MT AD 00 0 1938 Europe/Andorra 1993-12-23 +3038841 Bony de Vellatocina Bony de Vellatocina 42.61667 1.5 T PK AD 00 0 2390 Europe/Andorra 1993-12-23 +3038842 Pleta Vella Pleta Vella 42.51667 1.61667 L GRAZ AD 00 0 2254 Europe/Andorra 1993-12-23 +3038843 Solà Vell Sola Vell 42.46667 1.48333 T SLP AD 00 0 1134 Europe/Andorra 1993-12-23 +3038844 Port Vell Port Vell 42.65 1.55 T PASS AD 00 0 2181 Europe/Andorra 1993-12-23 +3038845 Port Negre del Pallars Port Negre del Pallars Port Negre del Pallars,Port Vell 42.56667 1.45 T PASS AD 00 0 2137 Europe/Andorra 2011-11-05 +3038846 Bancal Vedeller Bancal Vedeller 42.6 1.46667 R TRL AD 00 0 2421 Europe/Andorra 1993-12-23 +3038847 Vedat del Xeig Vedat del Xeig 42.56667 1.48333 L LCTY AD 00 0 1508 Europe/Andorra 1993-12-23 +3038848 Vedat dels Plans Vedat dels Plans 42.53333 1.5 A ADMD AD 00 0 1357 Europe/Andorra 1993-12-23 +3038849 Vedat de Coll de les Cases Vedat de Coll de les Cases 42.56667 1.5 L LCTY AD 00 0 1636 Europe/Andorra 1993-12-23 +3038850 Serra del Vedat Serra del Vedat 42.46667 1.48333 T RDGE AD 00 0 1134 Europe/Andorra 1993-12-23 +3038851 Planades del Vedat Planades del Vedat 42.53333 1.5 T UPLD AD 00 0 1357 Europe/Andorra 1993-12-23 +3038852 Veda de Sorteny Veda de Sorteny 42.61667 1.55 L LCTY AD 00 0 2007 Europe/Andorra 1993-12-23 +3038853 Veda del Castellar Veda del Castellar 42.63333 1.51667 A ADMD AD 00 0 1894 Europe/Andorra 1993-12-23 +3038854 Canal de les Veces Canal de les Veces 42.51667 1.51667 H STM AD 00 0 1265 Europe/Andorra 1993-12-23 +3038855 Coma de Varilles Coma de Varilles 42.63333 1.53333 T VAL AD 00 0 2072 Europe/Andorra 1993-12-23 +3038856 Portella de les Vaques Portella de les Vaques 42.56667 1.45 T PASS AD 00 0 2137 Europe/Andorra 1993-12-23 +3038857 Pas de les Vaques Pas de les Vaques 42.58333 1.7 T PASS AD 00 0 2584 Europe/Andorra 1993-12-23 +3038858 Collada de les Vaques Collada de les Vaques 42.56667 1.56667 T PASS AD 00 0 2089 Europe/Andorra 1993-12-23 +3038859 Roc del Vaquer Roc del Vaquer 42.63333 1.48333 T CLF AD 00 0 2283 Europe/Andorra 1993-12-23 +3038860 Valls de la Coma Valls de la Coma 42.6 1.63333 L LCTY AD 00 0 1893 Europe/Andorra 1993-12-23 +3038861 Vall d'Incles Vall d'Incles 42.58386 1.66331 L LCTY AD 02 0 1867 Europe/Andorra 2010-01-11 +3038862 Vall de Soldeu Vall de Soldeu 42.55 1.68333 L LCTY AD 00 0 2254 Europe/Andorra 1993-12-23 +3038863 Riu de la Vall del Riu Riu de la Vall del Riu 42.56667 1.61667 H STM AD 00 0 1920 Europe/Andorra 1993-12-23 +3038864 Estany Gran de la Vall del Riu Estany Gran de la Vall del Riu 42.601 1.59368 H LK AD 00 0 2467 Europe/Andorra 2011-04-19 +3038865 Cascada de la Vall del Riu Cascada de la Vall del Riu 42.56667 1.61667 H FLLS AD 00 0 1920 Europe/Andorra 1993-12-23 +3038866 Canals de la Vall del Riu Canals de la Vall del Riu 42.58333 1.6 H RVN AD 00 0 1828 Europe/Andorra 1993-12-23 +3038867 Camí de la Vall del Riu Cami de la Vall del Riu 42.58333 1.61667 R TRL AD 00 0 1707 Europe/Andorra 1993-12-23 +3038868 Bosc de la Vall del Riu Bosc de la Vall del Riu 42.58333 1.61667 V FRST AD 00 0 1707 Europe/Andorra 1993-12-23 +3038869 Vall del Riu Vall del Riu 42.6 1.6 A ADMD AD 00 0 2143 Europe/Andorra 1993-12-23 +3038870 Coll de Vall Civera Coll de Vall Civera Coll de Valcibera,Coll de Vall Civera,Collado de Vall-Civera,Port de Vall Civera 42.48333 1.66667 T PASS AD 00 0 2524 Europe/Andorra 2011-11-05 +3038871 Obac de la Vall Obac de la Vall 42.46667 1.5 T SLP AD 00 0 1383 Europe/Andorra 1993-12-23 +3038872 Riu Valira d’Orient Riu Valira d'Orient Rio Balira del Orien,Riu Valira d'Orient,Riu Valira d’Orient,Río Balira del Orien 42.51667 1.53333 H STM AD 00 0 1460 Europe/Andorra 2011-11-05 +3038873 Riu Valira del Nord Riu Valira del Nord Riu Valira d'Ordino,Riu Valira del Nord,Riu Valira del Nort,Riu Valira d’Ordino,Valira del Nord,Valira del Norte 42.34645 1.44271 H STM AD 00 0 682 Europe/Andorra 2011-11-05 +3038874 Estanys de la Val del Riu Estanys de la Val del Riu 42.60138 1.59418 H LKS AD 00 0 2467 Europe/Andorra 2011-04-19 +3038875 Vaca Morta Vaca Morta 42.56667 1.76667 L LCTY AD 00 0 1674 Europe/Andorra 1993-12-23 +3038876 Riu d’ Urina Riu d' Urina 42.56667 1.58333 H STM AD 00 0 1919 Europe/Andorra 1993-12-23 +3038877 Serrat de la Uïna Serrat de la Uina 42.56667 1.51667 T RDGE AD 00 0 1500 Europe/Andorra 1993-12-23 +3038878 Obaga de la Tuta Obaga de la Tuta 42.48333 1.45 T SLP AD 00 0 1195 Europe/Andorra 1993-12-23 +3038879 Cova de la Tuta Cova de la Tuta 42.48333 1.45 S CAVE AD 00 0 1195 Europe/Andorra 1993-12-23 +3038880 Roca del Tut Roca del Tut 42.55 1.46667 T RK AD 00 0 1585 Europe/Andorra 1993-12-23 +3038881 Coll de Turer Coll de Turer 42.56667 1.46667 T PK AD 00 0 1673 Europe/Andorra 1993-12-23 +3038882 Font del Tudó Font del Tudo 42.43333 1.53333 H SPNG AD 00 0 2108 Europe/Andorra 1993-12-23 +3038883 Estany de les Truites Estany de les Truites 42.58333 1.45 H LK AD 00 0 2156 Europe/Andorra 1993-12-23 +3038884 Serra de Tristaina Serra de Tristaina Serra de Tristaina 42.65 1.48333 T RDGE AD 00 0 2341 Europe/Andorra 2011-11-05 +3038885 Riu de Tristaina Riu de Tristaina 42.61667 1.55 H STM AD 00 0 2007 Europe/Andorra 1993-12-23 +3038886 Pic de Tristaina Pic de Tristaina Pic de Triatagne,Pic de Tristagne,Pic de Tristaina,Pic des Tri-Stagnes,Tristaina 42.65265 1.49242 T PK AD AD,FR 00 0 2384 Europe/Andorra 2007-04-29 +3038887 Clot de Tres Torrents Clot de Tres Torrents 42.53333 1.53333 H RVN AD 00 0 1521 Europe/Andorra 1993-12-23 +3038888 Bony de Tres Corts Bony de Tres Corts 42.53333 1.53333 T SPUR AD 00 0 1521 Europe/Andorra 1993-12-23 +3038889 Canal dels Trèmols Canal dels Tremols 42.5 1.48333 H STM AD 00 0 1316 Europe/Andorra 1993-12-23 +3038890 Travenc Travenc 42.6 1.68333 L LCTY AD 00 0 2089 Europe/Andorra 1993-12-23 +3038891 Pleta de la Trava Pleta de la Trava 42.48333 1.61667 L GRAZ AD 00 0 2217 Europe/Andorra 1993-12-23 +3038892 Coll de la Trava Coll de la Trava 42.48333 1.46667 T SPUR AD 00 0 1148 Europe/Andorra 1993-12-23 +3038893 Canal de la Trava Canal de la Trava 42.56667 1.53333 H RVN AD 00 0 1669 Europe/Andorra 1993-12-23 +3038894 Bosc de la Trava Bosc de la Trava 42.48333 1.63333 V FRST AD 00 0 2296 Europe/Andorra 1993-12-23 +3038895 Font dels Traginers Font dels Traginers 42.43333 1.51667 H SPNG AD 00 0 2031 Europe/Andorra 1993-12-23 +3038896 Pla de les Toves Pla de les Toves 42.46667 1.45 T UPLD AD 00 0 1562 Europe/Andorra 1993-12-23 +3038897 Torrent del Tossalroi Torrent del Tossalroi 42.46667 1.51667 H STM AD 00 0 1985 Europe/Andorra 1993-12-23 +3038898 Tossal Gran Tossal Gran 42.48333 1.48333 L LCTY AD 00 0 981 Europe/Andorra 1993-12-23 +3038899 Tossalet i Vinyals Tossalet i Vinyals 42.48333 1.48333 L LCTY AD 00 0 981 Europe/Andorra 1993-12-23 +3038900 Bosc del Tossal de les Poselles Bosc del Tossal de les Poselles 42.53333 1.5 V FRST AD 00 0 1357 Europe/Andorra 1993-12-23 +3038901 Tossal Tossal 42.46667 1.48333 L LCTY AD 00 0 1134 Europe/Andorra 1993-12-23 +3038902 Tosquers Tosquers 42.56667 1.48333 T SLP AD 00 0 1508 Europe/Andorra 1993-12-23 +3038903 Canal del Tosquer Canal del Tosquer 42.56667 1.51667 H STM AD 00 0 1500 Europe/Andorra 1993-12-23 +3038904 Bosc del Tosquer Bosc del Tosquer 42.56667 1.53333 V FRST AD 00 0 1669 Europe/Andorra 1993-12-23 +3038905 Bosc del Tosquer Bosc del Tosquer 42.53333 1.6 V FRST AD 00 0 1888 Europe/Andorra 1993-12-23 +3038906 Bosc de la Tosca Bosc de la Tosca 42.43333 1.45 V FRST AD 00 0 877 Europe/Andorra 1993-12-23 +3038907 Tosa d’Incles Tosa d'Incles 42.58333 1.68333 A ADMD AD 00 0 2294 Europe/Andorra 1993-12-23 +3038908 Cap de Tosa d’Entor Cap de Tosa d'Entor 42.6 1.65 T PK AD 00 0 2131 Europe/Andorra 1993-12-23 +3038909 Tosa de les Mussoles Tosa de les Mussoles 42.61667 1.68333 L LCTY AD 00 0 2406 Europe/Andorra 1993-12-23 +3038910 Pic de la Tosa de Juclar Pic de la Tosa de Juclar 42.6 1.71667 T PK AD 00 0 2516 Europe/Andorra 1993-12-23 +3038911 Collada de la Tosa de Caraup Collada de la Tosa de Caraup 42.6 1.65 T SPUR AD 00 0 2131 Europe/Andorra 1993-12-23 +3038912 Planell de la Tosa Planell de la Tosa 42.53333 1.45 T UPLD AD 00 0 2130 Europe/Andorra 1993-12-23 +3038913 Canals de la Tosa Canals de la Tosa 42.58333 1.7 H RVN AD 00 0 2584 Europe/Andorra 1993-12-23 +3038914 Canal de la Tosa Canal de la Tosa 42.5 1.56667 H STM AD 00 0 1776 Europe/Andorra 1993-12-23 +3038915 Bosc de la Tosa Bosc de la Tosa 42.55 1.58333 V FRST AD 00 0 1499 Europe/Andorra 1993-12-23 +3038916 Canal Torta Canal Torta 42.56667 1.51667 H STM AD 00 0 1500 Europe/Andorra 1993-12-23 +3038917 Canal Torta Canal Torta 42.53333 1.53333 H STM AD 00 0 1521 Europe/Andorra 1993-12-23 +3038918 Torrent Tort Torrent Tort 42.53333 1.58333 H STM AD 00 0 1571 Europe/Andorra 1993-12-23 +3038919 Torretinyà Torretinya 42.45 1.51667 L LCTY AD 00 0 1790 Europe/Andorra 1993-12-23 +3038920 Prat d’en Torres Prat d'en Torres 42.6 1.51667 L GRAZ AD 00 0 1445 Europe/Andorra 1993-12-23 +3038921 Canals de Torrent Pregó Canals de Torrent Prego 42.48333 1.48333 H STM AD 00 0 981 Europe/Andorra 1993-12-23 +3038922 Canal de Torrentinyà Canal de Torrentinya 42.45 1.5 H STM AD 00 0 1614 Europe/Andorra 1993-12-23 +3038923 Torrentill Torrentill 42.46667 1.5 H STM AD 00 0 1383 Europe/Andorra 1993-12-23 +3038924 Camí de Torrent Forcat Cami de Torrent Forcat 42.46667 1.51667 R TRL AD 00 0 1985 Europe/Andorra 1993-12-23 +3038925 Canal del Torrent Cauber Canal del Torrent Cauber 42.6 1.51667 H RVN AD 00 0 1445 Europe/Andorra 1993-12-23 +3038926 Torre dels Soldats Torre dels Soldats Pic Monturull,Torre dels Soldats 42.45 1.58333 T PK AD 00 0 2537 Europe/Andorra 2011-11-05 +3038927 Torrapuis Torrapuis 42.53333 1.53333 L LCTY AD 00 0 1521 Europe/Andorra 1993-12-23 +3038928 Pic de Torradella Pic de Torradella 42.6 1.61667 T PK AD 00 0 2271 Europe/Andorra 1993-12-23 +3038929 Pala de la Torradella Pala de la Torradella 42.58333 1.61667 T SLP AD 00 0 1707 Europe/Andorra 1993-12-23 +3038930 Obaga de Torradella Obaga de Torradella 42.6 1.63333 T SLP AD 00 0 1893 Europe/Andorra 1993-12-23 +3038931 Canals de Torradella Canals de Torradella 42.6 1.63333 H STM AD 00 0 1893 Europe/Andorra 1993-12-23 +3038932 Borda del Torner Borda del Torner 42.58333 1.48333 S FRM AD 00 0 1809 Europe/Andorra 1993-12-23 +3038933 Planell de la Tora Planell de la Tora 42.55 1.6 T UPLD AD 00 0 2210 Europe/Andorra 1993-12-23 +3038934 Clots de la Tora Clots de la Tora 42.46667 1.58333 H RVN AD 00 0 2367 Europe/Andorra 1993-12-23 +3038935 Prat del Toni Prat del Toni 42.55 1.61667 L GRAZ AD 00 0 2206 Europe/Andorra 1993-12-23 +3038936 Molí del Tomàs Moli del Tomas 42.58333 1.65 S ML AD 00 0 1767 Europe/Andorra 1993-12-23 +3038937 Cortals de Tolse Cortals de Tolse 42.45 1.48333 S CRRL AD 00 0 1111 Europe/Andorra 1993-12-23 +3038938 Bosc de Tolse Bosc de Tolse 42.45 1.48333 V FRST AD 00 0 1111 Europe/Andorra 1993-12-23 +3038939 Tolse Tolse 42.45 1.48333 S HUTS AD 00 0 1111 Europe/Andorra 1993-12-23 +3038940 Basera dels Tolls de l’Olla Basera dels Tolls de l'Olla 42.48333 1.45 T CLF AD 00 0 1195 Europe/Andorra 1993-12-23 +3038941 Tolls de l’Olla Tolls de l'Olla 42.46667 1.56667 L LCTY AD 00 0 2365 Europe/Andorra 1993-12-23 +3038942 Torrent del Tirader Torrent del Tirader 42.53333 1.6 H STM AD 00 0 1888 Europe/Andorra 1993-12-23 +3038943 Canal del Timbarro Canal del Timbarro 42.5 1.46667 H STM AD 00 0 1678 Europe/Andorra 1993-12-23 +3038944 Terres de Serra Terres de Serra 42.48333 1.5 L LCTY AD 00 0 1631 Europe/Andorra 1993-12-23 +3038945 Terres de Sant Miguel Terres de Sant Miguel 42.5 1.58333 L LCTY AD 00 0 1888 Europe/Andorra 1993-12-23 +3038946 Terres del Torrent Pregó Terres del Torrent Prego 42.55 1.58333 L LCTY AD 00 0 1499 Europe/Andorra 1993-12-23 +3038947 Terres del Solà Terres del Sola 42.55 1.55 L LCTY AD 00 0 2097 Europe/Andorra 1993-12-23 +3038948 Terres de Jacques Terres de Jacques 42.56667 1.61667 L LCTY AD 00 0 1920 Europe/Andorra 1993-12-23 +3038949 Obaga de les Terres de Casamanya Obaga de les Terres de Casamanya 42.56667 1.55 T SLP AD 00 0 1996 Europe/Andorra 1993-12-23 +3038950 Canal del Terrer Roig Canal del Terrer Roig 42.58333 1.46667 H STM AD 00 0 1643 Europe/Andorra 1993-12-23 +3038951 Terrer Roig Terrer Roig 42.58333 1.45 L LCTY AD 00 0 2156 Europe/Andorra 1993-12-23 +3038952 Clots dels Terregalls Clots dels Terregalls 42.61667 1.61667 H STMH AD 00 0 2352 Europe/Andorra 1993-12-23 +3038953 Terregalls Terregalls 42.5 1.51667 L LCTY AD 00 0 1410 Europe/Andorra 1993-12-23 +3038954 Terra del Pou Terra del Pou 42.46667 1.48333 L LCTY AD 00 0 1134 Europe/Andorra 1993-12-23 +3038955 Terra Bogada Terra Bogada 42.46667 1.5 L LCTY AD 00 0 1383 Europe/Andorra 1993-12-23 +3038956 Canal del Teixó Canal del Teixo 42.55 1.5 H STM AD 00 0 1292 Europe/Andorra 1993-12-23 +3038957 Coma de Teix Coma de Teix 42.46667 1.46667 T SLP AD 00 0 1340 Europe/Andorra 1993-12-23 +3038958 Font de les Taules Font de les Taules 42.55 1.55 H SPNG AD 00 0 2097 Europe/Andorra 1993-12-23 +3038959 Coma Tarterosa Coma Tarterosa 42.48333 1.45 H RVN AD 00 0 1195 Europe/Andorra 1993-12-23 +3038960 Bosc de la Tarterosa Bosc de la Tarterosa 42.6 1.65 V FRST AD 00 0 2131 Europe/Andorra 1993-12-23 +3038961 Tarter Gran Tarter Gran 42.58333 1.45 L LCTY AD 00 0 2156 Europe/Andorra 1993-12-23 +3038962 Tartera Gran Tartera Gran 42.48333 1.46667 L LCTY AD 00 0 1148 Europe/Andorra 1993-12-23 +3038963 Pont del Tarter Pont del Tarter 42.58333 1.65 S BDG AD 00 0 1767 Europe/Andorra 1993-12-23 +3038964 Coll de la Tàpia Coll de la Tapia 42.46667 1.48333 T PASS AD 00 0 1134 Europe/Andorra 1993-12-23 +3038965 Canal Tancada Canal Tancada 42.48333 1.55 H STM AD 00 0 2233 Europe/Andorra 1993-12-23 +3038966 Roc del Tampuent Roc del Tampuent 42.58333 1.48333 T RK AD 00 0 1809 Europe/Andorra 1993-12-23 +3038967 Basers de les Tallades Basers de les Tallades 42.5 1.46667 T CLF AD 00 0 1678 Europe/Andorra 1993-12-23 +3038968 Bosc de la Tallada Nova Bosc de la Tallada Nova 42.58333 1.48333 V FRST AD 00 0 1809 Europe/Andorra 1993-12-23 +3038969 Camí de la Tallada Cami de la Tallada 42.48333 1.56667 R TRL AD 00 0 2231 Europe/Andorra 1993-12-23 +3038970 Canal del Tabanell Canal del Tabanell 42.56667 1.51667 H STM AD 00 0 1500 Europe/Andorra 1993-12-23 +3038971 Bosc del Tabanell Bosc del Tabanell 42.58333 1.5 V FRST AD 00 0 1595 Europe/Andorra 1993-12-23 +3038972 Suriguera Suriguera 42.58333 1.61667 T SLP AD 00 0 1707 Europe/Andorra 1993-12-23 +3038973 Sudornar Sudornar 42.58333 1.45 T SLP AD 00 0 2156 Europe/Andorra 1993-12-23 +3038974 Font del Sucre Font del Sucre 42.51667 1.46667 H SPNG AD 00 0 1840 Europe/Andorra 1993-12-23 +3038975 Costa de la Sucarana Costa de la Sucarana 42.6 1.5 T SLP AD 00 0 1923 Europe/Andorra 1993-12-23 +3038976 Canya de la Sucarana Canya de la Sucarana 42.6 1.5 T GRGE AD 00 0 1923 Europe/Andorra 1993-12-23 +3038977 Borda del Sucarana Borda del Sucarana 42.55 1.58333 S HUTS AD 00 0 1499 Europe/Andorra 1993-12-23 +3038978 Riu de Sorteny Riu de Sorteny 42.62341 1.54869 H STM AD 00 0 1950 Europe/Andorra 2011-04-19 +3038979 Pla de Sorteny Pla de Sorteny 42.61952 1.58872 T UPLD AD 00 0 2524 Europe/Andorra 2011-04-19 +3038980 Marrades de Sorteny Marrades de Sorteny 42.61667 1.55 R TRL AD 00 0 2007 Europe/Andorra 1993-12-23 +3038981 Sorteny Sorteny 42.61667 1.58333 A ADMD AD 00 0 2374 Europe/Andorra 1993-12-23 +3038982 Riu de les Soronelles Riu de les Soronelles 42.53333 1.65 H STM AD 00 0 2508 Europe/Andorra 1993-12-23 +3038983 Collada de les Soronelles Collada de les Soronelles 42.53333 1.65 T PASS AD 00 0 2508 Europe/Andorra 1993-12-23 +3038984 Pic de les Sorobilles Pic de les Sorobilles 42.56667 1.53333 T PK AD 00 0 1669 Europe/Andorra 1993-12-23 +3038985 Riu de Sornàs Riu de Sornas 42.56667 1.53333 H STM AD 00 0 1669 Europe/Andorra 1993-12-23 +3038986 Clot de Sornàs Clot de Sornas 42.56667 1.55 H RVN AD 00 0 1996 Europe/Andorra 1993-12-23 +3038987 Sornàs Sornas Sornas,Sornàs 42.5654 1.5287 P PPL AD 05 0 1514 Europe/Andorra 2011-11-05 +3038988 Riu de Soriguera Riu de Soriguera Riu de Soriguera,Riu de Suriguera 42.58333 1.61667 H STM AD AD 00 0 1707 Europe/Andorra 2011-11-05 +3038989 Solana del Soriguer Solana del Soriguer 42.56667 1.55 T SLP AD 00 0 1996 Europe/Andorra 1993-12-23 +3038990 Clot Sord Clot Sord 42.6 1.65 T CRQ AD 00 0 2131 Europe/Andorra 1993-12-23 +3038991 Solà de Soquer Sola de Soquer 42.45 1.48333 T SLP AD 00 0 1111 Europe/Andorra 1993-12-23 +3038992 Riu de Soplanàs Riu de Soplanas Riu de Soplanars,Riu de Soplanas,Riu de Soplanàs 42.58333 1.63333 H STM AD AD 00 0 1722 Europe/Andorra 2011-11-05 +3038993 Borda de Som Borda de Som 42.56667 1.58333 S HUTS AD 00 0 1919 Europe/Andorra 1993-12-23 +3038994 Roc de Solobre Roc de Solobre 42.48333 1.51667 T RKS AD 00 0 2061 Europe/Andorra 1993-12-23 +3038995 Bosc de Solobre Bosc de Solobre 42.48333 1.5 V FRST AD 00 0 1631 Europe/Andorra 1993-12-23 +3038996 Bosc del Soleador Bosc del Soleador 42.6 1.51667 V FRST AD 00 0 1445 Europe/Andorra 1993-12-23 +3038997 Camí de Soldeu Cami de Soldeu 42.58333 1.66667 R TRL AD 00 0 2159 Europe/Andorra 1993-12-23 +3038998 Bosc de Soldeu Bosc de Soldeu Bois de Soldeu,Bosc de Soldeu,Bosque de Soldeu 42.57107 1.65402 V FRST AD 00 0 1988 Europe/Andorra 2011-11-05 +3038999 Soldeu Soldeu 42.57688 1.66769 P PPL AD 02 0 2159 Europe/Andorra 2007-04-16 +3039000 Solana del Solanyó Solana del Solanyo 42.53333 1.55 T SLP AD 00 0 1344 Europe/Andorra 1993-12-23 +3039001 Riu del Solanyò Riu del Solanyo 42.53333 1.55 H STM AD 00 0 1344 Europe/Andorra 1993-12-23 +3039002 Bosc del Solanyó Bosc del Solanyo 42.55 1.45 V FRST AD 00 0 1788 Europe/Andorra 1993-12-23 +3039003 Barranc del Solanyó Barranc del Solanyo 42.55 1.45 H STM AD 00 0 1788 Europe/Andorra 1993-12-23 +3039004 Solans Solans 42.53333 1.6 L LCTY AD 00 0 1888 Europe/Andorra 1993-12-23 +3039005 Solanet de Ràmio Solanet de Ramio 42.5 1.56667 L LCTY AD 00 0 1776 Europe/Andorra 1993-12-23 +3039006 Terregalls del Solanet Terregalls del Solanet 42.63333 1.6 T RDGE AD 00 0 2635 Europe/Andorra 1993-12-23 +3039007 Bosc del Solanet Bosc del Solanet 42.55 1.48333 V FRST AD 00 0 1548 Europe/Andorra 1993-12-23 +3039008 Solanes de la Peguera Solanes de la Peguera 42.45 1.51667 A ADMD AD 00 0 1790 Europe/Andorra 1993-12-23 +3039009 Serra de les Solanelles Serra de les Solanelles 42.55 1.66667 T RDGE AD 00 0 2224 Europe/Andorra 1993-12-23 +3039010 Riu de les Solanelles Riu de les Solanelles 42.55 1.68333 H STM AD 00 0 2254 Europe/Andorra 1993-12-23 +3039011 Collet de les Solanelles Collet de les Solanelles 42.55 1.61667 T PASS AD 00 0 2206 Europe/Andorra 1993-12-23 +3039012 Collada de les Solanelles Collada de les Solanelles 42.55 1.66667 T PASS AD 00 0 2224 Europe/Andorra 1993-12-23 +3039013 Clot de les Solanelles Clot de les Solanelles 42.55 1.63333 H RVN AD 00 0 2336 Europe/Andorra 1993-12-23 +3039014 Canal de les Solanelles Canal de les Solanelles 42.55 1.63333 H STM AD 00 0 2336 Europe/Andorra 1993-12-23 +3039015 Cabana de les Solanelles Cabana de les Solanelles 42.53333 1.66667 S HUT AD 00 0 2489 Europe/Andorra 1993-12-23 +3039016 Solanelles Solanelles 42.55 1.66667 L LCTY AD 00 0 2224 Europe/Andorra 1993-12-23 +3039017 Barranc de la Solana del Pas de la Casa Barranc de la Solana del Pas de la Casa 42.53333 1.73333 H STM AD 00 0 2300 Europe/Andorra 1993-12-23 +3039018 Solana del Lloser d’Ordino Solana del Lloser d'Ordino 42.55 1.51667 L LCTY AD 00 0 1397 Europe/Andorra 1993-12-23 +3039019 Riu de la Solana del Forn Riu de la Solana del Forn 42.56154 1.67948 H STM AD 00 0 2094 Europe/Andorra 2011-04-19 +3039020 Obagot de la Solana del Forn Obagot de la Solana del Forn 42.55 1.66667 T SLP AD 00 0 2224 Europe/Andorra 1993-12-23 +3039021 Solana del Forn Solana del Forn 42.55 1.66667 A ADMD AD 00 0 2224 Europe/Andorra 1993-12-23 +3039022 Solana de l’Estall Serrer Solana de l'Estall Serrer 42.5 1.61667 A ADMD AD 00 0 2560 Europe/Andorra 1993-12-23 +3039023 Solana de les Aubes Solana de les Aubes 42.56667 1.56667 L LCTY AD 00 0 2089 Europe/Andorra 1993-12-23 +3039024 Solana de la Baronia Solana de la Baronia 42.53333 1.61667 A ADMD AD 00 0 2237 Europe/Andorra 1993-12-23 +3039025 Prats de la Solana Prats de la Solana 42.56667 1.78333 L GRAZ AD 00 0 1680 Europe/Andorra 1993-12-23 +3039026 Camí de la Solana Cami de la Solana 42.43333 1.45 R TRL AD 00 0 877 Europe/Andorra 1993-12-23 +3039027 Bosc de la Solana Bosc de la Solana 42.51667 1.46667 V FRST AD 00 0 1840 Europe/Andorra 1993-12-23 +3039028 Solà de Soldeu Sola de Soldeu 42.58333 1.66667 A ADMD AD 00 0 2159 Europe/Andorra 1993-12-23 +3039029 Serra del Solà de Sispony Serra del Sola de Sispony 42.53333 1.48333 T MT AD 00 0 1677 Europe/Andorra 1993-12-23 +3039030 Pic del Solà d’Erts Pic del Sola d'Erts 42.56667 1.5 T PK AD 00 0 1636 Europe/Andorra 1993-12-23 +3039031 Solà d’Erts Sola d'Erts 42.56667 1.5 A ADMD AD 00 0 1636 Europe/Andorra 1993-12-23 +3039032 Solà de Riambert Sola de Riambert 42.58333 1.53333 A ADMD AD 00 0 1924 Europe/Andorra 1993-12-23 +3039033 Serra del Solà de Ràmio Serra del Sola de Ramio 42.5 1.58333 T MT AD 00 0 1888 Europe/Andorra 1993-12-23 +3039034 Solà de Ràmio Sola de Ramio 42.5 1.58333 A ADMD AD 00 0 1888 Europe/Andorra 1993-12-23 +3039035 Bosc del Solà d’Envalira Bosc del Sola d'Envalira 42.55 1.68333 V FRST AD 00 0 2254 Europe/Andorra 1993-12-23 +3039036 Carena del Solà d’Engordany Carena del Sola d'Engordany 42.51667 1.55 T RDGE AD 00 0 1322 Europe/Andorra 1993-12-23 +3039037 Solá d’Engordany Sola d'Engordany 42.51667 1.53333 A ADMD AD 00 0 1460 Europe/Andorra 1993-12-23 +3039038 Solà d’Enclar Sola d'Enclar 42.51667 1.48333 A ADMD AD 00 0 1839 Europe/Andorra 1993-12-23 +3039039 Solà d’Encamp Sola d'Encamp 42.53333 1.58333 A ADMD AD 00 0 1571 Europe/Andorra 1993-12-23 +3039040 Cresta del Solà de Nadal Cresta del Sola de Nadal 42.51667 1.51667 T SPUR AD 00 0 1265 Europe/Andorra 1993-12-23 +3039041 Aspres del Solà de Nadal Aspres del Sola de Nadal 42.51667 1.51667 V VINS AD 00 0 1265 Europe/Andorra 1993-12-23 +3039042 Solà de Mossers Sola de Mossers 42.45 1.46667 A ADMD AD 00 0 935 Europe/Andorra 1993-12-23 +3039043 Solà de Mereig Sola de Mereig 42.56667 1.58333 L LCTY AD 00 0 1919 Europe/Andorra 1993-12-23 +3039044 Solà del Tarter Sola del Tarter 42.58333 1.65 A ADMD AD 00 0 1767 Europe/Andorra 1993-12-23 +3039045 Solà dels Sulls Sola dels Sulls 42.48333 1.56667 A ADMD AD 00 0 2231 Europe/Andorra 1993-12-23 +3039046 Solà dels Plans Sola dels Plans 42.58333 1.63333 A ADMD AD 00 0 1722 Europe/Andorra 1993-12-23 +3039047 Serra del Sola del Quart Mitger Serra del Sola del Quart Mitger 42.55 1.55 T RDGE AD 00 0 2097 Europe/Andorra 1993-12-23 +3039048 Solà del Quart Mitger Sola del Quart Mitger 42.55 1.53333 A ADMD AD 00 0 1593 Europe/Andorra 1993-12-23 +3039049 Solà del Pui Sola del Pui 42.55 1.51667 A ADMD AD 00 0 1397 Europe/Andorra 1993-12-23 +3039050 Cap del Solà de les Comes Cap del Sola de les Comes 42.58333 1.5 T PK AD 00 0 1595 Europe/Andorra 1993-12-23 +3039051 Canal del Solà de les Comes Canal del Sola de les Comes 42.56667 1.48333 H STM AD 00 0 1508 Europe/Andorra 1993-12-23 +3039052 Solà de la Moixella Sola de la Moixella 42.45 1.48333 A ADMD AD 00 0 1111 Europe/Andorra 1993-12-23 +3039053 Balmes del Solà de l’Allau Balmes del Sola de l'Allau 42.6 1.53333 T CLF AD 00 0 1695 Europe/Andorra 1993-12-23 +3039054 Solà de l’Aldosa Sola de l'Aldosa 42.58333 1.61667 A ADMD AD 00 0 1707 Europe/Andorra 1993-12-23 +3039055 Solà de la Farga Sola de la Farga 42.48333 1.6 A ADMD AD 00 0 2250 Europe/Andorra 1993-12-23 +3039056 Canals del Solà de Juclar Canals del Sola de Juclar 42.6 1.7 H RVN AD 00 0 2354 Europe/Andorra 1993-12-23 +3039057 Solà d’Arcavell Sola d'Arcavell Sola d'Arcabell,Sola d'Arcavell,Sola d’Arcabell,Solà d’Arcavell 42.43333 1.48333 A ADMD AD 00 0 1228 Europe/Andorra 2011-11-05 +3039058 Solà d’Andorra Sola d'Andorra 42.51667 1.5 A ADMD AD 00 0 1688 Europe/Andorra 1993-12-23 +3039059 Solà d’Aixovall Sola d'Aixovall 42.48333 1.48333 A ADMD AD 00 0 981 Europe/Andorra 1993-12-23 +3039060 Riu del Solà Riu del Sola 42.55 1.46667 H STM AD 00 0 1585 Europe/Andorra 1993-12-23 +3039061 Clot del Solà Clot del Sola 42.46667 1.46667 H RVN AD 00 0 1340 Europe/Andorra 1993-12-23 +3039062 Carrera del Solà Carrera del Sola 42.53333 1.58333 R TRL AD 00 0 1571 Europe/Andorra 1993-12-23 +3039063 Costa del Sodorn Costa del Sodorn 42.5 1.46667 T SLP AD 00 0 1678 Europe/Andorra 1993-12-23 +3039064 Pla del Socarrat Pla del Socarrat 42.55 1.6 T UPLD AD 00 0 2210 Europe/Andorra 1993-12-23 +3039065 Camí del Socarrat Cami del Socarrat 42.58333 1.63333 R TRL AD 00 0 1722 Europe/Andorra 1993-12-23 +3039066 Bosc del Socarrat Bosc del Socarrat 42.58333 1.65 V FRST AD 00 0 1767 Europe/Andorra 1993-12-23 +3039067 Vial de la Socarrada de Coll Carnisser Vial de la Socarrada de Coll Carnisser 42.58333 1.46667 R RD AD 00 0 1643 Europe/Andorra 1993-12-23 +3039068 Pala de Sobre l’Estany Pala de Sobre l'Estany 42.61667 1.71667 T CLF AD 00 0 2352 Europe/Andorra 1993-12-23 +3039069 Pala de Sobre les Basses Pala de Sobre les Basses 42.58333 1.7 T SLP AD 00 0 2584 Europe/Andorra 1993-12-23 +3039070 Basers de Sobre la Pleta Basers de Sobre la Pleta 42.6 1.46667 T CLF AD 00 0 2421 Europe/Andorra 1993-12-23 +3039071 Sobre dels Camps de la Cortinada Sobre dels Camps de la Cortinada 42.58333 1.5 A ADMD AD 00 0 1595 Europe/Andorra 1993-12-23 +3039072 Planells Sobirans Planells Sobirans 42.58333 1.46667 T UPLD AD 00 0 1643 Europe/Andorra 1993-12-23 +3039073 Riu del Sisqueró Riu del Sisquero 42.6 1.7 H STM AD 00 0 2354 Europe/Andorra 1993-12-23 +3039074 Camí del Sisquero Cami del Sisquero 42.6 1.68333 R TRL AD 00 0 2089 Europe/Andorra 1993-12-23 +3039075 Solà de Sispony Sola de Sispony 42.53333 1.48333 T SLP AD 00 0 1677 Europe/Andorra 1993-12-23 +3039076 Camí de Sispony Cami de Sispony 42.53333 1.46667 R TRL AD 00 0 1846 Europe/Andorra 1993-12-23 +3039077 Sispony Sispony 42.53355 1.51481 P PPL AD 04 0 1252 Europe/Andorra 2011-04-19 +3039078 Pletes del Siscaró Pletes del Siscaro 42.58333 1.7 L GRAZ AD 00 0 2584 Europe/Andorra 1993-12-23 +3039079 Estanys del Siscaro Estanys del Siscaro 42.58333 1.7 H LKS AD 00 0 2584 Europe/Andorra 1993-12-23 +3039080 Canals del Siscaró Canals del Siscaro 42.58333 1.7 H RVN AD 00 0 2584 Europe/Andorra 1993-12-23 +3039081 Pic de Siscarou Pic de Siscarou Pic de Siscarou,Pico de Siscarou,Siscaro,Siscaró 42.6 1.73333 T PK AD 00 0 2383 Europe/Andorra 2011-11-05 +3039082 Siscaró Siscaro 42.58333 1.71667 A ADMD AD 00 0 2553 Europe/Andorra 1993-12-23 +3039083 Marrades del Siscar Marrades del Siscar 42.58333 1.71667 R TRL AD 00 0 2553 Europe/Andorra 1993-12-23 +3039084 Canals del Siscar Canals del Siscar 42.6 1.71667 H RVN AD 00 0 2516 Europe/Andorra 1993-12-23 +3039085 Basses del Siscar Basses del Siscar 42.58333 1.71667 H LKS AD 00 0 2553 Europe/Andorra 1993-12-23 +3039086 Sincloset Sincloset 42.48333 1.5 T MT AD 00 0 1631 Europe/Andorra 1993-12-23 +3039087 Port de Siguer Port de Siguer Port de Siguer 42.65 1.56667 T PASS AD 00 0 2471 Europe/Andorra 2011-11-05 +3039088 Bosc del Sigarró Bosc del Sigarro 42.51667 1.6 V FRST AD 00 0 2085 Europe/Andorra 1993-12-23 +3039089 Canal de la Sicalma Canal de la Sicalma 42.5 1.48333 H STM AD 00 0 1316 Europe/Andorra 1993-12-23 +3039090 Portella de Satut Portella de Satut Port de Setut,Portella de Satut,Portella de Setut 42.46667 1.63333 T PK AD 00 0 2619 Europe/Andorra 2011-11-05 +3039091 Cabana de Setut Cabana de Setut 42.48333 1.63333 S HUT AD 00 0 2296 Europe/Andorra 1993-12-23 +3039092 Basses de Setut Basses de Setut 42.48333 1.65 H LKS AD 00 0 2658 Europe/Andorra 1993-12-23 +3039093 Setut Setut 42.46667 1.65 A ADMD AD 00 0 2700 Europe/Andorra 1993-12-23 +3039094 Carretera de Setúria Carretera de Seturia 42.55 1.48333 R RD AD 00 0 1548 Europe/Andorra 1993-12-23 +3039095 Camí de Setúria Cami de Seturia 42.55 1.46667 R TRL AD 00 0 1585 Europe/Andorra 1993-12-23 +3039096 Bordes de Setúria Bordes de Seturia 42.53288 1.43718 S HUTS AD 00 0 1972 Europe/Andorra 2011-04-19 +3039097 Setúria Seturia 42.55 1.43333 A ADMD AD 00 0 1949 Europe/Andorra 1993-12-23 +3039098 Tarteres de la Serrera Tarteres de la Serrera 42.61667 1.58333 T TAL AD 00 0 2374 Europe/Andorra 1993-12-23 +3039099 Riu de la Serrera Riu de la Serrera 42.61667 1.56667 H STM AD 00 0 2228 Europe/Andorra 1993-12-23 +3039100 Pleta de la Serrera Pleta de la Serrera 42.61667 1.58333 L GRAZ AD 00 0 2374 Europe/Andorra 1993-12-23 +3039101 Pic de la Serrera Pic de la Serrera Pic de Serrere,Pic de Serrère,Pic de la Serrera,Serrera 42.63333 1.6 T PK AD 00 0 2635 Europe/Andorra 2011-11-05 +3039102 Pas de la Serrera Pas de la Serrera 42.61667 1.58333 T PASS AD 00 0 2374 Europe/Andorra 1993-12-23 +3039103 Clots de la Serrera Clots de la Serrera 42.61667 1.6 H STMH AD 00 0 2528 Europe/Andorra 1993-12-23 +3039104 Aspres de la Serrera Aspres de la Serrera 42.61667 1.6 V VINS AD 00 0 2528 Europe/Andorra 1993-12-23 +3039105 Canal de Serrats Canal de Serrats 42.53333 1.5 H STM AD 00 0 1357 Europe/Andorra 1993-12-23 +3039106 Camí del Serrat Pla Cami del Serrat Pla 42.43333 1.46667 R TRL AD 00 0 1113 Europe/Andorra 1993-12-23 +3039107 Bosc del Serrat Llong Bosc del Serrat Llong 42.51667 1.48333 V FRST AD 00 0 1839 Europe/Andorra 1993-12-23 +3039108 Planell del Serrat del Tronc Planell del Serrat del Tronc 42.58333 1.61667 T UPLD AD 00 0 1707 Europe/Andorra 1993-12-23 +3039109 Cabana del Serrat de la Barracota Cabana del Serrat de la Barracota 42.48333 1.63333 S HUT AD 00 0 2296 Europe/Andorra 1993-12-23 +3039110 Pic de Serra Seca Pic de Serra Seca 42.51667 1.7 T PK AD 00 0 2435 Europe/Andorra 1993-12-23 +3039111 Canal de Serra Plana Canal de Serra Plana 42.48333 1.48333 H STM AD 00 0 981 Europe/Andorra 1993-12-23 +3039112 Riu de Serrana Riu de Serrana 42.55 1.51667 H STM AD 00 0 1397 Europe/Andorra 1993-12-23 +3039113 Pic de Serra Mitjana Pic de Serra Mitjana 42.47479 1.61523 T PK AD 00 0 2418 Europe/Andorra 2011-04-19 +3039114 Estany de Serra Mitjana Estany de Serra Mitjana 42.46667 1.6 H LK AD 00 0 2449 Europe/Andorra 1993-12-23 +3039115 Canal Ampla de Serra Mitjana Canal Ampla de Serra Mitjana 42.46667 1.61667 H STM AD 00 0 2448 Europe/Andorra 1993-12-23 +3039116 Canal de la Serradora Canal de la Serradora 42.48333 1.46667 H STM AD 00 0 1148 Europe/Andorra 1993-12-23 +3039117 Canal Serradora Canal Serradora 42.5 1.56667 H STM AD 00 0 1776 Europe/Andorra 1993-12-23 +3039118 Cap de la Serra dels Isards Cap de la Serra dels Isards 42.58333 1.58333 T PK AD 00 0 1993 Europe/Andorra 1993-12-23 +3039119 Serrat dels Serradells Serrat dels Serradells 42.61667 1.53333 T SPUR AD 00 0 1609 Europe/Andorra 1993-12-23 +3039120 Cortal de la Serra Cortal de la Serra 42.53333 1.5 S CRRL AD 00 0 1357 Europe/Andorra 1993-12-23 +3039121 Cap de la Serra Cap de la Serra 42.61667 1.6 T RDGE AD 00 0 2528 Europe/Andorra 1993-12-23 +3039122 Roc de la Senyoreta Roc de la Senyoreta 42.45 1.48333 T RK AD 00 0 1111 Europe/Andorra 1993-12-23 +3039123 Bosc de la Senyoreta Bosc de la Senyoreta 42.45 1.48333 V FRST AD 00 0 1111 Europe/Andorra 1993-12-23 +3039124 Senyal Negre Senyal Negre 42.65 1.55 T MT AD 00 0 2181 Europe/Andorra 1993-12-23 +3039125 Senyal de Missa Senyal de Missa 42.46667 1.48333 T PK AD 00 0 1134 Europe/Andorra 1993-12-23 +3039126 Roc de Senders Roc de Senders 42.5 1.53333 T RK AD 00 0 1574 Europe/Andorra 1993-12-23 +3039127 Sella Sella 42.56667 1.6 T CLF AD 00 0 1655 Europe/Andorra 1993-12-23 +3039128 Riu del Seig Riu del Seig 42.56667 1.61667 H STM AD 00 0 1920 Europe/Andorra 1993-12-23 +3039129 Canal del Seig Canal del Seig 42.61667 1.53333 H STM AD 00 0 1609 Europe/Andorra 1993-12-23 +3039130 Solà de Segudet Sola de Segudet 42.56667 1.53333 T SLP AD 00 0 1669 Europe/Andorra 1993-12-23 +3039131 Riu de Segudet Riu de Segudet 42.5583 1.54304 H STM AD 00 0 1722 Europe/Andorra 2011-04-19 +3039132 Segudet Segudet Segudet 42.55755 1.53858 P PPL AD 05 0 1556 Europe/Andorra 2011-11-05 +3039133 Estany Segon Estany Segon 42.61667 1.73333 H LK AD 00 0 2508 Europe/Andorra 1993-12-23 +3039134 Torrent del Segalars Torrent del Segalars 42.55 1.58333 H STM AD 00 0 1499 Europe/Andorra 1993-12-23 +3039135 Camí de Sedornet Cami de Sedornet 42.58333 1.51667 R TRL AD 00 0 1722 Europe/Andorra 1993-12-23 +3039136 Bordes de Sedornet Bordes de Sedornet 42.58333 1.51667 S HUTS AD 00 0 1722 Europe/Andorra 1993-12-23 +3039137 Costa Seda Costa Seda 42.48333 1.5 T SLP AD 00 0 1631 Europe/Andorra 1993-12-23 +3039138 Planells Secants Planells Secants 42.43333 1.53333 T UPLD AD 00 0 2108 Europe/Andorra 1993-12-23 +3039139 Riu Sec Riu Sec 42.51667 1.46667 H STM AD 00 0 1840 Europe/Andorra 1993-12-23 +3039140 Estany Sec Estany Sec 42.46667 1.61667 H LK AD 00 0 2448 Europe/Andorra 1993-12-23 +3039141 Borda del Savoiano Borda del Savoiano 42.56667 1.51667 S HUTS AD 00 0 1500 Europe/Andorra 1993-12-23 +3039142 Serra de la Sauvata Serra de la Sauvata 42.56667 1.58333 T RDGE AD 00 0 1919 Europe/Andorra 1993-12-23 +3039143 Costa de la Sauvata Costa de la Sauvata 42.56667 1.58333 T SLP AD 00 0 1919 Europe/Andorra 1993-12-23 +3039144 Roc del Sastre Roc del Sastre Roc del Sastra,Roc del Sastre 42.58333 1.61667 T SPUR AD AD 00 0 1707 Europe/Andorra 2011-11-05 +3039145 Pont Sassanat Pont Sassanat 42.5 1.55 S BDG AD 00 0 1566 Europe/Andorra 1993-12-23 +3039146 Saquet Saquet 42.55 1.6 L LCTY AD 00 0 2210 Europe/Andorra 1993-12-23 +3039147 Roc de Sant Vicenç Roc de Sant Vicenc 42.5 1.5 T RK AD 00 0 1135 Europe/Andorra 1993-12-23 +3039148 Collet de Sant Vicenç Collet de Sant Vicenc 42.5 1.48333 T PASS AD 00 0 1316 Europe/Andorra 1993-12-23 +3039149 Solà de Santserra Sola de Santserra 42.48333 1.46667 T SLP AD 00 0 1148 Europe/Andorra 1993-12-23 +3039150 Sant Romà de Vila Sant Roma de Vila 42.53333 1.56667 S CH AD 00 0 1418 Europe/Andorra 1993-12-23 +3039151 Sant Romà de les Bons Sant Roma de les Bons 42.53333 1.58333 S CH AD 00 0 1571 Europe/Andorra 1993-12-23 +3039152 Bosc de Sant Romà Bosc de Sant Roma 42.45 1.5 V FRST AD 00 0 1614 Europe/Andorra 1993-12-23 +3039153 Sant Romà Sant Roma 42.45 1.5 S CH AD 00 0 1614 Europe/Andorra 1993-12-23 +3039154 Sant Pere Sant Pere Sant Pere 42.57952 1.65362 P PPL AD 02 0 1767 Europe/Andorra 2011-11-05 +3039155 Sant Miquel d'Engolasters Sant Miquel d'Engolasters Sant Miquel d'Engolasters 42.51094 1.56008 S CH AD AD 07 0 1661 Europe/Andorra 2007-04-05 +3039156 Sant Miquel de Fontaneda Sant Miquel de Fontaneda Sant Miquel,Sant Miquel de Fontaneda 42.45 1.46667 S CH AD AD 00 0 935 Europe/Andorra 2011-11-05 +3039157 Solà de Sant Miquel Sola de Sant Miquel 42.58333 1.66667 T SLP AD 00 0 2159 Europe/Andorra 1993-12-23 +3039158 Roc de Sant Miquel Roc de Sant Miquel 42.58333 1.66667 T CLF AD 00 0 2159 Europe/Andorra 1993-12-23 +3039159 Drecera de Sant Martí Drecera de Sant Marti 42.48333 1.5 R TRL AD 00 0 1631 Europe/Andorra 1993-12-23 +3039160 Sant Martí Sant Marti 42.48333 1.5 T UPLD AD 00 0 1631 Europe/Andorra 1993-12-23 +3039161 Sant Martí Sant Marti 42.48333 1.48333 S RUIN AD 00 0 981 Europe/Andorra 1993-12-23 +3039162 Parròquia de Sant Julià de Lòria Parroquia de Sant Julia de Loria Parroquia de Sant Julia de Loria,Parroquia de Sant Julià de Lòria,Sant Julia,Sant Julia de Loria,Sant Julià,Sant Julià de Lòria 42.46247 1.48247 A ADM1 AD 06 9448 966 Europe/Andorra 2010-08-13 +3039163 Sant Julià de Lòria Sant Julia de Loria San Julia,San Julià,San-Dzhulija-de-Lorija,San-Khulija-de-Lorija,Sant Julia de Loria,Sant Julià de Lòria,sheng hu li ya-de luo li ya,Сан-Джулия-де-Лория,Сан-Хулия-де-Лория,サン・ジュリア・デ・ロリア教区,圣胡利娅-德洛里亚,圣胡利娅-德洛里亚 42.46372 1.49129 P PPLA AD 06 8022 1045 Europe/Andorra 2008-10-15 +3039164 Riu de Sant Josep Riu de Sant Josep 42.56419 1.75244 H STM AD 00 0 1836 Europe/Andorra 2011-04-19 +3039165 Clot de Sant Josep Clot de Sant Josep 42.56667 1.7 T CRQ AD 00 0 2375 Europe/Andorra 1993-12-23 +3039166 Sant Joan de Caselles Sant Joan de Caselles San Joan de Casettas,Sant Joan de Casellas,Sant Joan de Caselles 42.56988 1.60922 P PPL AD 02 0 1724 Europe/Andorra 2011-11-05 +3039167 Serrat de Sant Jaume Serrat de Sant Jaume 42.53333 1.6 T RDGE AD 00 0 1888 Europe/Andorra 1993-12-23 +3039168 Sant Jaume Sant Jaume 42.58333 1.63333 S CH AD 00 0 1722 Europe/Andorra 1993-12-23 +3039169 Sant Jaume Sant Jaume Sant Jaume,Sant Joums 42.53333 1.6 S CH AD AD 00 0 1888 Europe/Andorra 2011-11-05 +3039170 Sant Esteve Sant Esteve 42.43333 1.48333 S CH AD 00 0 1228 Europe/Andorra 1993-12-23 +3039171 Sant Esteve Sant Esteve 42.43333 1.45 S CH AD 00 0 877 Europe/Andorra 1993-12-23 +3039172 Sant Cristòfol Sant Cristofol 42.45 1.5 S SHRN AD 00 0 1614 Europe/Andorra 1993-12-23 +3039173 Sant Cristòfol Sant Cristofol 42.53333 1.53333 S CH AD 00 0 1521 Europe/Andorra 1993-12-23 +3039174 Solà de Sant Cerni Sola de Sant Cerni 42.46667 1.5 T SLP AD 00 0 1383 Europe/Andorra 1993-12-23 +3039175 Eglèsia de Sant Cerni Eglesia de Sant Cerni 42.56667 1.6 S CH AD 00 0 1655 Europe/Andorra 1993-12-23 +3039176 Sant Cerni Sant Cerni 42.46981 1.50133 S CH AD 00 0 1383 Europe/Andorra 2011-04-19 +3039177 Sant Antoni de la Grella Sant Antoni de la Grella 42.53333 1.53333 S CH AD 00 0 1521 Europe/Andorra 1993-12-23 +3039178 Túnels de Sant Antoni Tunels de Sant Antoni 42.51667 1.51667 R TNLS AD 00 0 1265 Europe/Andorra 1993-12-23 +3039179 Pont de Sant Antoni Pont de Sant Antoni 42.51667 1.51667 S BDG AD 00 0 1265 Europe/Andorra 1993-12-23 +3039180 Pont de Santa Creu Pont de Santa Creu 42.56667 1.6 S BDG AD 00 0 1655 Europe/Andorra 1993-12-23 +3039181 Santa Coloma Santa Coloma Santa Coloma 42.5 1.5 P PPL AD 07 0 1135 Europe/Andorra 2011-11-05 +3039182 Santa Caterina Santa Caterina 42.55 1.51667 L LCTY AD 00 0 1397 Europe/Andorra 1993-12-23 +3039183 Cortal del Sansa Cortal del Sansa 42.5 1.51667 S CRRL AD 00 0 1410 Europe/Andorra 1993-12-23 +3039184 Portella de Sanfons Portella de Sanfons Portella de Sanfons 42.56667 1.43333 T PASS AD 00 0 2402 Europe/Andorra 2011-11-05 +3039185 Pic de Sanfons Pic de Sanfons Pic de Sanfons 42.58333 1.43333 T PK AD 00 0 2412 Europe/Andorra 2011-11-05 +3039186 Roc de la Salve Roc de la Salve 42.53333 1.6 T RK AD 00 0 1888 Europe/Andorra 1993-12-23 +3039187 Bosc de la Salvata Bosc de la Salvata 42.45 1.51667 V FRST AD 00 0 1790 Europe/Andorra 1993-12-23 +3039188 Solana del Saltader Solana del Saltader 42.56667 1.53333 T SLP AD 00 0 1669 Europe/Andorra 1993-12-23 +3039189 Clot del Saltader Clot del Saltader 42.56667 1.46667 H RVN AD 00 0 1673 Europe/Andorra 1993-12-23 +3039190 Roc del Salt Roc del Salt 42.58333 1.58333 T RK AD 00 0 1993 Europe/Andorra 1993-12-23 +3039191 Clot del Salt Clot del Salt 42.58333 1.6 H RVN AD 00 0 1828 Europe/Andorra 1993-12-23 +3039192 Rius de les Salses Rius de les Salses 42.63333 1.5 H STM AD 00 0 1979 Europe/Andorra 1993-12-23 +3039193 Pont de les Salines Pont de les Salines 42.61667 1.53333 S BDG AD 00 0 1609 Europe/Andorra 1993-12-23 +3039194 Costa de les Salines Costa de les Salines 42.61667 1.53333 T SLP AD 00 0 1609 Europe/Andorra 1993-12-23 +3039195 Bosc de les Salines Bosc de les Salines 42.61667 1.53333 V FRST AD 00 0 1609 Europe/Andorra 1993-12-23 +3039196 Basses de les Salamandres Basses de les Salamandres 42.6 1.66667 H LKS AD 00 0 1858 Europe/Andorra 1993-12-23 +3039197 Costa de la Salamandra Costa de la Salamandra 42.55 1.43333 T SLP AD 00 0 1949 Europe/Andorra 1993-12-23 +3039198 Costa Salamandra Costa Salamandra 42.5 1.48333 T SLP AD 00 0 1316 Europe/Andorra 1993-12-23 +3039199 Roca de la Sabina Roca de la Sabina 42.56667 1.46667 T SLP AD 00 0 1673 Europe/Andorra 1993-12-23 +3039200 Cortal del Sabater Cortal del Sabater 42.45 1.48333 S CRRL AD 00 0 1111 Europe/Andorra 1993-12-23 +3039201 Bosc del Sabater Bosc del Sabater 42.45 1.48333 V FRST AD 00 0 1111 Europe/Andorra 1993-12-23 +3039202 Borda del Sabater Borda del Sabater 42.45 1.48333 S FRM AD 00 0 1111 Europe/Andorra 1993-12-23 +3039203 Canal dels Rulls Canal dels Rulls 42.48333 1.46667 H STM AD 00 0 1148 Europe/Andorra 1993-12-23 +3039204 Canal de Ruixol Canal de Ruixol 42.58333 1.51667 H STM AD 00 0 1722 Europe/Andorra 1993-12-23 +3039205 Torrent del Ruïder Torrent del Ruider 42.58333 1.48333 H STM AD 00 0 1809 Europe/Andorra 1993-12-23 +3039206 Roc del Ruïder Roc del Ruider 42.58333 1.48333 T SPUR AD 00 0 1809 Europe/Andorra 1993-12-23 +3039207 Pala del Ruf Pala del Ruf 42.58333 1.45 T SLP AD 00 0 2156 Europe/Andorra 1993-12-23 +3039208 Basses del Ruf Basses del Ruf 42.58333 1.45 H LKS AD 00 0 2156 Europe/Andorra 1993-12-23 +3039209 Serrat de Rudielles Serrat de Rudielles 42.5 1.45 T MT AD 00 0 1840 Europe/Andorra 1993-12-23 +3039210 Canal de Rudielles Canal de Rudielles 42.5 1.45 H STM AD 00 0 1840 Europe/Andorra 1993-12-23 +3039211 Vial de Rubials Vial de Rubials 42.48333 1.45 R RD AD 00 0 1195 Europe/Andorra 1993-12-23 +3039212 Torrent de Rubials Torrent de Rubials 42.48333 1.45 H STM AD 00 0 1195 Europe/Andorra 1993-12-23 +3039213 Solana de Rubials Solana de Rubials 42.48333 1.45 T SLP AD 00 0 1195 Europe/Andorra 1993-12-23 +3039214 Rua del Terrer Roi Rua del Terrer Roi 42.43333 1.5 L LCTY AD 00 0 1804 Europe/Andorra 1993-12-23 +3039215 Bosc de Roures Bosc de Roures 42.6 1.51667 V FRST AD 00 0 1445 Europe/Andorra 1993-12-23 +3039216 Collet de Roques Negres Collet de Roques Negres 42.45 1.45 T PASS AD 00 0 1482 Europe/Andorra 1993-12-23 +3039217 Roques Negres Roques Negres 42.45 1.45 L LCTY AD 00 0 1482 Europe/Andorra 1993-12-23 +3039218 Serrat de Roques Grosses Serrat de Roques Grosses 42.58333 1.6 T RDGE AD 00 0 1828 Europe/Andorra 1993-12-23 +3039219 Canal de Roques Blanques Canal de Roques Blanques 42.5 1.48333 H STM AD 00 0 1316 Europe/Andorra 1993-12-23 +3039220 Fontanal de les Roques Fontanal de les Roques 42.53333 1.46667 H SPNG AD 00 0 1846 Europe/Andorra 1993-12-23 +3039221 Pleta de les Romes Pleta de les Romes 42.65 1.55 L GRAZ AD 00 0 2181 Europe/Andorra 1993-12-23 +3039222 Font Roja Font Roja 42.55 1.45 H SPNG AD 00 0 1788 Europe/Andorra 1993-12-23 +3039223 Font Roja Font Roja 42.48333 1.5 H SPNG AD 00 0 1631 Europe/Andorra 1993-12-23 +3039224 Bassa Roja Bassa Roja 42.6 1.66667 H LK AD 00 0 1858 Europe/Andorra 1993-12-23 +3039225 Grau Roig Grau Roig 42.58333 1.46667 T SLP AD 00 0 1643 Europe/Andorra 1993-12-23 +3039226 Borda de Roig Borda de Roig 42.56667 1.58333 S HUT AD 00 0 1919 Europe/Andorra 1993-12-23 +3039227 Fonts Roges Fonts Roges 42.56667 1.46667 H SPNG AD 00 0 1673 Europe/Andorra 1993-12-23 +3039228 Fonts Roges Fonts Roges 42.55 1.65 H SPNG AD 00 0 2432 Europe/Andorra 1993-12-23 +3039229 Canals Roges Canals Roges 42.58333 1.71667 H RVN AD 00 0 2553 Europe/Andorra 1993-12-23 +3039230 Basses Roges Basses Roges 42.46667 1.55 H LKS AD 00 0 2341 Europe/Andorra 1993-12-23 +3039231 Font Rodona Font Rodona 42.55 1.41667 H SPNG AD 00 0 2105 Europe/Andorra 1993-12-23 +3039232 Costa Rodona Costa Rodona 42.65 1.48333 T SLP AD 00 0 2341 Europe/Andorra 1993-12-23 +3039233 Costa Rodona Costa Rodona 42.58333 1.45 T SLP AD 00 0 2156 Europe/Andorra 1993-12-23 +3039234 Costa Rodona Costa Rodona 42.55 1.71667 T SLP AD 00 0 2192 Europe/Andorra 1993-12-23 +3039235 Boïga Rodona Boiga Rodona 42.43333 1.53333 V CULT AD 00 0 2108 Europe/Andorra 1993-12-23 +3039236 Bosc del Ródol Bosc del Rodol 42.48882 1.57683 V FRST AD 00 0 2246 Europe/Andorra 2011-04-19 +3039237 Turó Rodó Turo Rodo 42.56667 1.55 T PK AD 00 0 1996 Europe/Andorra 1993-12-23 +3039238 Roc Rodó Roc Rodo 42.56667 1.48333 T SPUR AD 00 0 1508 Europe/Andorra 1993-12-23 +3039239 Roc Rodó Roc Rodo 42.56667 1.43333 T SPUR AD 00 0 2402 Europe/Andorra 1993-12-23 +3039240 Pla de Rodó Pla de Rodo 42.55 1.43333 T UPLD AD 00 0 1949 Europe/Andorra 1993-12-23 +3039241 Estany Rodó Estany Rodo 42.51667 1.68333 H LK AD 00 0 2352 Europe/Andorra 1993-12-23 +3039242 Estany Rodó Estany Rodo 42.5 1.65 H LK AD 00 0 2542 Europe/Andorra 1993-12-23 +3039243 Bony Rodó Bony Rodo 42.61667 1.55 T SPUR AD 00 0 2007 Europe/Andorra 1993-12-23 +3039244 Rocs Tous Rocs Tous 42.55 1.58333 L LCTY AD 00 0 1499 Europe/Andorra 1993-12-23 +3039245 Rocs Negres Rocs Negres 42.53333 1.61667 A ADMD AD 00 0 2237 Europe/Andorra 1993-12-23 +3039246 Planell del Roc Gros Planell del Roc Gros 42.58333 1.48333 T UPLD AD 00 0 1809 Europe/Andorra 1993-12-23 +3039247 Bosc del Roc Gros Bosc del Roc Gros 42.58333 1.48333 V FRST AD 00 0 1809 Europe/Andorra 1993-12-23 +3039248 Serra del Roc del Rellotge Serra del Roc del Rellotge 42.61667 1.58333 T MT AD 00 0 2374 Europe/Andorra 1993-12-23 +3039249 Font del Roc del Porquer Font del Roc del Porquer 42.6 1.45 H SPNG AD 00 0 2174 Europe/Andorra 1993-12-23 +3039250 Canal del Roc de la Grael Canal del Roc de la Grael 42.51667 1.53333 H STM AD 00 0 1460 Europe/Andorra 1993-12-23 +3039251 Roca Podrida Roca Podrida 42.55 1.51667 L LCTY AD 00 0 1397 Europe/Andorra 1993-12-23 +3039252 Costa de Roca Negra Costa de Roca Negra 42.58333 1.58333 T SLP AD 00 0 1993 Europe/Andorra 1993-12-23 +3039253 Canal de Rocanegra Canal de Rocanegra 42.5 1.46667 H STM AD 00 0 1678 Europe/Andorra 1993-12-23 +3039254 Canal de Roca Major Canal de Roca Major 42.43333 1.5 H RVN AD 00 0 1804 Europe/Andorra 1993-12-23 +3039255 Planell de la Roca Grossa Planell de la Roca Grossa 42.56667 1.7 T UPLD AD 00 0 2375 Europe/Andorra 1993-12-23 +3039256 Planell de Roca Grossa Planell de Roca Grossa 42.55 1.66667 T UPLD AD 00 0 2224 Europe/Andorra 1993-12-23 +3039257 Canal de Rocafort Canal de Rocafort 42.46667 1.48333 H STM AD 00 0 1134 Europe/Andorra 1993-12-23 +3039258 Rocafort Rocafort 42.46667 1.48333 A ADMD AD 00 0 1134 Europe/Andorra 1993-12-23 +3039259 Solana de la Roca de la Sabina Solana de la Roca de la Sabina 42.56667 1.46667 T SLP AD 00 0 1673 Europe/Andorra 1993-12-23 +3039260 Canal de la Roca Blanca Canal de la Roca Blanca 42.51667 1.51667 H STM AD 00 0 1265 Europe/Andorra 1993-12-23 +3039261 Vial de la Roca Vial de la Roca 42.55 1.6 R RD AD 00 0 2210 Europe/Andorra 1993-12-23 +3039262 Pala de la Roca Pala de la Roca 42.55 1.61667 T SLP AD 00 0 2206 Europe/Andorra 1993-12-23 +3039263 Bosc de la Roca Bosc de la Roca 42.55 1.46667 V FRST AD 00 0 1585 Europe/Andorra 1993-12-23 +3039264 Pont del Riu Montaner Pont del Riu Montaner 42.53333 1.51667 S BDG AD 00 0 1361 Europe/Andorra 1993-12-23 +3039265 Camí del Riu del Seig Cami del Riu del Seig 42.56667 1.6 R TRL AD 00 0 1655 Europe/Andorra 1993-12-23 +3039266 Riu del Seig Riu del Seig 42.56667 1.61667 A ADMD AD 00 0 1920 Europe/Andorra 1993-12-23 +3039267 Forat del Riu dels Clots de Massat Forat del Riu dels Clots de Massat 42.55 1.68333 H RVN AD 00 0 2254 Europe/Andorra 1993-12-23 +3039268 Fonts del Riu de les Cebes Fonts del Riu de les Cebes 42.61667 1.58333 H SPNG AD 00 0 2374 Europe/Andorra 1993-12-23 +3039269 Costa del Riu de les Cebes Costa del Riu de les Cebes 42.61667 1.58333 T SLP AD 00 0 2374 Europe/Andorra 1993-12-23 +3039270 Collada del Riu de les Cebes Collada del Riu de les Cebes 42.61667 1.58333 T SPUR AD 00 0 2374 Europe/Andorra 1993-12-23 +3039271 Bony del Riu de les Cebes Bony del Riu de les Cebes 42.61667 1.58333 T RK AD 00 0 2374 Europe/Andorra 1993-12-23 +3039272 Prats del Riu Prats del Riu 42.46667 1.5 L GRAZ AD 00 0 1383 Europe/Andorra 1993-12-23 +3039273 Canal de Rita Canal de Rita 42.53333 1.6 H STM AD 00 0 1888 Europe/Andorra 1993-12-23 +3039274 Solà del Riguer Sola del Riguer 42.5 1.55 T SLP AD 00 0 1566 Europe/Andorra 1993-12-23 +3039275 Obaga del Riguer Obaga del Riguer 42.48333 1.53333 T SLP AD 00 0 2255 Europe/Andorra 1993-12-23 +3039276 Bordes de Rigoder Bordes de Rigoder 42.53333 1.61667 S HUTS AD 00 0 2237 Europe/Andorra 1993-12-23 +3039277 Bosc de les Ribes Bosc de les Ribes 42.55 1.55 V FRST AD 00 0 2097 Europe/Andorra 1993-12-23 +3039278 Riberal d’Envalira Riberal d'Envalira 42.53333 1.7 L LCTY AD 00 0 2357 Europe/Andorra 1993-12-23 +3039279 Canals de Ribera Canals de Ribera 42.43333 1.48333 H STM AD 00 0 1228 Europe/Andorra 1993-12-23 +3039280 Ribassot Ribassot 42.58333 1.48333 L LCTY AD 00 0 1809 Europe/Andorra 1993-12-23 +3039281 Torrent de Ribassols Torrent de Ribassols 42.58333 1.48333 H STM AD 00 0 1809 Europe/Andorra 1993-12-23 +3039282 Torrent Ribal Torrent Ribal 42.58333 1.48333 H STM AD 00 0 1809 Europe/Andorra 1993-12-23 +3039283 Tosa de Riba Escorjada Tosa de Riba Escorjada 42.55 1.65 T UPLD AD 00 0 2432 Europe/Andorra 1993-12-23 +3039284 Solanelles de Riba Escorjada Solanelles de Riba Escorjada 42.55 1.63333 T SLP AD 00 0 2336 Europe/Andorra 1993-12-23 +3039285 Planells de Riba Escorjada Planells de Riba Escorjada 42.56667 1.63333 T UPLD AD 00 0 2016 Europe/Andorra 1993-12-23 +3039286 Camí de Riba Escorjada Cami de Riba Escorjada 42.56667 1.63333 R TRL AD 00 0 2016 Europe/Andorra 1993-12-23 +3039287 Camí de Riba Escorjada Cami de Riba Escorjada 42.55 1.6 R TRL AD 00 0 2210 Europe/Andorra 1993-12-23 +3039288 Riba Escorjada Riba Escorjada 42.55 1.63333 A ADMD AD 00 0 2336 Europe/Andorra 1993-12-23 +3039289 Bosc de Riba Bosc de Riba 42.55 1.58333 V FRST AD 00 0 1499 Europe/Andorra 1993-12-23 +3039290 Bosc del Riambert Bosc del Riambert 42.56667 1.51667 V FRST AD 00 0 1500 Europe/Andorra 1993-12-23 +3039291 Riu de Rialb Riu de Rialb Riu de Rialb,Riu de Rialp 42.61667 1.53333 H STM AD AD 00 0 1609 Europe/Andorra 2011-11-05 +3039292 Portella de Rialb Portella de Rialb 42.63333 1.53333 T PASS AD 00 0 2072 Europe/Andorra 1993-12-23 +3039293 Basera de Rialb Basera de Rialb 42.65 1.56667 T CLF AD 00 0 2471 Europe/Andorra 1993-12-23 +3039294 Rialb Rialb 42.65 1.55 A ADMD AD 00 0 2181 Europe/Andorra 1993-12-23 +3039295 Pala de Rep Pala de Rep 42.55 1.6 T SLP AD 00 0 2210 Europe/Andorra 1993-12-23 +3039296 Coll del Rep Coll del Rep 42.45 1.46667 T PASS AD 00 0 935 Europe/Andorra 1993-12-23 +3039297 Cap de Rep Cap de Rep Cap de Rep,Cap de l' Ovella,Cap de l’ Ovella 42.54325 1.61092 T PK AD 00 0 2213 Europe/Andorra 2011-11-05 +3039298 Rep Rep 42.53333 1.58333 A ADMD AD 00 0 1571 Europe/Andorra 1993-12-23 +3039299 Roc del Rellotge Roc del Rellotge 42.61667 1.56667 T SPUR AD 00 0 2228 Europe/Andorra 1993-12-23 +3039300 Roc del Rellotge Roc del Rellotge 42.56667 1.61667 T RK AD 00 0 1920 Europe/Andorra 1993-12-23 +3039301 Font de les Reïneres Font de les Reineres 42.6 1.68333 H SPNG AD 00 0 2089 Europe/Andorra 1993-12-23 +3039302 Solana de la Regalíssia Solana de la Regalissia 42.48333 1.41667 T SLP AD 00 0 1920 Europe/Andorra 1993-12-23 +3039303 Obaga de Redort Obaga de Redort 42.55 1.56667 T SLP AD 00 0 1828 Europe/Andorra 1993-12-23 +3039304 Redort Redort 42.56667 1.55 L LCTY AD 00 0 1996 Europe/Andorra 1993-12-23 +3039305 Clot de la Rectoria Clot de la Rectoria 42.51667 1.5 H RVN AD 00 0 1688 Europe/Andorra 1993-12-23 +3039306 Serrat del Rec d’Areny Serrat del Rec d'Areny 42.58333 1.46667 T SPUR AD 00 0 1643 Europe/Andorra 1993-12-23 +3039307 Bosc de Rèbols Bosc de Rebols 42.46667 1.51667 V FRST AD 00 0 1985 Europe/Andorra 1993-12-23 +3039308 Pont de la Rebollissa Pont de la Rebollissa 42.61667 1.53333 S BDG AD 00 0 1609 Europe/Andorra 1993-12-23 +3039309 Llanesques de les Rebes Llanesques de les Rebes 42.63333 1.61667 T CLF AD 00 0 2541 Europe/Andorra 1993-12-23 +3039310 Clot de les Rebes Clot de les Rebes 42.61667 1.61667 H RVN AD 00 0 2352 Europe/Andorra 1993-12-23 +3039311 Rebaixant del Maià Rebaixant del Maia 42.56667 1.73333 L LCTY AD 00 0 2096 Europe/Andorra 1993-12-23 +3039312 Canal de la Rata Canal de la Rata 42.58333 1.46667 H RVN AD 00 0 1643 Europe/Andorra 1993-12-23 +3039313 Port de Rat Port de Rat Port de Rat,Port de Rat du D'Auzat 42.62127 1.47371 T PASS AD FR,AD 07 0 2442 Europe/Andorra 2007-03-04 +3039314 Bosc de Rasets Bosc de Rasets 42.43333 1.53333 V FRST AD 00 0 2108 Europe/Andorra 1993-12-23 +3039315 Rasa de Perafita Rasa de Perafita 42.48333 1.58333 T UPLD AD 00 0 2349 Europe/Andorra 1993-12-23 +3039316 Costa Rasa Costa Rasa 42.46667 1.45 T SLP AD 00 0 1562 Europe/Andorra 1993-12-23 +3039317 Bosc de la Rasa Bosc de la Rasa 42.46667 1.53333 V FRST AD 00 0 2332 Europe/Andorra 1993-12-23 +3039318 Presa de Ransol Presa de Ransol 42.58333 1.63333 S DAM AD 00 0 1722 Europe/Andorra 1993-12-23 +3039319 Carretera de Ransol Carretera de Ransol 42.58333 1.65 R RD AD 00 0 1767 Europe/Andorra 1993-12-23 +3039320 Ransol Ransol 42.58137 1.63812 P PPL AD 02 0 1727 Europe/Andorra 2007-04-16 +3039321 Roca de Ràmio Roca de Ramio 42.5 1.56667 T RK AD 00 0 1776 Europe/Andorra 1993-12-23 +3039322 Ràmio Ramio 42.49702 1.57414 S HUTS AD 00 0 1776 Europe/Andorra 2011-04-19 +3039323 Canal del Ramer Canal del Ramer 42.56667 1.48333 H RVN AD 00 0 1508 Europe/Andorra 1993-12-23 +3039324 Canal de la Ramenada Canal de la Ramenada 42.5 1.51667 H STM AD 00 0 1410 Europe/Andorra 1993-12-23 +3039325 Camí Ral Cami Ral 42.55 1.58333 R TRL AD 00 0 1499 Europe/Andorra 1993-12-23 +3039326 Camí Ral Cami Ral 42.53333 1.58333 R TRL AD 00 0 1571 Europe/Andorra 1993-12-23 +3039327 Radonella Radonella 42.48333 1.45 L LCTY AD 00 0 1195 Europe/Andorra 1993-12-23 +3039328 Rádio Andorra Radio Andorra 42.5282 1.57019 S STNR AD 00 0 1418 Europe/Andorra 2011-04-19 +3039329 Racons Racons 42.56667 1.58333 A ADMD AD 00 0 1919 Europe/Andorra 1993-12-23 +3039330 Pic de la Raconada de la Maiana Pic de la Raconada de la Maiana Pic de la Raconada de la Maiana 42.46667 1.61667 T PK AD 00 0 2448 Europe/Andorra 2011-11-05 +3039331 Clots de la Raconada de la Maiana Clots de la Raconada de la Maiana 42.46667 1.6 T CRQS AD 00 0 2449 Europe/Andorra 1993-12-23 +3039332 Pic de Racofred Pic de Racofred Pic de Racofred,Pic de Racofret 42.6 1.45 T PK AD 00 0 2174 Europe/Andorra 2011-11-05 +3039333 Racó de l’Estany de Cabana Sorda Raco de l'Estany de Cabana Sorda 42.61667 1.66667 L LCTY AD 00 0 2536 Europe/Andorra 1993-12-23 +3039334 Pleta del Racó Pleta del Raco 42.61667 1.56667 L GRAZ AD 00 0 2228 Europe/Andorra 1993-12-23 +3039335 Pleta del Racó Pleta del Raco 42.58333 1.45 L GRAZ AD 00 0 2156 Europe/Andorra 1993-12-23 +3039336 Canal del Racó Canal del Raco 42.56667 1.48333 H RVN AD 00 0 1508 Europe/Andorra 1993-12-23 +3039337 Bassa del Racó Bassa del Raco 42.61667 1.5 H LK AD 00 0 2390 Europe/Andorra 1993-12-23 +3039338 Pleta de la Rabassa Pleta de la Rabassa 42.63333 1.55 L GRAZ AD 00 0 2053 Europe/Andorra 1993-12-23 +3039339 Carretera de la Rabassa Carretera de la Rabassa 42.43333 1.51667 R RD AD 00 0 2031 Europe/Andorra 1993-12-23 +3039340 Canya de la Rabassa Canya de la Rabassa 42.63333 1.55 S CAVE AD 00 0 2053 Europe/Andorra 1993-12-23 +3039341 Bosc de la Rabassa Bosc de la Rabassa 42.4379 1.51425 V FRST AD 00 0 1990 Europe/Andorra 2011-04-19 +3039342 Solana del Querol Solana del Querol 42.58333 1.53333 T SLP AD 00 0 1924 Europe/Andorra 1993-12-23 +3039343 Riu del Querol Riu del Querol 42.58333 1.66667 H STM AD 00 0 2159 Europe/Andorra 1993-12-23 +3039344 Riu del Querol Riu del Querol 42.58333 1.53333 H STM AD 00 0 1924 Europe/Andorra 1993-12-23 +3039345 Pleta del Querol Pleta del Querol 42.6 1.66667 L GRAZ AD 00 0 1858 Europe/Andorra 1993-12-23 +3039346 Estanyó del Querol Estanyo del Querol 42.61303 1.67019 H LK AD 00 0 2355 Europe/Andorra 2011-04-19 +3039347 Serrat de la Quera Serrat de la Quera 42.51667 1.51667 T RDGE AD 00 0 1265 Europe/Andorra 1993-12-23 +3039348 Canal Gran de la Quera Canal Gran de la Quera 42.45 1.46667 H STM AD 00 0 935 Europe/Andorra 1993-12-23 +3039349 Bosc de la Quera Bosc de la Quera 42.51667 1.51667 V FRST AD 00 0 1265 Europe/Andorra 1993-12-23 +3039350 Roc del Quer Roc del Quer 42.61667 1.55 T SPUR AD 00 0 2007 Europe/Andorra 1993-12-23 +3039351 Roc del Quer Roc del Quer 42.55 1.51667 T SPUR AD 00 0 1397 Europe/Andorra 1993-12-23 +3039352 Roc del Quer Roc del Quer 42.58333 1.48333 T RK AD 00 0 1809 Europe/Andorra 1993-12-23 +3039353 Roc del Quer Roc del Quer 42.52798 1.60146 T RK AD 00 0 1888 Europe/Andorra 2011-04-19 +3039354 Roc del Quer Roc del Quer 42.56667 1.6 T CLF AD 00 0 1655 Europe/Andorra 1993-12-23 +3039355 Roc de Quer Roc de Quer 42.48333 1.46667 T RK AD 00 0 1148 Europe/Andorra 1993-12-23 +3039356 Planell del Quer Planell del Quer 42.63333 1.56667 T UPLD AD 00 0 2394 Europe/Andorra 1993-12-23 +3039357 Canal del Quer Canal del Quer 42.63333 1.55 H RVN AD 00 0 2053 Europe/Andorra 1993-12-23 +3039358 Canal del Quer Canal del Quer 42.51667 1.6 H RVN AD 00 0 2085 Europe/Andorra 1993-12-23 +3039359 Bosc del Quer Bosc del Quer 42.51667 1.6 V FRST AD 00 0 2085 Europe/Andorra 1993-12-23 +3039360 Solà del Quart de Nagol Sola del Quart de Nagol 42.48333 1.51667 T SLP AD 00 0 2061 Europe/Andorra 1993-12-23 +3039361 Collet Purgat Collet Purgat 42.46667 1.48333 T PK AD 00 0 1134 Europe/Andorra 1993-12-23 +3039363 Pont de Puntal Pont de Puntal 42.61667 1.55 S BDG AD 00 0 2007 Europe/Andorra 1993-12-23 +3039364 Bosc de Puntal Bosc de Puntal 42.63333 1.55 V FRST AD 00 0 2053 Europe/Andorra 1993-12-23 +3039365 Puntal Puntal 42.63333 1.55 L LCTY AD 00 0 2053 Europe/Andorra 1993-12-23 +3039366 Vial dels Pujols Vial dels Pujols 42.48333 1.48333 R RD AD 00 0 981 Europe/Andorra 1993-12-23 +3039367 Tarteres dels Pujols Tarteres dels Pujols 42.48333 1.48333 T TAL AD 00 0 981 Europe/Andorra 1993-12-23 +3039368 Roc del Pujol Roc del Pujol 42.46667 1.5 T RK AD 00 0 1383 Europe/Andorra 1993-12-23 +3039369 Pujant de Donges Pujant de Donges 42.45 1.5 L LCTY AD 00 0 1614 Europe/Andorra 1993-12-23 +3039370 Puiol del Piu Puiol del Piu 42.56667 1.5 P PPL AD 04 0 1636 Europe/Andorra 1993-12-23 +3039371 Borda del Puigcernal Borda del Puigcernal 42.55 1.58333 S HUT AD 00 0 1499 Europe/Andorra 1993-12-23 +3039372 Pui d’Olivesa Pui d'Olivesa 42.45 1.48333 L LCTY AD 00 0 1111 Europe/Andorra 1993-12-23 +3039373 Pui d’Encamp Pui d'Encamp 42.53333 1.56667 L LCTY AD 00 0 1418 Europe/Andorra 1993-12-23 +3039374 Estany Primer Estany Primer 42.63721 1.49019 H LK AD 05 0 2254 Europe/Andorra 2010-01-12 +3039375 Estany Primer Estany Primer 42.61667 1.71667 H LK AD 00 0 2352 Europe/Andorra 1993-12-23 +3039376 Estany Primer Estany Primer 42.51667 1.68333 H LK AD 00 0 2352 Europe/Andorra 1993-12-23 +3039377 Canal de la Presa Canal de la Presa 42.58333 1.63333 H CNL AD 00 0 1722 Europe/Andorra 1993-12-23 +3039378 Canal de la Premsa Canal de la Premsa 42.46667 1.48333 H STM AD 00 0 1134 Europe/Andorra 1993-12-23 +3039379 Canal Pregona Canal Pregona 42.56667 1.48333 H STM AD 00 0 1508 Europe/Andorra 1993-12-23 +3039380 Canal Pregona Canal Pregona 42.55 1.5 H STM AD 00 0 1292 Europe/Andorra 1993-12-23 +3039381 Torrent Pregó Torrent Prego 42.53333 1.58333 H STM AD 00 0 1571 Europe/Andorra 1993-12-23 +3039382 Bosc dels Prats Sobirans Bosc dels Prats Sobirans 42.51667 1.46667 V FRST AD 00 0 1840 Europe/Andorra 1993-12-23 +3039383 Planells dels Prats Nous Planells dels Prats Nous 42.58333 1.48333 T UPLD AD 00 0 1809 Europe/Andorra 1993-12-23 +3039384 Bordes dels Prats Nous Bordes dels Prats Nous 42.58333 1.48333 S HUTS AD 00 0 1809 Europe/Andorra 1993-12-23 +3039385 Riu de Prats Riu de Prats 42.55 1.58333 H STM AD 00 0 1499 Europe/Andorra 1993-12-23 +3039386 Prats Prats 42.56003 1.59396 P PPL AD 02 0 1677 Europe/Andorra 2007-04-16 +3039387 Solana de Prat Primer Solana de Prat Primer 42.48333 1.55 T SLP AD 00 0 2233 Europe/Andorra 1993-12-23 +3039388 Planell de Prat Primer Planell de Prat Primer 42.48333 1.55 T UPLD AD 00 0 2233 Europe/Andorra 1993-12-23 +3039389 Obaga de Prat Primer Obaga de Prat Primer 42.48333 1.55 T SLP AD 00 0 2233 Europe/Andorra 1993-12-23 +3039390 Font de Prat Primer Font de Prat Primer 42.48333 1.55 H SPNG AD 00 0 2233 Europe/Andorra 1993-12-23 +3039391 Collada de Prat Primer Collada de Prat Primer 42.46667 1.55 T PASS AD 00 0 2341 Europe/Andorra 1993-12-23 +3039392 Clots de Prat Primer Clots de Prat Primer 42.48333 1.55 H RVN AD 00 0 2233 Europe/Andorra 1993-12-23 +3039393 Prat Primer Prat Primer 42.48333 1.55 A ADMD AD 00 0 2233 Europe/Andorra 1993-12-23 +3039394 Collada de Prat Porceller Collada de Prat Porceller Collada de Prat Porceller 42.46667 1.45 T PASS AD 00 0 1562 Europe/Andorra 2011-11-05 +3039395 Font del Prat de Roca Font del Prat de Roca 42.56667 1.58333 H SPNG AD 00 0 1919 Europe/Andorra 1993-12-23 +3039396 Font del Prat dels Pollins Font del Prat dels Pollins 42.56667 1.58333 H SPNG AD 00 0 1919 Europe/Andorra 1993-12-23 +3039397 Basers del Prat del Quart Basers del Prat del Quart 42.61667 1.63333 T CLF AD 00 0 2331 Europe/Andorra 1993-12-23 +3039398 Font del Prat del Jep Font del Prat del Jep Font del Prat del Gep,Font del Prat del Jep 42.56667 1.58333 H SPNG AD AD 00 0 1919 Europe/Andorra 2011-11-05 +3039399 Torrent del Prat del Gaspar Torrent del Prat del Gaspar 42.53333 1.56667 H STM AD 00 0 1418 Europe/Andorra 1993-12-23 +3039400 Bosc del Prat de l’Estel Bosc del Prat de l'Estel 42.53333 1.46667 V FRST AD 00 0 1846 Europe/Andorra 1993-12-23 +3039401 Riu del Prat del Comellar Riu del Prat del Comellar 42.58333 1.65 H STM AD 00 0 1767 Europe/Andorra 1993-12-23 +3039402 Solana del Prat del Bosc Solana del Prat del Bosc 42.58333 1.46667 T SLP AD 00 0 1643 Europe/Andorra 1993-12-23 +3039403 Riu del Prat del Bosc Riu del Prat del Bosc 42.55 1.48333 H STM AD 00 0 1548 Europe/Andorra 1993-12-23 +3039404 Pont del Prat del Bosc Pont del Prat del Bosc 42.53333 1.46667 S BDG AD 00 0 1846 Europe/Andorra 1993-12-23 +3039405 Bosc del Prat del Bosc Bosc del Prat del Bosc 42.53333 1.46667 V FRST AD 00 0 1846 Europe/Andorra 1993-12-23 +3039406 Obagues del Prat de la Posella Obagues del Prat de la Posella 42.48333 1.45 T SLP AD 00 0 1195 Europe/Andorra 1993-12-23 +3039407 Basera del Prat de la Farga Basera del Prat de la Farga 42.48333 1.45 T CLF AD 00 0 1195 Europe/Andorra 1993-12-23 +3039408 Basers del Prat de la Creu Basers del Prat de la Creu 42.6 1.63333 T CLF AD 00 0 1893 Europe/Andorra 1993-12-23 +3039409 Obaga dels Pradets Obaga dels Pradets 42.48333 1.43333 T SLP AD 00 0 1938 Europe/Andorra 1993-12-23 +3039410 Roc dels Pous Roc dels Pous 42.55 1.61667 T RK AD 00 0 2206 Europe/Andorra 1993-12-23 +3039411 Bosc dels Pous Bosc dels Pous 42.55 1.48333 V FRST AD 00 0 1548 Europe/Andorra 1993-12-23 +3039412 Serrat del Pouet Serrat del Pouet 42.55 1.51667 T RDGE AD 00 0 1397 Europe/Andorra 1993-12-23 +3039413 Canal del Pouet Canal del Pouet 42.56667 1.53333 H STM AD 00 0 1669 Europe/Andorra 1993-12-23 +3039414 Costa del Pou Costa del Pou 42.58333 1.58333 T SLP AD 00 0 1993 Europe/Andorra 1993-12-23 +3039415 Bosc de les Poselletes Bosc de les Poselletes 42.55 1.45 V FRST AD 00 0 1788 Europe/Andorra 1993-12-23 +3039416 Bony de la Posella Bony de la Posella 42.58333 1.48333 T SPUR AD 00 0 1809 Europe/Andorra 1993-12-23 +3039417 Posada dels Pastors Posada dels Pastors 42.58333 1.48333 L LCTY AD 00 0 1809 Europe/Andorra 1993-12-23 +3039418 Font de la Posada Font de la Posada 42.46667 1.45 H SPNG AD 00 0 1562 Europe/Andorra 1993-12-23 +3039419 Serrat de la Posa Serrat de la Posa 42.55 1.66667 T RDGE AD 00 0 2224 Europe/Andorra 1993-12-23 +3039420 Turó del Port Vell Turo del Port Vell 42.65 1.56667 T PK AD 00 0 2471 Europe/Andorra 1993-12-23 +3039421 Pic del Port Vell Pic del Port Vell Pic del Port Vell 42.57205 1.44341 T PK AD 00 0 2655 2305 Europe/Andorra 2011-02-09 +3039422 Canal del Port Vell Canal del Port Vell 42.56667 1.45 H STM AD 00 0 2137 Europe/Andorra 1993-12-23 +3039423 Clot de Port Negre Clot de Port Negre 42.46667 1.56667 H RVN AD 00 0 2365 Europe/Andorra 1993-12-23 +3039424 Basers de les Portes Basers de les Portes 42.48333 1.5 T CLF AD 00 0 1631 Europe/Andorra 1993-12-23 +3039425 Portella de la Portelleta Portella de la Portelleta 42.46667 1.65 T PASS AD 00 0 2700 Europe/Andorra 1993-12-23 +3039426 Tossa Plana de Lles Tossa Plana de Lles Pic de la Portelleta,Tosal Plane,Tossa Plana de Lles 42.46667 1.66667 T PK AD 00 0 2559 Europe/Andorra 2011-11-05 +3039427 Font de la Portelleta Font de la Portelleta 42.46667 1.66667 H SPNG AD 00 0 2559 Europe/Andorra 1993-12-23 +3039428 Collada de la Portelleta Collada de la Portelleta Collada de la Portelleta 42.46667 1.66667 T PASS AD 00 0 2559 Europe/Andorra 2011-11-05 +3039429 Riu de les Portelles Riu de les Portelles 42.61667 1.63333 H STM AD 00 0 2331 Europe/Andorra 1993-12-23 +3039430 Clots de la Portella de Setut Clots de la Portella de Setut 42.46667 1.63333 T CRQS AD 00 0 2619 Europe/Andorra 1993-12-23 +3039431 Pleta de la Portella Pleta de la Portella 42.56667 1.71667 L GRAZ AD 00 0 2219 Europe/Andorra 1993-12-23 +3039432 Collada de la Portella Collada de la Portella 42.46667 1.63333 T PASS AD 00 0 2619 Europe/Andorra 1993-12-23 +3039433 Riu del Port Dret Riu del Port Dret 42.6 1.46667 H STM AD 00 0 2421 Europe/Andorra 1993-12-23 +3039434 Estany del Port Dret Estany del Port Dret 42.6 1.46667 H LK AD 00 0 2421 Europe/Andorra 1993-12-23 +3039435 Costa del Port Dret Costa del Port Dret 42.58333 1.7 T SLP AD 00 0 2584 Europe/Andorra 1993-12-23 +3039436 Clots del Port Dret Clots del Port Dret 42.56667 1.68333 H RVN AD 00 0 2340 Europe/Andorra 1993-12-23 +3039437 Camí del Port Dret Cami del Port Dret 42.56667 1.66667 R TRL AD 00 0 1938 Europe/Andorra 1993-12-23 +3039439 Camí del Port de Setut Cami del Port de Setut 42.46667 1.63333 R TRL AD 00 0 2619 Europe/Andorra 1993-12-23 +3039440 Basses del Port de Rat Basses del Port de Rat 42.61667 1.48333 H LKS AD 05 0 2470 Europe/Andorra 2010-01-12 +3039441 Font del Port de Cabús Font del Port de Cabus 42.55 1.41667 H SPNG AD 00 0 2105 Europe/Andorra 1993-12-23 +3039442 Planades del Port Planades del Port 42.56667 1.45 T UPLD AD 00 0 2137 Europe/Andorra 1993-12-23 +3039443 Costa del Port Costa del Port 42.56667 1.45 T SLP AD 00 0 2137 Europe/Andorra 1993-12-23 +3039444 Costa del Port Costa del Port 42.53333 1.71667 T SLP AD 00 0 2400 Europe/Andorra 1993-12-23 +3039445 Clots del Port Clots del Port 42.46667 1.58333 T CRQS AD 00 0 2367 Europe/Andorra 1993-12-23 +3039446 Clot del Port Clot del Port 42.48333 1.65 H RVN AD 00 0 2658 Europe/Andorra 1993-12-23 +3039447 Canal del Port Canal del Port 42.56667 1.45 H STM AD 00 0 2137 Europe/Andorra 1993-12-23 +3039448 Camí del Port Cami del Port 42.48333 1.58333 R TRL AD 00 0 2349 Europe/Andorra 1993-12-23 +3039449 Roc del Porquer Roc del Porquer 42.58333 1.45 T SPUR AD 00 0 2156 Europe/Andorra 1993-12-23 +3039450 Oratori del Pont d’Aixovall Oratori del Pont d'Aixovall 42.48333 1.5 S AMTH AD 00 0 1631 Europe/Andorra 1993-12-23 +3039451 Canal del Pont Canal del Pont 42.5 1.55 H STM AD 00 0 1566 Europe/Andorra 1993-12-23 +3039452 Riu Pollós Riu Pollos 42.58333 1.46667 H STM AD 00 0 1643 Europe/Andorra 1993-12-23 +3039453 Bosc de la Pollentia Bosc de la Pollentia 42.53333 1.5 V FRST AD 00 0 1357 Europe/Andorra 1993-12-23 +3039454 Roc del Poll Roc del Poll 42.61667 1.53333 T RK AD 00 0 1609 Europe/Andorra 1993-12-23 +3039455 Roc de Podoïna Roc de Podoina 42.45 1.5 T RK AD 00 0 1614 Europe/Andorra 1993-12-23 +3039456 Canal del Pletiu Canal del Pletiu 42.5 1.58333 H STM AD 00 0 1888 Europe/Andorra 1993-12-23 +3039457 Serrat de les Pletes Serrat de les Pletes 42.48333 1.43333 T SPUR AD 00 0 1938 Europe/Andorra 1993-12-23 +3039458 Serrat de la Pleta Vella Serrat de la Pleta Vella 42.6 1.55 T RDGE AD 00 0 2298 Europe/Andorra 1993-12-23 +3039459 Canal de Pleta Mosquera Canal de Pleta Mosquera 42.61667 1.51667 H STM AD 00 0 1716 Europe/Andorra 1993-12-23 +3039460 Canal de la Pleta dels Llacs Canal de la Pleta dels Llacs 42.6 1.63333 H STM AD 00 0 1893 Europe/Andorra 1993-12-23 +3039461 Solana de la Pleta del Perro Solana de la Pleta del Perro 42.53333 1.61667 T SLP AD 00 0 2237 Europe/Andorra 1993-12-23 +3039462 Canals de la Pleta del Llomar Canals de la Pleta del Llomar 42.61667 1.56667 H RVN AD 00 0 2228 Europe/Andorra 1993-12-23 +3039463 Bony de la Pleta de Jan Bony de la Pleta de Jan 42.61667 1.63333 T MT AD 00 0 2331 Europe/Andorra 1993-12-23 +3039464 Roc de la Pleta Roc de la Pleta 42.6 1.46667 T RK AD 00 0 2421 Europe/Andorra 1993-12-23 +3039465 Costa de la Pleta Costa de la Pleta 42.58333 1.45 T SLP AD 00 0 2156 Europe/Andorra 1993-12-23 +3039466 Bosc de la Pleta Bosc de la Pleta 42.55 1.45 V FRST AD 00 0 1788 Europe/Andorra 1993-12-23 +3039467 Barraca de la Pleta Barraca de la Pleta 42.56667 1.71667 S HUT AD 00 0 2219 Europe/Andorra 1993-12-23 +3039468 Camí dels Plans Cami dels Plans 42.58333 1.61667 R TRL AD 00 0 1707 Europe/Andorra 1993-12-23 +3039469 Camí dels Plans Cami dels Plans 42.53333 1.51667 R TRL AD 00 0 1361 Europe/Andorra 1993-12-23 +3039470 Bosc dels Plans Bosc dels Plans 42.58333 1.63333 V FRST AD 00 0 1722 Europe/Andorra 1993-12-23 +3039471 Bordes dels Plans Bordes dels Plans 42.53333 1.51667 S FRM AD 00 0 1361 Europe/Andorra 1993-12-23 +3039472 Obaga dels Plannels de la Regalíssia Obaga dels Plannels de la Regalissia 42.48333 1.41667 T SLP AD 00 0 1920 Europe/Andorra 1993-12-23 +3039473 Planes de Fels Planes de Fels 42.58333 1.53333 L LCTY AD 00 0 1924 Europe/Andorra 1993-12-23 +3039474 Solana de les Planes Solana de les Planes 42.56667 1.53333 T SLP AD 00 0 1669 Europe/Andorra 1993-12-23 +3039475 Riu de les Planes Riu de les Planes 42.63333 1.5 H STM AD 00 0 1979 Europe/Andorra 1993-12-23 +3039476 Pleta de les Planes Pleta de les Planes 42.65 1.5 L GRAZ AD 00 0 2455 Europe/Andorra 1993-12-23 +3039477 Pic de l' Albeille Pic de l' Albeille Pic de les Planes 42.6457 1.49929 T RDGE AD FR,AD 07 0 2542 Europe/Andorra 2007-03-04 +3039478 Les Planes Les Planes 42.56667 1.55 T UPLD AD 00 0 1996 Europe/Andorra 1993-12-23 +3039479 Collet de les Planes Collet de les Planes 42.56667 1.53333 T SPUR AD 00 0 1669 Europe/Andorra 1993-12-23 +3039480 Collada de les Planes Collada de les Planes 42.65 1.5 T PASS AD 00 0 2455 Europe/Andorra 1993-12-23 +3039481 Bosc de les Planes Bosc de les Planes 42.51667 1.6 V FRST AD 00 0 2085 Europe/Andorra 1993-12-23 +3039482 Bony de les Planes Bony de les Planes 42.55 1.51667 T SPUR AD 00 0 1397 Europe/Andorra 1993-12-23 +3039483 Serrat dels Planells Grans Serrat dels Planells Grans 42.53333 1.53333 T RDGE AD 00 0 1521 Europe/Andorra 1993-12-23 +3039484 Cabana dels Planells de Rialb Cabana dels Planells de Rialb 42.65 1.55 S HUT AD 00 0 2181 Europe/Andorra 1993-12-23 +3039485 Planells de Rialb Planells de Rialb 42.65 1.55 L LCTY AD 00 0 2181 Europe/Andorra 1993-12-23 +3039486 Riu dels Planells de Caraup Riu dels Planells de Caraup 42.6 1.63333 H STM AD 00 0 1893 Europe/Andorra 1993-12-23 +3039487 Planells d’Arcalís Planells d'Arcalis 42.63333 1.5 L LCTY AD 00 0 1979 Europe/Andorra 1993-12-23 +3039488 Serrat del Planell Lluent Serrat del Planell Lluent 42.56667 1.51667 T RDGE AD 00 0 1500 Europe/Andorra 1993-12-23 +3039489 Bony del Planell Gran Bony del Planell Gran 42.63333 1.55 T SPUR AD 00 0 2053 Europe/Andorra 1993-12-23 +3039490 Bosc de Planavilla Bosc de Planavilla 42.55 1.68333 V FRST AD 00 0 2254 Europe/Andorra 1993-12-23 +3039491 Planavilla Planavilla 42.55 1.68333 L CLG AD 00 0 2254 Europe/Andorra 1993-12-23 +3039492 Bosc de la Planassa Bosc de la Planassa 42.55 1.5 V FRST AD 00 0 1292 Europe/Andorra 1993-12-23 +3039493 Bosc de Plana en Blanca Bosc de Plana en Blanca 42.55 1.56667 V FRST AD 00 0 1828 Europe/Andorra 1993-12-23 +3039494 Tarteres de Plana de Gral Tarteres de Plana de Gral 42.58333 1.48333 T TAL AD 00 0 1809 Europe/Andorra 1993-12-23 +3039495 Tosa Plana Tosa Plana 42.46667 1.6 T UPLD AD 00 0 2449 Europe/Andorra 1993-12-23 +3039496 Torrent de la Plana Torrent de la Plana 42.53333 1.6 H STM AD 00 0 1888 Europe/Andorra 1993-12-23 +3039497 Serra Plana Serra Plana 42.58333 1.6 T SPUR AD 00 0 1828 Europe/Andorra 1993-12-23 +3039498 Serra Plana Serra Plana 42.56667 1.48333 T MT AD 00 0 1508 Europe/Andorra 1993-12-23 +3039499 Sierra Plana Sierra Plana Serra Plana,Sierra Plana 42.48333 1.43333 T MT AD 00 0 1938 Europe/Andorra 2011-11-05 +3039500 Cortal de la Plana Cortal de la Plana 42.48333 1.53333 S HUT AD 00 0 2255 Europe/Andorra 1993-12-23 +3039501 Coll de la Plana Coll de la Plana 42.45 1.5 T SPUR AD 00 0 1614 Europe/Andorra 1993-12-23 +3039502 Camí de la Plana Cami de la Plana 42.48333 1.55 R TRL AD 00 0 2233 Europe/Andorra 1993-12-23 +3039503 Bosquet de la Plana Bosquet de la Plana 42.5 1.53333 V FRST AD 00 0 1574 Europe/Andorra 1993-12-23 +3039504 Bosc de la Plana Bosc de la Plana 42.55 1.55 V FRST AD 00 0 2097 Europe/Andorra 1993-12-23 +3039505 Bordes de la Plana Bordes de la Plana 42.53333 1.6 S HUTS AD 00 0 1888 Europe/Andorra 1993-12-23 +3039506 Borda de la Plana Borda de la Plana 42.55 1.55 S HUTS AD 00 0 2097 Europe/Andorra 1993-12-23 +3039507 Barranc de la Plana Barranc de la Plana 42.55 1.55 H STM AD 00 0 2097 Europe/Andorra 1993-12-23 +3039508 Serrat del Pla Morell Serrat del Pla Morell 42.53333 1.53333 T RDGE AD 00 0 1521 Europe/Andorra 1993-12-23 +3039509 Torrent de Plamanera Torrent de Plamanera 42.53333 1.56667 H STM AD 00 0 1418 Europe/Andorra 1993-12-23 +3039510 Bosc del Pla de Rodó Bosc del Pla de Rodo 42.55 1.43333 V FRST AD 00 0 1949 Europe/Andorra 1993-12-23 +3039511 Bosc del Pla de Miretes Bosc del Pla de Miretes 42.53333 1.48333 V FRST AD 00 0 1677 Europe/Andorra 1993-12-23 +3039512 Pic del Pla de l’Ingla Pic del Pla de l'Ingla 42.48333 1.63333 T PK AD 00 0 2296 Europe/Andorra 1993-12-23 +3039513 Pla de l’Ingla Pla de l'Ingla 42.48333 1.63333 A ADMD AD 00 0 2296 Europe/Andorra 1993-12-23 +3039514 Riu del Pla de l’Estany Riu del Pla de l'Estany 42.58333 1.46667 H STM AD 00 0 1643 Europe/Andorra 1993-12-23 +3039515 Pleta del Pla de l’Estany Pleta del Pla de l'Estany 42.58333 1.46667 L GRAZ AD 00 0 1643 Europe/Andorra 1993-12-23 +3039516 Pic des Bareytes Pic des Bareytes Pic del Pla de l'Estany,Pic del Pla de l’Estany,Pic des Bareytes 42.6 1.46667 T PK AD 00 0 2421 Europe/Andorra 2011-11-05 +3039517 Estret del Pla de l’Estany Estret del Pla de l'Estany 42.6 1.45 T PASS AD 00 0 2174 Europe/Andorra 1993-12-23 +3039518 Pla de l’Estany Pla de l'Estany 42.6 1.45 A ADMD AD 00 0 2174 Europe/Andorra 1993-12-23 +3039519 Camí del Pla de les Pedres Cami del Pla de les Pedres 42.53333 1.68333 R TRL AD 00 0 2322 Europe/Andorra 1993-12-23 +3039520 Camí del Pla del Bosc Cami del Pla del Bosc 42.53333 1.61667 R TRL AD 00 0 2237 Europe/Andorra 1993-12-23 +3039521 Bosc del Pla de la Cot Bosc del Pla de la Cot 42.53333 1.46667 V FRST AD 00 0 1846 Europe/Andorra 1993-12-23 +3039522 Grau de les Places Grau de les Places 42.55 1.46667 T SLP AD 00 0 1585 Europe/Andorra 1993-12-23 +3039523 Pleta de Pixolell Pleta de Pixolell 42.58333 1.63333 L GRAZ AD 00 0 1722 Europe/Andorra 1993-12-23 +3039524 Costes de Pixolell Costes de Pixolell 42.58333 1.63333 T SLP AD 00 0 1722 Europe/Andorra 1993-12-23 +3039525 Pont de la Pixistella Pont de la Pixistella 42.56667 1.5 S BDG AD 00 0 1636 Europe/Andorra 1993-12-23 +3039526 Obac de la Pixistella Obac de la Pixistella 42.55 1.5 T SLP AD 00 0 1292 Europe/Andorra 1993-12-23 +3039527 Canal de la Pixistella Canal de la Pixistella 42.55 1.5 H STM AD 00 0 1292 Europe/Andorra 1993-12-23 +3039528 Bosc de la Pixistella Bosc de la Pixistella 42.55 1.48333 V FRST AD 00 0 1548 Europe/Andorra 1993-12-23 +3039529 Font Pixadera Font Pixadera 42.5 1.56667 H SPNG AD 00 0 1776 Europe/Andorra 1993-12-23 +3039530 Roca del Pisó Roca del Piso 42.53333 1.63333 T RK AD 00 0 2360 Europe/Andorra 1993-12-23 +3039531 Borda del Pirot Borda del Pirot 42.58333 1.65 S HUT AD 00 0 1767 Europe/Andorra 1993-12-23 +3039532 Pirineu Pirineu 42.51667 1.55 L LCTY AD 00 0 1322 Europe/Andorra 1993-12-23 +3039533 Bosc de la Pinosa de Llumeneres Bosc de la Pinosa de Llumeneres 42.46667 1.51667 V FRST AD 00 0 1985 Europe/Andorra 1993-12-23 +3039534 Bosc de la Pinosa Bosc de la Pinosa 42.6 1.68333 V FRST AD 00 0 2089 Europe/Andorra 1993-12-23 +3039535 Bosc de la Pinosa Bosc de la Pinosa 42.45 1.5 V FRST AD 00 0 1614 Europe/Andorra 1993-12-23 +3039536 Serrat Pinós Serrat Pinos 42.55 1.68333 T MT AD 00 0 2254 Europe/Andorra 1993-12-23 +3039537 Collada de Pimes Collada de Pimes 42.42951 1.54658 T PASS AD 00 0 2186 Europe/Andorra 2011-04-19 +3039538 Canal del Pi Gros Canal del Pi Gros 42.5 1.46667 H STM AD 00 0 1678 Europe/Andorra 1993-12-23 +3039539 Borda del Piedro Borda del Piedro 42.58333 1.63333 S HUT AD 00 0 1722 Europe/Andorra 1993-12-23 +3039540 Bosc del Pi de Montsalla Bosc del Pi de Montsalla 42.53333 1.48333 V FRST AD 00 0 1677 Europe/Andorra 1993-12-23 +3039541 Camí del Pi de la Creu Cami del Pi de la Creu 42.55 1.6 R TRL AD 00 0 2210 Europe/Andorra 1993-12-23 +3039542 Canal dels Picons Canal dels Picons 42.56667 1.5 H STM AD 00 0 1636 Europe/Andorra 1993-12-23 +3039543 Bosc del Picó Bosc del Pico 42.5 1.55 V FRST AD 00 0 1566 Europe/Andorra 1993-12-23 +3039544 Basers del Pic de la Cabaneta Basers del Pic de la Cabaneta 42.61667 1.6 T CLF AD 00 0 2528 Europe/Andorra 1993-12-23 +3039545 Font Picadora Font Picadora 42.56667 1.56667 H SPNG AD 00 0 2089 Europe/Andorra 1993-12-23 +3039546 Canal de la Pica Canal de la Pica 42.5 1.5 H STM AD 00 0 1135 Europe/Andorra 1993-12-23 +3039547 Bony de la Pica Bony de la Pica Bony de la Pica,Pic d' Os,Pic d’ Ós,Pico de Ancla,Pico de Anclá 42.5 1.45 T MT AD 00 0 1840 Europe/Andorra 2011-11-05 +3039548 Basses del Pic Basses del Pic 42.61667 1.61667 H LKS AD 00 0 2352 Europe/Andorra 1993-12-23 +3039549 Bosc del Peu dels Pessons Bosc del Peu dels Pessons 42.51667 1.68333 V FRST AD 00 0 2352 Europe/Andorra 1993-12-23 +3039550 Font dels Pets Font dels Pets 42.58333 1.48333 H SPNG AD 00 0 1809 Europe/Andorra 1993-12-23 +3039551 Coll Petit Coll Petit Coll Petit,Collado Pequeno,Collado Pequeño 42.56498 1.44248 T PASS AD 00 0 2408 Europe/Andorra 2011-11-05 +3039552 Riu dels Pessons Riu dels Pessons 42.51667 1.7 H STM AD 00 0 2435 Europe/Andorra 1993-12-23 +3039553 Pic dels Pessons Pic dels Pessons Pic de Pessons,Pic dels Pessons,Pic des Pessons 42.50832 1.6585 T PK AD 00 0 2727 Europe/Andorra 2011-11-05 +3039554 Collada dels Pessons Collada dels Pessons 42.5 1.65 T PASS AD 00 0 2542 Europe/Andorra 1993-12-23 +3039555 Pleta dels Pescadors Pleta dels Pescadors 42.48333 1.65 L GRAZ AD 00 0 2658 Europe/Andorra 1993-12-23 +3039556 Pesada de Pal Pesada de Pal 42.56667 1.48333 L LCTY AD 00 0 1508 Europe/Andorra 1993-12-23 +3039557 Pont de Pesada Pont de Pesada 42.56667 1.48333 S BDG AD 00 0 1508 Europe/Andorra 1993-12-23 +3039558 Canal de Pesada Canal de Pesada 42.56667 1.48333 H STM AD 00 0 1508 Europe/Andorra 1993-12-23 +3039559 Basera de Pesada Basera de Pesada 42.56667 1.48333 T CLF AD 00 0 1508 Europe/Andorra 1993-12-23 +3039560 Pesada Pesada 42.56667 1.48333 T SLP AD 00 0 1508 Europe/Andorra 1993-12-23 +3039561 Roc de Persoma Roc de Persoma 42.48333 1.48333 T RK AD 00 0 981 Europe/Andorra 1993-12-23 +3039562 Plana Perdiguera Plana Perdiguera 42.55 1.45 T UPLD AD 00 0 1788 Europe/Andorra 1993-12-23 +3039563 Pic de Percanela Pic de Percanela 42.58915 1.49666 T PK AD 00 0 2089 Europe/Andorra 2011-04-19 +3039564 Bordes de Percanela Bordes de Percanela 42.5825 1.48809 S FRM AD 00 0 2019 Europe/Andorra 2011-04-19 +3039565 Percanela Percanela Coma de Percanela,Loma de Percanela,Percanela 42.58333 1.48333 A ADMD AD AD 00 0 1809 Europe/Andorra 2011-11-05 +3039566 Camí de Per Baix Cami de Per Baix 42.55 1.68333 R TRL AD 00 0 2254 Europe/Andorra 1993-12-23 +3039567 Riu de Perafita Riu de Perafita 42.49733 1.55811 H STM AD 00 0 1566 Europe/Andorra 2011-04-19 +3039568 Pleta de Perafita Pleta de Perafita 42.48333 1.58333 L GRAZ AD 00 0 2349 Europe/Andorra 1993-12-23 +3039569 Planells de Perafita Planells de Perafita 42.48333 1.58333 T UPLD AD 00 0 2349 Europe/Andorra 1993-12-23 +3039570 Estanys de Perafita Estanys de Perafita 42.47027 1.58958 H LKS AD 00 0 2518 Europe/Andorra 2011-04-19 +3039571 Costa de Perafita Costa de Perafita 42.48333 1.58333 T SLP AD 00 0 2349 Europe/Andorra 1993-12-23 +3039572 Camí de Perafita Cami de Perafita 42.5 1.56667 R TRL AD 00 0 1776 Europe/Andorra 1993-12-23 +3039573 Cabana de Perafita Cabana de Perafita 42.48333 1.58333 S HUT AD 00 0 2349 Europe/Andorra 1993-12-23 +3039574 Perafita Perafita 42.46667 1.58333 A ADMD AD 00 0 2367 Europe/Andorra 1993-12-23 +3039575 Canal de la Pera Canal de la Pera 42.56667 1.48333 H RVN AD 00 0 1508 Europe/Andorra 1993-12-23 +3039576 Roc de la Penya Roc de la Penya 42.53333 1.55 T RK AD 00 0 1344 Europe/Andorra 1993-12-23 +3039577 Costa Pentinada Costa Pentinada 42.48333 1.53333 T SLP AD 00 0 2255 Europe/Andorra 1993-12-23 +3039578 Riu de la Peguera Riu de la Peguera 42.45 1.51667 H STM AD 00 0 1790 Europe/Andorra 1993-12-23 +3039579 Conreu de la Peguera Conreu de la Peguera 42.45 1.53333 V CULT AD 00 0 1859 Europe/Andorra 1993-12-23 +3039580 Carretera de la Peguera Carretera de la Peguera 42.46667 1.55 R RD AD 00 0 2341 Europe/Andorra 1993-12-23 +3039581 Bosc de la Peguera Bosc de la Peguera 42.46321 1.52655 V FRST AD 00 0 2068 Europe/Andorra 2011-04-19 +3039582 Bordes de la Peguera Bordes de la Peguera 42.45 1.53333 S HUTS AD 00 0 1859 Europe/Andorra 1993-12-23 +3039583 Serrat de les Pedrusques Serrat de les Pedrusques 42.6 1.5 T SPUR AD 00 0 1923 Europe/Andorra 1993-12-23 +3039584 Torrent Pedrós Torrent Pedros 42.45 1.48333 H STM AD 00 0 1111 Europe/Andorra 1993-12-23 +3039585 Bosc de Pedres Blanques Bosc de Pedres Blanques 42.53333 1.48333 V FRST AD 00 0 1677 Europe/Andorra 1993-12-23 +3039586 Pla de les Pedres Pla de les Pedres 42.55 1.66667 T UPLD AD 00 0 2224 Europe/Andorra 1993-12-23 +3039587 Pont Pedregat Pont Pedregat 42.58333 1.48333 S BDG AD 00 0 1809 Europe/Andorra 1993-12-23 +3039588 Canal de Pedra Plana Canal de Pedra Plana 42.51667 1.5 H STM AD 00 0 1688 Europe/Andorra 1993-12-23 +3039589 Corral de Pedra Corral de Pedra 42.56667 1.7 L GRAZ AD 00 0 2375 Europe/Andorra 1993-12-23 +3039590 Corral de Pedra Corral de Pedra 42.56667 1.65 L GRAZ AD 00 0 1988 Europe/Andorra 1993-12-23 +3039591 Canal de la Peca Rodona Canal de la Peca Rodona 42.53333 1.48333 H STM AD 00 0 1677 Europe/Andorra 1993-12-23 +3039592 Bosc de Paulelles Bosc de Paulelles 42.53333 1.53333 V FRST AD 00 0 1521 Europe/Andorra 1993-12-23 +3039593 Borda de Paulelles Borda de Paulelles 42.53333 1.55 S HUT AD 00 0 1344 Europe/Andorra 1993-12-23 +3039594 Passos dels Estanys Passos dels Estanys 42.6 1.6 L LCTY AD 00 0 2143 Europe/Andorra 1993-12-23 +3039595 Passos de la Tarterosa Passos de la Tarterosa 42.6 1.65 L LCTY AD 00 0 2131 Europe/Andorra 1993-12-23 +3039596 Canal del Passatorrents Canal del Passatorrents 42.43333 1.48333 H STM AD 00 0 1228 Europe/Andorra 1993-12-23 +3039597 Coll Passader Coll Passader 42.55 1.5 T PK AD 00 0 1292 Europe/Andorra 1993-12-23 +3039598 Riu del Pas Mal Riu del Pas Mal 42.53333 1.65 H STM AD 00 0 2508 Europe/Andorra 1993-12-23 +3039599 Costa del Pas del Monjo Costa del Pas del Monjo 42.63333 1.56667 T SLP AD 00 0 2394 Europe/Andorra 1993-12-23 +3039600 Pas del Monjo Pas del Monjo 42.63333 1.55 L LCTY AD 00 0 2053 Europe/Andorra 1993-12-23 +3039601 Bosc del Pas de la Clau Bosc del Pas de la Clau 42.51667 1.61667 V FRST AD 00 0 2254 Europe/Andorra 1993-12-23 +3039602 Solana del Pas de la Casa Solana del Pas de la Casa 42.53333 1.73333 T SLP AD 00 0 2300 Europe/Andorra 1993-12-23 +3039603 Riu del Pas de la Casa Riu del Pas de la Casa Riu del Pas de la Casa 42.56667 1.75 H STMX AD 00 0 1923 Europe/Andorra 2011-11-05 +3039604 Pas de la Casa Pas de la Casa Pas de la Kasa,Пас де ла Каса 42.54277 1.73361 P PPL AD 03 2363 2050 2230 Europe/Andorra 2008-06-09 +3039605 Pas de la Casa Pas de la Casa 42.53333 1.71667 A ADMD AD 00 0 2400 Europe/Andorra 1993-12-23 +3039606 Partida d’Ensucaranes Partida d'Ensucaranes 42.51667 1.55 L LCTY AD 00 0 1322 Europe/Andorra 1993-12-23 +3039607 Partida de l’Any de la Part Partida de l'Any de la Part 42.55 1.53333 A ADMD AD 00 0 1593 Europe/Andorra 1993-12-23 +3039608 Partida de la Grella Partida de la Grella 42.51667 1.51667 A ADMD AD 00 0 1265 Europe/Andorra 1993-12-23 +3039609 Borda de les Pardines Borda de les Pardines 42.53333 1.6 S FRM AD 00 0 1888 Europe/Andorra 1993-12-23 +3039610 Tossal de la Pardina Tossal de la Pardina 42.5 1.48333 T SPUR AD 00 0 1316 Europe/Andorra 1993-12-23 +3039611 Bosc del Pardal Bosc del Pardal 42.55 1.5 V FRST AD 00 0 1292 Europe/Andorra 1993-12-23 +3039612 Riu de la Palomera Riu de la Palomera 42.56667 1.78333 H STM AD 00 0 1680 Europe/Andorra 1993-12-23 +3039613 Cap de la Palomera Cap de la Palomera Cap de la Palomera 42.58333 1.78333 T PK AD 00 0 1694 Europe/Andorra 2011-11-05 +3039614 Pont de Palomer Pont de Palomer 42.56667 1.48333 S BDG AD 00 0 1508 Europe/Andorra 1993-12-23 +3039615 Pic de Palomer Pic de Palomer 42.56667 1.48333 T PK AD 00 0 1508 Europe/Andorra 1993-12-23 +3039616 Obaga de Palomer Obaga de Palomer 42.56667 1.48333 T SLP AD 00 0 1508 Europe/Andorra 1993-12-23 +3039617 Canal de Palomer Canal de Palomer 42.56667 1.48333 H STM AD 00 0 1508 Europe/Andorra 1993-12-23 +3039618 Callissa de Palomer Callissa de Palomer 42.56667 1.48333 T GRGE AD 00 0 1508 Europe/Andorra 1993-12-23 +3039619 Palomer Palomer 42.56667 1.48333 A ADMD AD 00 0 1508 Europe/Andorra 1993-12-23 +3039620 Feixa Pallola Feixa Pallola 42.43333 1.46667 V CULT AD 00 0 1113 Europe/Andorra 1993-12-23 +3039621 Serrat Pallero Serrat Pallero 42.45 1.45 T SPUR AD 00 0 1482 Europe/Andorra 1993-12-23 +3039622 Prat de Paleta Prat de Paleta 42.48333 1.6 L GRAZ AD 00 0 2250 Europe/Andorra 1993-12-23 +3039623 Serrat de la Palanqueta Serrat de la Palanqueta 42.55 1.6 T RDGE AD 00 0 2210 Europe/Andorra 1993-12-23 +3039624 Riu de la Palanqueta Riu de la Palanqueta 42.55 1.6 H STM AD 00 0 2210 Europe/Andorra 1993-12-23 +3039625 Pont de les Palanques Pont de les Palanques 42.55 1.51667 S BDG AD 00 0 1397 Europe/Andorra 1993-12-23 +3039626 Planell de la Palanca Planell de la Palanca 42.55 1.68333 T UPLD AD 00 0 2254 Europe/Andorra 1993-12-23 +3039627 Pic de la Pala de Coll Carnisser Pic de la Pala de Coll Carnisser 42.6 1.48333 T PK AD 00 0 2441 Europe/Andorra 1993-12-23 +3039628 Pic de la Pala Alta Pic de la Pala Alta 42.6 1.63333 T PK AD 00 0 1893 Europe/Andorra 1993-12-23 +3039629 Solà de Pal Sola de Pal 42.55 1.46667 T SLP AD 00 0 1585 Europe/Andorra 1993-12-23 +3039630 Riu de Pal Riu de Pal 42.56159 1.49544 H STM AD 00 0 1430 Europe/Andorra 2011-04-19 +3039631 Pont de Pal Pont de Pal 42.55 1.46667 S BDG AD 00 0 1585 Europe/Andorra 1993-12-23 +3039632 Carretera de Pal Carretera de Pal 42.55 1.48333 R RD AD 00 0 1548 Europe/Andorra 1993-12-23 +3039633 Bosc de Pal Bosc de Pal 42.53333 1.46667 V FRST AD 00 0 1846 Europe/Andorra 1993-12-23 +3039634 Pal Pal Pal 42.55 1.48333 P PPL AD 04 0 1548 Europe/Andorra 2011-11-05 +3039635 Serra de Padern Serra de Padern 42.53333 1.55 T RDGE AD 00 0 1344 Europe/Andorra 1993-12-23 +3039636 Riu de Padern Riu de Padern 42.52834 1.52213 H STM AD 00 0 1361 Europe/Andorra 2011-04-19 +3039637 Pic de Padern Pic de Padern 42.52429 1.54697 T PK AD 00 0 1290 Europe/Andorra 2011-04-19 +3039638 Bosc de Padern Bosc de Padern 42.53333 1.53333 V FRST AD 00 0 1521 Europe/Andorra 1993-12-23 +3039639 Coll Pa Coll Pa 42.55 1.43333 T PK AD 00 0 1949 Europe/Andorra 1993-12-23 +3039640 Coll Pa Coll Pa 42.48333 1.56667 T PASS AD 00 0 2231 Europe/Andorra 1993-12-23 +3039641 Canal de l’ Ovella Morta Canal de l' Ovella Morta 42.48333 1.58333 H STM AD 00 0 2349 Europe/Andorra 1993-12-23 +3039642 Riu de l’ Ovella Riu de l' Ovella 42.53333 1.6 H STM AD 00 0 1888 Europe/Andorra 1993-12-23 +3039643 Port de l’ Ovella Port de l' Ovella Port de L'Ovella,Port de L’Ovella,Port de l' Ovella,Port de l’ Ovella 42.55 1.43333 T PASS AD 00 0 1949 Europe/Andorra 2011-11-05 +3039644 Bosc de l’ Ovella Bosc de l' Ovella 42.53333 1.6 V FRST AD 00 0 1888 Europe/Andorra 1993-12-23 +3039645 Font de l’ Óssa Font de l' Ossa 42.51667 1.48333 H SPNG AD 00 0 1839 Europe/Andorra 1993-12-23 +3039646 Cova de l’ Óssa Cova de l' Ossa 42.46667 1.48333 S CAVE AD 00 0 1134 Europe/Andorra 1993-12-23 +3039647 Cova de l’ Óssa Cova de l' Ossa 42.45 1.48333 S CAVE AD 00 0 1111 Europe/Andorra 1993-12-23 +3039648 Canya de l’ Óssa Canya de l' Ossa 42.56667 1.51667 S CAVE AD 00 0 1500 Europe/Andorra 1993-12-23 +3039649 Canal de l’ Óssa Canal de l' Ossa 42.5 1.63333 H STM AD 00 0 2545 Europe/Andorra 1993-12-23 +3039650 Canal de l’ Óssa Canal de l' Ossa 42.58333 1.46667 H RVN AD 00 0 1643 Europe/Andorra 1993-12-23 +3039651 Carretera d’ Ós de Civís Carretera d' Os de Civis 42.48333 1.46667 R RD AD 00 0 1148 Europe/Andorra 1993-12-23 +3039652 Canal de l’ Osca de Migdia Canal de l' Osca de Migdia 42.46667 1.46667 H STM AD 00 0 1340 Europe/Andorra 1993-12-23 +3039653 Clots de l’ Ós Clots de l' Os 42.58333 1.68333 H RVN AD 00 0 2294 Europe/Andorra 1993-12-23 +3039654 Clot de l’ Ós Clot de l' Os 42.58333 1.66667 H RVN AD 00 0 2159 Europe/Andorra 1993-12-23 +3039655 Tosa d’ Ortafà Tosa d' Ortafa 42.56667 1.71667 T UPLD AD 00 0 2219 Europe/Andorra 1993-12-23 +3039656 Tarteres d’ Ortafà Tarteres d' Ortafa 42.56667 1.71667 T TAL AD 00 0 2219 Europe/Andorra 1993-12-23 +3039657 Font d’ Ortafà Font d' Ortafa 42.56667 1.71667 H SPNG AD 00 0 2219 Europe/Andorra 1993-12-23 +3039658 Collet d’ Ortafà Collet d' Ortafa 42.56667 1.7 T PASS AD 00 0 2375 Europe/Andorra 1993-12-23 +3039659 Clots d’ Ortafà Clots d' Ortafa 42.55 1.71667 H RVN AD 00 0 2192 Europe/Andorra 1993-12-23 +3039660 Canals d’ Ortafà Canals d' Ortafa 42.56667 1.7 H RVN AD 00 0 2375 Europe/Andorra 1993-12-23 +3039661 Ortafà Ortafa 42.56667 1.71667 A ADMD AD 00 0 2219 Europe/Andorra 1993-12-23 +3039662 Bony de l’ Orri Vell Bony de l' Orri Vell 42.53333 1.63333 T SPUR AD 00 0 2360 Europe/Andorra 1993-12-23 +3039663 Riu dels Orris Riu dels Orris 42.48333 1.63333 H STM AD 00 0 2296 Europe/Andorra 1993-12-23 +3039664 Prats dels Orris Prats dels Orris 42.53333 1.63333 L GRAZ AD 00 0 2360 Europe/Andorra 1993-12-23 +3039665 Pleta dels Orris Pleta dels Orris 42.53333 1.63333 L GRAZ AD 00 0 2360 Europe/Andorra 1993-12-23 +3039666 Barraca de l’ Orri de Rusca Barraca de l' Orri de Rusca 42.55 1.68333 S HUT AD 00 0 2254 Europe/Andorra 1993-12-23 +3039667 Bosc de l’ Orri del Call Bosc de l' Orri del Call 42.6 1.65 V FRST AD 00 0 2131 Europe/Andorra 1993-12-23 +3039668 Serrat de l’ Orri de Gastó Serrat de l' Orri de Gasto 42.48333 1.46667 T SPUR AD 00 0 1148 Europe/Andorra 1993-12-23 +3039669 Serrat de l’ Orri Serrat de l' Orri 42.58333 1.66667 T SLP AD 00 0 2159 Europe/Andorra 1993-12-23 +3039670 Pont de l’ Orri Pont de l' Orri 42.58333 1.66667 S BDG AD 00 0 2159 Europe/Andorra 1993-12-23 +3039671 Obaga de l’ Orri Obaga de l' Orri 42.46667 1.45 T SLP AD 00 0 1562 Europe/Andorra 1993-12-23 +3039672 Borda de l’ Orri Borda de l' Orri 42.55 1.43333 S HUT AD 00 0 1949 Europe/Andorra 1993-12-23 +3039673 Solana dels Oriols Solana dels Oriols 42.56667 1.48333 T SLP AD 00 0 1508 Europe/Andorra 1993-12-23 +3039674 Cap dels Oriols Cap dels Oriols 42.56667 1.46667 T PK AD 00 0 1673 Europe/Andorra 1993-12-23 +3039675 Pont d'Ordino Pont d'Ordino 42.5492 1.52373 S BDG AD 07 0 1397 Europe/Andorra 2007-04-04 +3039676 Parròquia d'Ordino Parroquia d'Ordino Ordino,Parroquia d'Ordino,Parròquia d'Ordino 42.59758 1.52573 A ADM1 AD 05 3467 1695 Europe/Andorra 2008-03-17 +3039677 Coll d'Ordino Coll d'Ordino Coll d'Ordino,Port d'Ordino 42.55615 1.57147 T PASS AD AD 07 0 1883 1879 Europe/Andorra 2007-04-04 +3039678 Ordino Ordino Ordino,ao er di nuo,orudino jiao qu,Ордино,オルディノ教区,奥尔迪诺 42.55623 1.53319 P PPLA AD 05 3066 1340 Europe/Andorra 2009-12-11 +3039679 Font de les Ordigues Font de les Ordigues 42.51667 1.56667 H SPNG AD 00 0 1759 Europe/Andorra 1993-12-23 +3039680 Font de l’ Ordigal Font de l' Ordigal 42.46667 1.46667 H SPNG AD 00 0 1340 Europe/Andorra 1993-12-23 +3039681 Roc de l’ Oral Roc de l' Oral 42.53333 1.56667 T CLF AD 00 0 1418 Europe/Andorra 1993-12-23 +3039682 Planells d’ Olio Planells d' Olio 42.53333 1.6 T UPLD AD 00 0 1888 Europe/Andorra 1993-12-23 +3039683 Obagueta de Cantí Obagueta de Canti 42.56667 1.51667 L LCTY AD 00 0 1500 Europe/Andorra 1993-12-23 +3039684 Riu de les Obagues Riu de les Obagues 42.58333 1.63333 H STM AD 00 0 1722 Europe/Andorra 1993-12-23 +3039685 Canal de les Obagues Canal de les Obagues 42.58333 1.48333 H STM AD 00 0 1809 Europe/Andorra 1993-12-23 +3039686 Bosc de les Obagues Bosc de les Obagues 42.58333 1.63333 V FRST AD 00 0 1722 Europe/Andorra 1993-12-23 +3039687 Bosc de l’ Obaga Sobirana Bosc de l' Obaga Sobirana 42.55 1.48333 V FRST AD 00 0 1548 Europe/Andorra 1993-12-23 +3039688 Canal de l’ Obaga Fosca Canal de l' Obaga Fosca 42.48333 1.43333 H STM AD 00 0 1938 Europe/Andorra 1993-12-23 +3039689 Clots de l’ Obaga de Torradella Clots de l' Obaga de Torradella 42.6 1.63333 H RVN AD 00 0 1893 Europe/Andorra 1993-12-23 +3039690 Serra de l’ Obaga d’Enclar Serra de l' Obaga d'Enclar 42.51246 1.477 T MT AD 00 0 2069 Europe/Andorra 2011-04-19 +3039691 Obaga d’Enclar Obaga d'Enclar 42.5 1.46667 A ADMD AD 00 0 1678 Europe/Andorra 1993-12-23 +3039692 Canal de l’ Obaga de l’Óssa Canal de l' Obaga de l'Ossa 42.55 1.48333 H STM AD 00 0 1548 Europe/Andorra 1993-12-23 +3039693 Bosc de l’ Obaga de l’Óssa Bosc de l' Obaga de l'Ossa 42.55 1.48333 V FRST AD 00 0 1548 Europe/Andorra 1993-12-23 +3039694 Obaga de l’Estall Serrer Obaga de l'Estall Serrer 42.48333 1.6 A ADMD AD 00 0 2250 Europe/Andorra 1993-12-23 +3039695 Obaga de la Gonarda Obaga de la Gonarda 42.55 1.53333 A ADMD AD 00 0 1593 Europe/Andorra 1993-12-23 +3039696 Obaga de Juclar Obaga de Juclar 42.61667 1.7 L LCTY AD 00 0 2285 Europe/Andorra 1993-12-23 +3039697 Obaga de Juberri Obaga de Juberri 42.43333 1.48333 A ADMD AD 00 0 1228 Europe/Andorra 1993-12-23 +3039698 Bosc de l’ Obaga de Gali Bosc de l' Obaga de Gali 42.55 1.48333 V FRST AD 00 0 1548 Europe/Andorra 1993-12-23 +3039699 Obaga de Fontverd Obaga de Fontverd 42.48333 1.58333 A ADMD AD 00 0 2349 Europe/Andorra 1993-12-23 +3039700 Obaga d’Ansalonga Obaga d'Ansalonga 42.56667 1.51667 A ADMD AD 00 0 1500 Europe/Andorra 1993-12-23 +3039701 Obaga d’Andorra Obaga d'Andorra 42.48333 1.51667 A ADMD AD 00 0 2061 Europe/Andorra 1993-12-23 +3039702 Camí de l’ Obaga Cami de l' Obaga 42.55 1.55 R TRL AD 00 0 2097 Europe/Andorra 1993-12-23 +3039703 Serrat dels Obacs Serrat dels Obacs 42.6 1.5 T SLP AD 00 0 1923 Europe/Andorra 1993-12-23 +3039704 Fonts dels Obacs Fonts dels Obacs 42.6 1.5 H SPNG AD 00 0 1923 Europe/Andorra 1993-12-23 +3039705 Obac d’Incles Obac d'Incles 42.58333 1.68333 A ADMD AD 00 0 2294 Europe/Andorra 1993-12-23 +3039706 Obac de Soldeu Obac de Soldeu 42.56667 1.66667 A ADMD AD 00 0 1938 Europe/Andorra 1993-12-23 +3039707 Obac de Sispony Obac de Sispony 42.51667 1.48333 A ADMD AD 00 0 1839 Europe/Andorra 1993-12-23 +3039708 Bosc de l’ Obac de Salla Bosc de l' Obac de Salla 42.55 1.5 V FRST AD 00 0 1292 Europe/Andorra 1993-12-23 +3039709 Obac d’Envalira Obac d'Envalira 42.55 1.68333 A ADMD AD 00 0 2254 Europe/Andorra 1993-12-23 +3039710 Obac d’Encamp Obac d'Encamp 42.51667 1.6 A ADMD AD 00 0 2085 Europe/Andorra 1993-12-23 +3039711 Obac del Tarter Obac del Tarter 42.56667 1.63333 A ADMD AD 00 0 2016 Europe/Andorra 1993-12-23 +3039712 Obac dels Cortals Obac dels Cortals 42.51667 1.61667 A ADMD AD 00 0 2254 Europe/Andorra 1993-12-23 +3039713 Obac de les Escaldes i Engordany Obac de les Escaldes i Engordany 42.5 1.53333 L LCTY AD 00 0 1574 Europe/Andorra 2007-04-05 +3039714 Obac de la Cebollera Obac de la Cebollera 42.61667 1.58333 L LCTY AD 00 0 2374 Europe/Andorra 1993-12-23 +3039715 Pont de l’ Obac de Fontaneda Pont de l' Obac de Fontaneda 42.45 1.46667 S BDG AD 00 0 935 Europe/Andorra 1993-12-23 +3039716 Obac de Canillo Obac de Canillo 42.56667 1.63333 A ADMD AD 00 0 2016 Europe/Andorra 1993-12-23 +3039717 Obac d’Anyós Obac d'Anyos 42.53333 1.53333 A ADMD AD 00 0 1521 Europe/Andorra 1993-12-23 +3039718 Serrat de l’ Obac Serrat de l' Obac 42.48333 1.5 T MT AD 00 0 1631 Europe/Andorra 1993-12-23 +3039719 Rec de l’ Obac Rec de l' Obac 42.5 1.53333 H CNL AD 00 0 1574 Europe/Andorra 1993-12-23 +3039720 Prats de l’ Obac Prats de l' Obac 42.53333 1.61667 L GRAZ AD 00 0 2237 Europe/Andorra 1993-12-23 +3039721 Font de l’ Obac Font de l' Obac 42.5 1.56667 H SPNG AD 00 0 1776 Europe/Andorra 1993-12-23 +3039722 Coll d’ Obac Coll d' Obac 42.5 1.46667 T PK AD 00 0 1678 Europe/Andorra 1993-12-23 +3039723 Torrent dels Nyerros Torrent dels Nyerros 42.48333 1.46667 H STM AD 00 0 1148 Europe/Andorra 1993-12-23 +3039724 Carretera General Número Un Carretera General Numero Un 42.5 1.53333 R RD AD 00 0 1574 Europe/Andorra 1993-12-23 +3039725 Carretera General Número Tres Carretera General Numero Tres 42.61667 1.48333 R RD AD 00 0 2470 Europe/Andorra 1993-12-23 +3039726 Carretera General Número Duo Carretera General Numero Duo 42.53333 1.73333 R RD AD 00 0 2300 Europe/Andorra 1993-12-23 +3039727 Pleta Nova Pleta Nova 42.61667 1.51667 L GRAZ AD 00 0 1716 Europe/Andorra 1993-12-23 +3039728 Obaga de Nou Fonts Obaga de Nou Fonts 42.46667 1.53333 T SLP AD 00 0 2332 Europe/Andorra 1993-12-23 +3039729 Nou Fonts Nou Fonts 42.46667 1.53333 T RDGE AD 00 0 2332 Europe/Andorra 1993-12-23 +3039730 Estany de la Nou Estany de la Nou 42.47539 1.5756 H LK AD 00 0 2349 Europe/Andorra 2011-04-19 +3039731 Pic d’ Ascobes Pic d' Ascobes Pic d' Ascobes,Pic de Noe,Pic de Noé,Pic d’ Ascobes 42.61667 1.73333 T PK AD 00 0 2508 Europe/Andorra 2011-11-05 +3039732 Basera del Niu de l’Aliga Basera del Niu de l'Aliga 42.5 1.45 T CLF AD 00 0 1840 Europe/Andorra 1993-12-23 +3039733 Collades de Nier Collades de Nier 42.61667 1.53333 T PASS AD 00 0 1609 Europe/Andorra 1993-12-23 +3039734 Bosc de les Neres Bosc de les Neres 42.53333 1.56667 V FRST AD 00 0 1418 Europe/Andorra 1993-12-23 +3039735 Bony de les Neres Bony de les Neres Bony de las Neras,Bony de les Neres,Bony de los Neros,Pic de las Neras 42.54761 1.56693 T MT AD 00 0 1828 Europe/Andorra 2011-11-05 +3039736 Roques Negres Roques Negres 42.5 1.46667 T RKS AD 00 0 1678 Europe/Andorra 1993-12-23 +3039737 Rocs Negres Rocs Negres 42.55 1.61667 T RKS AD 00 0 2206 Europe/Andorra 1993-12-23 +3039738 Canals Negres Canals Negres 42.56667 1.68333 H RVN AD 00 0 2340 Europe/Andorra 1993-12-23 +3039739 Serrat Negre Serrat Negre 42.58333 1.48333 T SPUR AD 00 0 1809 Europe/Andorra 1993-12-23 +3039740 Riu Negre Riu Negre 42.45 1.48333 H STM AD 00 0 1111 Europe/Andorra 1993-12-23 +3039741 Port de Comallempla Port de Comallempla Port Negre,Port de Comallempla 42.56667 1.45 T PASS AD 00 0 2137 Europe/Andorra 2011-11-05 +3039742 Pic Negre Pic Negre Pic Negre 42.56667 1.45 T PK AD 00 0 2137 Europe/Andorra 2011-11-05 +3039743 Pic Negre Pic Negre Pic Negre 42.45 1.56667 T PK AD 00 0 2558 Europe/Andorra 2011-11-05 +3039744 Forat Negre Forat Negre 42.5 1.5 H RVN AD 00 0 1135 Europe/Andorra 1993-12-23 +3039745 Estany Negre Estany Negre 42.58333 1.43333 H LK AD 00 0 2412 Europe/Andorra 1993-12-23 +3039746 Bosc Negre Bosc Negre 42.56667 1.55 V FRST AD 00 0 1996 Europe/Andorra 1993-12-23 +3039747 Bosc Negre Bosc Negre 42.53333 1.6 V FRST AD 00 0 1888 Europe/Andorra 1993-12-23 +3039748 Bosc Negre Bosc Negre 42.51667 1.48333 V FRST AD 00 0 1839 Europe/Andorra 1993-12-23 +3039749 Bosc Negre Bosc Negre 42.5 1.56667 V FRST AD 00 0 1776 Europe/Andorra 1993-12-23 +3039750 Bosc Negre Bosc Negre 42.48333 1.51667 V FRST AD 00 0 2061 Europe/Andorra 1993-12-23 +3039751 Bony Negre Bony Negre 42.56667 1.46667 T SPUR AD 00 0 1673 Europe/Andorra 1993-12-23 +3039752 Roca Negra Roca Negra 42.58333 1.58333 T RK AD 00 0 1993 Europe/Andorra 1993-12-23 +3039753 Torrent del Nedó Torrent del Nedo 42.46667 1.5 H STM AD 00 0 1383 Europe/Andorra 1993-12-23 +3039754 Font de la Navina Font de la Navina 42.55 1.56667 H SPNG AD 00 0 1828 Europe/Andorra 1993-12-23 +3039755 Llosers de Naudí Llosers de Naudi 42.56667 1.56667 S MNQR AD 00 0 2089 Europe/Andorra 1993-12-23 +3039756 Carretera de Nagol Carretera de Nagol 42.46667 1.48333 R RD AD 00 0 1134 Europe/Andorra 1993-12-23 +3039757 Nagol Nagol Nagol 42.47146 1.50314 P PPL AD 06 0 1383 Europe/Andorra 2011-11-05 +3039758 Solà de Nadal Sola de Nadal 42.51667 1.51667 T SLP AD 00 0 1265 Europe/Andorra 1993-12-23 +3039759 Obaga de les Mussoles Obaga de les Mussoles 42.55 1.63333 T SLP AD 00 0 2336 Europe/Andorra 1993-12-23 +3039760 Pla Mussola Pla Mussola 42.53333 1.56667 T UPLD AD 00 0 1418 Europe/Andorra 1993-12-23 +3039761 Camí de la Muntanya Cami de la Muntanya 42.5 1.56667 R TRL AD 00 0 1776 Europe/Andorra 1993-12-23 +3039762 Pleta de les Mules Pleta de les Mules 42.43333 1.53333 L GRAZ AD 00 0 2108 Europe/Andorra 1993-12-23 +3039763 Canal del Mulassar Canal del Mulassar 42.56667 1.51667 H STM AD 00 0 1500 Europe/Andorra 1993-12-23 +3039764 Bosc del Mulassar Bosc del Mulassar 42.56667 1.53333 V FRST AD 00 0 1669 Europe/Andorra 1993-12-23 +3039765 Basers del Motxo Basers del Motxo 42.6 1.63333 T CLF AD 00 0 1893 Europe/Andorra 1993-12-23 +3039766 Riu de Mossers Riu de Mossers 42.45 1.46667 H STM AD 00 0 935 Europe/Andorra 1993-12-23 +3039767 Pleta Mosquera Pleta Mosquera 42.63333 1.51667 L GRAZ AD 00 0 1894 Europe/Andorra 1993-12-23 +3039768 Mosquera Mosquera 42.55 1.58333 P PPL AD 03 0 1499 Europe/Andorra 1993-12-23 +3039769 Tosa de Moscatosa Tosa de Moscatosa 42.55 1.71667 T UPLD AD 00 0 2192 Europe/Andorra 1993-12-23 +3039770 Clots de Moscatosa Clots de Moscatosa 42.55 1.7 H RVN AD 00 0 2358 Europe/Andorra 1993-12-23 +3039771 Pont de Mos Pont de Mos 42.58333 1.63333 S BDG AD 00 0 1722 Europe/Andorra 1993-12-23 +3039772 Plana Mortalla Plana Mortalla 42.58333 1.55 T UPLD AD 00 0 2357 Europe/Andorra 1993-12-23 +3039773 Estany Mort Estany Mort 42.63333 1.61667 H LK AD 00 0 2541 Europe/Andorra 1993-12-23 +3039774 Estany Mort Estany Mort 42.58333 1.71667 H LK AD 00 0 2553 Europe/Andorra 1993-12-23 +3039775 Canya dels Moros Canya dels Moros 42.55 1.51667 S CAVE AD 00 0 1397 Europe/Andorra 1993-12-23 +3039776 Pleta de Moretó Pleta de Moreto 42.55 1.68333 L GRAZ AD 00 0 2254 Europe/Andorra 1993-12-23 +3039777 Planell de Moretó Planell de Moreto 42.55 1.68333 T UPLD AD 00 0 2254 Europe/Andorra 1993-12-23 +3039778 Bosc de Moretó Bosc de Moreto 42.55 1.7 V FRST AD 00 0 2358 Europe/Andorra 1993-12-23 +3039779 Estany Moreno Estany Moreno 42.51667 1.63333 H LK AD 00 0 2379 Europe/Andorra 1993-12-23 +3039780 Canal de Mora Canal de Mora 42.56667 1.58333 H STM AD 00 0 1919 Europe/Andorra 1993-12-23 +3039781 Tosal de la Truita Tosal de la Truita Pic de Monturull,Pic de Perafita,Tosal de la Truita 42.46667 1.58333 T PK AD 00 0 2367 Europe/Andorra 2011-11-05 +3039782 Riu de Montuell Riu de Montuell 42.51667 1.58333 H STM AD 00 0 1994 Europe/Andorra 1993-12-23 +3039783 Cap de Montuell Cap de Montuell 42.51667 1.61667 T PK AD 00 0 2254 Europe/Andorra 1993-12-23 +3039784 Roc de Montmantell Roc de Montmantell 42.59695 1.47085 T RDGE AD 00 0 2421 Europe/Andorra 2011-04-19 +3039785 Riu de Montmantell Riu de Montmantell 42.6 1.46667 H STM AD 00 0 2421 Europe/Andorra 1993-12-23 +3039786 Pleta de Montmantell Pleta de Montmantell 42.6 1.46667 L GRAZ AD 00 0 2421 Europe/Andorra 1993-12-23 +3039787 Obaga de Montmantell Obaga de Montmantell 42.6 1.46667 T SLP AD 00 0 2421 Europe/Andorra 1993-12-23 +3039788 Font de Montmantell Font de Montmantell 42.6 1.46667 H SPNG AD 00 0 2421 Europe/Andorra 1993-12-23 +3039789 Estanys de Montmantell Estanys de Montmantell 42.6 1.46667 H LKS AD 00 0 2421 Europe/Andorra 1993-12-23 +3039790 Collada de Montmantell Collada de Montmantell 42.6 1.46667 T PASS AD 00 0 2421 Europe/Andorra 1993-12-23 +3039791 Camí de Montmantell Cami de Montmantell 42.6 1.46667 R TRL AD 00 0 2421 Europe/Andorra 1993-12-23 +3039792 Montmantell Montmantell 42.6 1.46667 A ADMD AD 00 0 2421 Europe/Andorra 1993-12-23 +3039793 Pic de Montmalús Pic de Montmalus 42.50902 1.6861 T PK AD 00 0 2445 Europe/Andorra 2011-04-19 +3039794 Estany de Montmalús Estany de Montmalus 42.5 1.68333 H LK AD 00 0 2425 Europe/Andorra 1993-12-23 +3039795 Collada de Montmalús Collada de Montmalus 42.51667 1.7 T PASS AD 00 0 2435 Europe/Andorra 1993-12-23 +3039796 Montmalús Montmalus 42.5 1.7 A ADMD AD 00 0 2323 Europe/Andorra 1993-12-23 +3039797 Torrent de Montllobar Torrent de Montllobar 42.45 1.51667 H STM AD 00 0 1790 Europe/Andorra 1993-12-23 +3039798 Font de Montllobar Font de Montllobar 42.45 1.51667 H SPNG AD 00 0 1790 Europe/Andorra 1993-12-23 +3039799 Montllobar Montllobar 42.45 1.51667 L LCTY AD 00 0 1790 Europe/Andorra 1993-12-23 +3039800 Riu de Montaup Riu de Montaup 42.56667 1.6 H STM AD 00 0 1655 Europe/Andorra 1993-12-23 +3039801 Prats de Montaup Prats de Montaup 42.56667 1.58333 L GRAZ AD 00 0 1919 Europe/Andorra 1993-12-23 +3039802 Collet de Montaup Collet de Montaup 42.56667 1.58333 T SPUR AD 00 0 1919 Europe/Andorra 1993-12-23 +3039803 Carrera de Montaup Carrera de Montaup 42.56667 1.6 R RD AD 00 0 1655 Europe/Andorra 1993-12-23 +3039804 Barranc de Montaup Barranc de Montaup 42.56667 1.6 H STM AD 00 0 1655 Europe/Andorra 1993-12-23 +3039805 Montaup Montaup 42.58333 1.58333 A ADMD AD 00 0 1993 Europe/Andorra 1993-12-23 +3039806 Riu Montaner Riu Montaner 42.52965 1.52042 H STM AD 00 0 1361 Europe/Andorra 2011-04-19 +3039807 Collada de Montaner Collada de Montaner Col de Montaner,Col de Montanér,Coll de Montane,Coll de Montané,Collada de Montaner 42.51798 1.46716 T PASS AD 00 0 1840 Europe/Andorra 2011-11-05 +3039808 Riu de Montalarí Riu de Montalari 42.53333 1.58333 H STM AD 00 0 1571 Europe/Andorra 1993-12-23 +3039809 Bordes de Montalarí Bordes de Montalari 42.55 1.58333 S HUTS AD 00 0 1499 Europe/Andorra 1993-12-23 +3039810 Mónjol de Cabana Sorda Monjol de Cabana Sorda 42.61667 1.68333 T SLP AD 00 0 2406 Europe/Andorra 1993-12-23 +3039811 Canal del Monjo Canal del Monjo 42.48333 1.5 H STM AD 00 0 1631 Europe/Andorra 1993-12-23 +3039812 Tossal Momó Tossal Momo 42.53333 1.46667 T PK AD 00 0 1846 Europe/Andorra 1993-12-23 +3039813 Pleta dels Moltons Pleta dels Moltons 42.55 1.73333 L GRAZ AD 00 0 2100 Europe/Andorra 1993-12-23 +3039814 Obaga de la Mollerra Obaga de la Mollerra 42.6 1.51667 T SLP AD 00 0 1445 Europe/Andorra 1993-12-23 +3039815 Pont de Molleres Pont de Molleres 42.55 1.58333 S BDG AD 00 0 1499 Europe/Andorra 1993-12-23 +3039816 Canal de les Molleres Canal de les Molleres 42.51667 1.56667 H STM AD 00 0 1759 Europe/Andorra 1993-12-23 +3039817 Canal de les Molleres Canal de les Molleres 42.5 1.55 H STM AD 00 0 1566 Europe/Andorra 1993-12-23 +3039818 Bosc de les Molleres Bosc de les Molleres 42.51667 1.56667 V FRST AD 00 0 1759 Europe/Andorra 1993-12-23 +3039819 Molleres Molleres 42.55103 1.58958 P PPL AD 02 0 1640 Europe/Andorra 2011-04-19 +3039820 Molleres Molleres 42.55 1.58333 L LCTY AD 00 0 1499 Europe/Andorra 1993-12-23 +3039821 Bosc de la Mollera Bosc de la Mollera 42.6 1.51667 V FRST AD 00 0 1445 Europe/Andorra 1993-12-23 +3039822 Bordes de la Mollera Bordes de la Mollera 42.6 1.51667 S HUTS AD 00 0 1445 Europe/Andorra 1993-12-23 +3039823 Torrent de la Molina Torrent de la Molina 42.45 1.51667 H STM AD 00 0 1790 Europe/Andorra 1993-12-23 +3039824 Riu de la Molina Riu de la Molina 42.53333 1.6 H STM AD 00 0 1888 Europe/Andorra 1993-12-23 +3039825 Obaga de la Molina Obaga de la Molina 42.56667 1.48333 T SLP AD 00 0 1508 Europe/Andorra 1993-12-23 +3039826 Obaga de la Molina Obaga de la Molina 42.45 1.51667 T SLP AD 00 0 1790 Europe/Andorra 1993-12-23 +3039827 Grau de la Molina Grau de la Molina 42.53333 1.6 H RVN AD 00 0 1888 Europe/Andorra 1993-12-23 +3039828 Canal de la Molina Canal de la Molina 42.48333 1.56667 H STM AD 00 0 2231 Europe/Andorra 1993-12-23 +3039829 Canal de la Molina Canal de la Molina 42.48333 1.46667 H STM AD 00 0 1148 Europe/Andorra 1993-12-23 +3039830 Camí de la Molina Cami de la Molina 42.53333 1.6 R TRL AD 00 0 1888 Europe/Andorra 1993-12-23 +3039831 Bordes de la Molina Bordes de la Molina 42.51667 1.58333 S HUT AD 00 0 1994 Europe/Andorra 1993-12-23 +3039832 Plana Moleta Plana Moleta 42.56667 1.53333 T UPLD AD 00 0 1669 Europe/Andorra 1993-12-23 +3039833 Roc de les Moles Roc de les Moles 42.53333 1.51667 T RK AD 00 0 1361 Europe/Andorra 1993-12-23 +3039834 Pont de les Moles Pont de les Moles 42.6 1.53333 S BDG AD 00 0 1695 Europe/Andorra 1993-12-23 +3039835 Canal de les Moles Canal de les Moles 42.56667 1.61667 H RVN AD 00 0 1920 Europe/Andorra 1993-12-23 +3039836 Pont de la Mola Pont de la Mola 42.56667 1.66667 S BDG AD 00 0 1938 Europe/Andorra 1993-12-23 +3039837 Roc del Moixó Roc del Moixo 42.56667 1.5 T RK AD 00 0 1636 Europe/Andorra 1993-12-23 +3039838 Borda del Moixellaire Borda del Moixellaire 42.45 1.45 S HUTS AD 00 0 1482 Europe/Andorra 1993-12-23 +3039839 Torrent de la Moixella Torrent de la Moixella 42.43333 1.48333 H STM AD 00 0 1228 Europe/Andorra 1993-12-23 +3039840 Riu de la Moixella Riu de la Moixella 42.45 1.48333 H STM AD 00 0 1111 Europe/Andorra 1993-12-23 +3039841 Bosc de la Moixella Bosc de la Moixella 42.45 1.46667 V FRST AD 00 0 935 Europe/Andorra 1993-12-23 +3039842 Serra Mitjana Serra Mitjana 42.46667 1.61667 T RDGE AD 00 0 2448 Europe/Andorra 1993-12-23 +3039843 Serra Mitjana Serra Mitjana 42.46667 1.58333 T MT AD 00 0 2367 Europe/Andorra 1993-12-23 +3039844 Bony de Mitgeu Bony de Mitgeu 42.55 1.53333 T SPUR AD 00 0 1593 Europe/Andorra 1993-12-23 +3039845 Collet de la Mira Collet de la Mira 42.56667 1.53333 T SPUR AD 00 0 1669 Europe/Andorra 1993-12-23 +3039846 Serrat dels Miquelets Serrat dels Miquelets 42.55 1.6 T RDGE AD 00 0 2210 Europe/Andorra 1993-12-23 +3039847 Font dels Miquelets Font dels Miquelets 42.58333 1.43333 H SPNG AD 00 0 2412 Europe/Andorra 1993-12-23 +3039848 Pont de les Mines Pont de les Mines 42.6 1.53333 S BDG AD 00 0 1695 Europe/Andorra 1993-12-23 +3039849 Tosa del Mig Tosa del Mig 42.58333 1.7 T UPLD AD 00 0 2584 Europe/Andorra 1993-12-23 +3039850 Serra del Mig Serra del Mig 42.58333 1.71667 T RDGE AD 00 0 2553 Europe/Andorra 1993-12-23 +3039851 Roc del Mig Roc del Mig 42.56667 1.71667 T RK AD 00 0 2219 Europe/Andorra 1993-12-23 +3039852 Estany del Mig Estany del Mig 42.63999 1.48612 H LK AD 07 0 2254 Europe/Andorra 2007-03-04 +3039853 Coma del Mig Coma del Mig 42.65 1.53333 T CRQ AD 00 0 2564 Europe/Andorra 1993-12-23 +3039854 Collada del Mig Collada del Mig 42.61667 1.55 T SPUR AD 00 0 2007 Europe/Andorra 1993-12-23 +3039855 Clots del Mig Clots del Mig 42.56667 1.55 H RVN AD 00 0 1996 Europe/Andorra 1993-12-23 +3039856 Carrera del Mig Carrera del Mig 42.56667 1.61667 R TRL AD 00 0 1920 Europe/Andorra 1993-12-23 +3039857 Basers del Mig Basers del Mig 42.58333 1.7 T CLF AD 00 0 2584 Europe/Andorra 1993-12-23 +3039858 Clots de Més Amunt de la Pleta Clots de Mes Amunt de la Pleta 42.6 1.48333 T TAL AD 00 0 2441 Europe/Andorra 1993-12-23 +3039859 Pleta de Més Amunt Pleta de Mes Amunt 42.51667 1.63333 L GRAZ AD 00 0 2379 Europe/Andorra 1993-12-23 +3039860 Estany de Més Amunt Estany de Mes Amunt 42.6457 1.48659 H LK AD 07 0 2530 Europe/Andorra 2007-03-04 +3039861 Carretera Meritxell Carretera Meritxell 42.55 1.58333 R RD AD 00 0 1499 Europe/Andorra 1993-12-23 +3039862 Meritxell Meritxell Sanctuaire de Meritxeli,Sanctuaire de Meritxell,Santuari de Meritxell 42.55403 1.59087 P PPL AD AD 02 0 1640 Europe/Andorra 2007-04-16 +3039863 Rec de Mereig Rec de Mereig 42.56667 1.58333 H CNL AD 00 0 1919 Europe/Andorra 1993-12-23 +3039864 Pont de Mereig Pont de Mereig 42.55 1.6 S BDG AD 00 0 2210 Europe/Andorra 1993-12-23 +3039865 Planells de Mereig Planells de Mereig 42.56667 1.58333 T UPLD AD 00 0 1919 Europe/Andorra 1993-12-23 +3039866 Bosc de Mereig Bosc de Mereig 42.56667 1.58333 V FRST AD 00 0 1919 Europe/Andorra 1993-12-23 +3039867 Bordes de Mereig Bordes de Mereig 42.56302 1.58293 S FRMS AD 00 0 1637 Europe/Andorra 2011-04-19 +3039868 Mereig Mereig 42.56667 1.58333 A ADMD AD 00 0 1919 Europe/Andorra 1993-12-23 +3039869 Font de la Mentirosa Font de la Mentirosa 42.43333 1.51667 H SPNG AD 00 0 2031 Europe/Andorra 1993-12-23 +3039870 Estany dels Meners de la Coma Estany dels Meners de la Coma 42.61667 1.61667 H LK AD 00 0 2352 Europe/Andorra 1993-12-23 +3039871 Riu dels Meners Riu dels Meners 42.61667 1.63333 H STM AD 00 0 2331 Europe/Andorra 1993-12-23 +3039872 Font dels Meners Font dels Meners 42.61667 1.6 H SPNG AD 00 0 2528 Europe/Andorra 1993-12-23 +3039873 Font dels Meners Font dels Meners 42.46667 1.48333 H SPNG AD 00 0 1134 Europe/Andorra 1993-12-23 +3039874 Collada dels Meners Collada dels Meners 42.61667 1.6 T PASS AD 00 0 2528 Europe/Andorra 1993-12-23 +3039875 Pic de la Menera Pic de la Menera 42.51667 1.71667 T PK AD 00 0 2591 Europe/Andorra 1993-12-23 +3039876 Clots de la Menera Clots de la Menera 42.51667 1.71667 H RVN AD 00 0 2591 Europe/Andorra 1993-12-23 +3039877 Bosc del Menadís Bosc del Menadis 42.45 1.46667 V FRST AD 00 0 935 Europe/Andorra 1993-12-23 +3039878 Meligar d’Emportona Meligar d'Emportona 42.53333 1.66667 L LCTY AD 00 0 2489 Europe/Andorra 1993-12-23 +3039879 Serrat de Meligar Serrat de Meligar 42.55 1.45 T RDGE AD 00 0 1788 Europe/Andorra 1993-12-23 +3039880 Estany del Meligar Estany del Meligar 42.51667 1.66667 H LK AD 00 0 2410 Europe/Andorra 1993-12-23 +3039881 Roc del Melic Roc del Melic 42.58333 1.58333 T RK AD 00 0 1993 Europe/Andorra 1993-12-23 +3039882 Pic de Medécourbe Pic de Medecourbe Pic de Madecourbe,Pic de Medecorba,Pic de Medecourbe,Pic de Medécourbe 42.6037 1.44264 T PK AD 00 0 2914 2658 Europe/Andorra 2011-02-09 +3039883 Camí dels Matxos Cami dels Matxos 42.5 1.56667 R TRL AD 00 0 1776 Europe/Andorra 1993-12-23 +3039884 Basera Mateu Basera Mateu 42.5 1.5 T CLF AD 00 0 1135 Europe/Andorra 1993-12-23 +3039885 Serrat dels Matets Serrat dels Matets 42.56667 1.5 T SPUR AD 00 0 1636 Europe/Andorra 1993-12-23 +3039886 Bosc del Matet Bosc del Matet 42.61667 1.53333 V FRST AD 00 0 1609 Europe/Andorra 1993-12-23 +3039887 Bosc de les Matelles Bosc de les Matelles 42.51667 1.48333 V FRST AD 00 0 1839 Europe/Andorra 1993-12-23 +3039888 Clot de la Mata Clot de la Mata 42.56667 1.68333 T SLP AD 00 0 2340 Europe/Andorra 1993-12-23 +3039889 Canals de la Mata Canals de la Mata 42.61667 1.58333 H RVN AD 00 0 2374 Europe/Andorra 1993-12-23 +3039890 Canal de la Mata Canal de la Mata 42.51667 1.51667 H STM AD 00 0 1265 Europe/Andorra 1993-12-23 +3039891 Bosc de la Mata Bosc de la Mata 42.6 1.68333 V FRST AD 00 0 2089 Europe/Andorra 1993-12-23 +3039892 Bosc de la Mata Bosc de la Mata 42.6 1.61667 V FRST AD 00 0 2271 Europe/Andorra 1993-12-23 +3039893 Massolina Massolina 42.5 1.61667 H RVN AD 00 0 2560 Europe/Andorra 1993-12-23 +3039894 Riu de Massat Riu de Massat 42.556 1.68641 H STM AD 00 0 2083 Europe/Andorra 2011-04-19 +3039895 Cortal del Masover Cortal del Masover 42.53333 1.53333 S CRRL AD 00 0 1521 Europe/Andorra 1993-12-23 +3039896 Mas de Ribafeta Mas de Ribafeta 42.56936 1.48837 P PPL AD 04 0 1655 Europe/Andorra 2011-04-19 +3039897 Pont del Mas d’En Soler Pont del Mas d'En Soler 42.56667 1.51667 S BDG AD 00 0 1500 Europe/Andorra 1993-12-23 +3039898 Devesa del Mas d’Alins Devesa del Mas d'Alins 42.45 1.45 L GRAZ AD 00 0 1482 Europe/Andorra 1993-12-23 +3039899 Carretera del Mas d’Alins Carretera del Mas d'Alins 42.45 1.46667 R RD AD 00 0 935 Europe/Andorra 1993-12-23 +3039900 Borda del Mas d’Alins Borda del Mas d'Alins 42.43333 1.45 S HUTS AD 00 0 877 Europe/Andorra 1993-12-23 +3039901 Mas d’Alins Mas d'Alins 42.44126 1.44944 P PPL AD 06 0 1197 Europe/Andorra 2011-04-19 +3039902 Mas d’Alins Mas d'Alins 42.45 1.45 A ADMD AD 00 0 1482 Europe/Andorra 1993-12-23 +3039903 Solà del Mas Sola del Mas 42.45 1.5 T SLP AD 00 0 1614 Europe/Andorra 1993-12-23 +3039904 Obac del Mas Obac del Mas 42.56667 1.5 T SLP AD 00 0 1636 Europe/Andorra 1993-12-23 +3039905 Camí del Mas Cami del Mas 42.45 1.5 R TRL AD 00 0 1614 Europe/Andorra 1993-12-23 +3039906 Bordes del Mas Bordes del Mas 42.45 1.5 S HUTS AD 00 0 1614 Europe/Andorra 1993-12-23 +3039907 Allau del Mas Allau del Mas 42.56667 1.48333 H STM AD 00 0 1508 Europe/Andorra 1993-12-23 +3039908 Borda del Marticella Borda del Marticella 42.58333 1.65 S HUT AD 00 0 1767 Europe/Andorra 1993-12-23 +3039909 Cortal del Martí Cortal del Marti 42.53333 1.53333 S CRRL AD 00 0 1521 Europe/Andorra 1993-12-23 +3039910 Collet Martí Collet Marti 42.5 1.48333 T SPUR AD 00 0 1316 Europe/Andorra 1993-12-23 +3039911 Collet Martí Collet Marti 42.46667 1.46667 T PK AD 00 0 1340 Europe/Andorra 1993-12-23 +3039912 Borda del Martí Borda del Marti 42.56667 1.6 S HUT AD 00 0 1655 Europe/Andorra 1993-12-23 +3039913 Marrades Negres Marrades Negres 42.56667 1.7 T TAL AD 00 0 2375 Europe/Andorra 1993-12-23 +3039914 Marrades Negres Marrades Negres 42.56667 1.55 H STM AD 00 0 1996 Europe/Andorra 1993-12-23 +3039915 Camí de les Marrades Cami de les Marrades 42.55 1.5 R TRL AD 00 0 1292 Europe/Andorra 1993-12-23 +3039916 Bony de les Marrades Bony de les Marrades 42.53333 1.5 T PK AD 00 0 1357 Europe/Andorra 1993-12-23 +3039917 Roc de Maria Roc de Maria 42.5 1.48333 T RK AD 00 0 1316 Europe/Andorra 1993-12-23 +3039918 Canal de Maria Canal de Maria 42.56667 1.48333 H STM AD 00 0 1508 Europe/Andorra 1993-12-23 +3039919 Pont de la Margineda Pont de la Margineda 42.4838 1.49042 S BDG AD 00 0 991 Europe/Andorra 2011-04-19 +3039920 Coll de la Manyiga Coll de la Manyiga 42.46667 1.53333 T SPUR AD 00 0 2332 Europe/Andorra 1993-12-23 +3039921 Coll de la Manyiga Coll de la Manyiga 42.46667 1.48333 T PASS AD 00 0 1134 Europe/Andorra 1993-12-23 +3039922 Cortals de Manyat Cortals de Manyat 42.48333 1.51667 S HUTS AD 00 0 2061 Europe/Andorra 1993-12-23 +3039923 Manyat Manyat 42.47591 1.51661 L LCTY AD 00 0 1892 Europe/Andorra 2011-04-19 +3039924 Riu del Manegor Riu del Manegor 42.6 1.68333 H STM AD 00 0 2089 Europe/Andorra 1993-12-23 +3039925 Pleta del Manegor Pleta del Manegor 42.61667 1.7 L GRAZ AD 00 0 2285 Europe/Andorra 1993-12-23 +3039926 Bosc de la Mandurana Bosc de la Mandurana 42.56667 1.61667 V FRST AD 00 0 1920 Europe/Andorra 1993-12-23 +3039927 Borda del Mandicó Borda del Mandico 42.51667 1.55 S HUT AD 00 0 1322 Europe/Andorra 1993-12-23 +3039928 Pont del Mamó Pont del Mamo 42.55 1.48333 S BDG AD 00 0 1548 Europe/Andorra 1993-12-23 +3039929 Font de Mallol Font de Mallol 42.55 1.55 H SPNG AD 00 0 2097 Europe/Andorra 1993-12-23 +3039930 Canals Males Canals Males 42.46667 1.48333 H STM AD 00 0 1134 Europe/Andorra 1993-12-23 +3039931 Canals Males Canals Males 42.58333 1.46667 H RVN AD 00 0 1643 Europe/Andorra 1993-12-23 +3039932 Canal Mala Canal Mala 42.45 1.5 H RVN AD 00 0 1614 Europe/Andorra 1993-12-23 +3039933 Roca Major Roca Major 42.43333 1.5 T PK AD 00 0 1804 Europe/Andorra 1993-12-23 +3039934 Clot dels Mais Clot dels Mais 42.56667 1.61667 H RVN AD 00 0 1920 Europe/Andorra 1993-12-23 +3039935 Planada dels Maians Planada dels Maians 42.55 1.61667 T UPLD AD 00 0 2206 Europe/Andorra 1993-12-23 +3039936 Pic dels Maians Pic dels Maians 42.55 1.61667 T PK AD 00 0 2206 Europe/Andorra 1993-12-23 +3039937 Costa dels Maians Costa dels Maians 42.55 1.61667 T SLP AD 00 0 2206 Europe/Andorra 1993-12-23 +3039938 Canal dels Maians Canal dels Maians 42.5 1.51667 H STM AD 00 0 1410 Europe/Andorra 1993-12-23 +3039939 Bosc dels Maians Bosc dels Maians 42.48333 1.51667 V FRST AD 00 0 2061 Europe/Andorra 1993-12-23 +3039940 Bony dels Maians Bony dels Maians 42.53333 1.61667 T SPUR AD 00 0 2237 Europe/Andorra 1993-12-23 +3039941 Pic de la Maiana Pic de la Maiana 42.4821 1.60014 T PK AD 00 0 2250 Europe/Andorra 2011-04-19 +3039942 Collada de la Maiana Collada de la Maiana 42.48333 1.6 T PASS AD 00 0 2250 Europe/Andorra 1993-12-23 +3039943 Tosa del Maià Tosa del Maia 42.55 1.71667 T UPLD AD 00 0 2192 Europe/Andorra 1993-12-23 +3039944 Pleta del Maià Pleta del Maia 42.56667 1.73333 L GRAZ AD 00 0 2096 Europe/Andorra 1993-12-23 +3039945 Pic del Maià Pic del Maia Pic Mata,Pic del Maia,Pic del Maià 42.55 1.71667 T PK AD AD 00 0 2192 Europe/Andorra 2011-11-05 +3039946 Obagot del Maià Obagot del Maia 42.56667 1.73333 T SLP AD 00 0 2096 Europe/Andorra 1993-12-23 +3039947 Riu Madriu Riu Madriu Madriu,Riu Madriu 42.49697 1.57954 H STM AD 00 0 1888 Europe/Andorra 2011-11-05 +3039948 Basers de Madona Basers de Madona 42.61667 1.63333 T CLF AD 00 0 2331 Europe/Andorra 1993-12-23 +3039949 Canal de Luixent Passader Canal de Luixent Passader 42.5 1.5 H STM AD 00 0 1135 Europe/Andorra 1993-12-23 +3039950 L’Ovella L'Ovella 42.56667 1.6 L LCTY AD 00 0 1655 Europe/Andorra 1993-12-23 +3039951 Los Travessers Los Travessers 42.56667 1.43333 L LCTY AD 00 0 2402 Europe/Andorra 1993-12-23 +3039952 L’Orri Amagat L'Orri Amagat 42.6 1.6 L LCTY AD 00 0 2143 Europe/Andorra 1993-12-23 +3039953 L’Obagueta L'Obagueta 42.53333 1.55 L LCTY AD 00 0 1344 Europe/Andorra 1993-12-23 +3039954 Roc dels Llumeners Roc dels Llumeners 42.58333 1.46667 T RK AD 00 0 1643 Europe/Andorra 1993-12-23 +3039955 Canal dels Llumeners Canal dels Llumeners 42.58333 1.46667 H RVN AD 00 0 1643 Europe/Andorra 1993-12-23 +3039956 Riu de Llumeneres Riu de Llumeneres 42.46591 1.49579 H STM AD 00 0 1232 Europe/Andorra 2011-04-19 +3039957 Plana de Llumeneres Plana de Llumeneres 42.46667 1.51667 T UPLD AD 00 0 1985 Europe/Andorra 1993-12-23 +3039958 Cortal de Llumeneres Cortal de Llumeneres 42.46667 1.5 S CRRL AD 00 0 1383 Europe/Andorra 1993-12-23 +3039959 Llumeneres Llumeneres Llumeneres 42.46667 1.51667 P PPL AD 06 0 1985 Europe/Andorra 2011-11-05 +3039960 Canals del Lloset Canals del Lloset 42.53333 1.58333 H STM AD 00 0 1571 Europe/Andorra 1993-12-23 +3039961 Canal del Lloset Canal del Lloset 42.55 1.5 H STM AD 00 0 1292 Europe/Andorra 1993-12-23 +3039962 Bordes del Lloset Bordes del Lloset 42.55 1.6 S HUT AD 00 0 2210 Europe/Andorra 1993-12-23 +3039963 Lloset Lloset 42.53333 1.6 A ADMD AD 00 0 1888 Europe/Andorra 1993-12-23 +3039964 Costa del Lloser de Naudí Costa del Lloser de Naudi 42.56667 1.56667 T SLP AD 00 0 2089 Europe/Andorra 1993-12-23 +3039965 Solana del Lloser Solana del Lloser 42.46667 1.45 T SLP AD 00 0 1562 Europe/Andorra 1993-12-23 +3039966 Roc del Lloser Roc del Lloser 42.58333 1.51667 T RK AD 00 0 1722 Europe/Andorra 1993-12-23 +3039967 Canal del Lloser Canal del Lloser 42.51667 1.51667 H STM AD 00 0 1265 Europe/Andorra 1993-12-23 +3039968 Tossal de la Llosada Tossal de la Llosada Pic Llosada,Tossal de la Llosada 42.54862 1.64567 T PK AD 00 0 2422 Europe/Andorra 2011-11-05 +3039969 Tosa de la Llosada Tosa de la Llosada 42.55 1.63333 T UPLD AD 00 0 2336 Europe/Andorra 1993-12-23 +3039970 Riu de la Llosada Riu de la Llosada 42.53333 1.6 H STM AD 00 0 1888 Europe/Andorra 1993-12-23 +3039971 Obaga de la Llosada Obaga de la Llosada 42.53333 1.61667 T SLP AD 00 0 2237 Europe/Andorra 1993-12-23 +3039972 Emprius de la Llosada Emprius de la Llosada 42.53333 1.61667 L CMN AD 00 0 2237 Europe/Andorra 1993-12-23 +3039973 Basers de la Llosada Basers de la Llosada 42.55 1.63333 T CLF AD 00 0 2336 Europe/Andorra 1993-12-23 +3039974 Riu Llosà Riu Llosa 42.45 1.46667 H STM AD 00 0 935 Europe/Andorra 1993-12-23 +3039975 Grau de la Llosa Grau de la Llosa 42.61667 1.55 T SLP AD 00 0 2007 Europe/Andorra 1993-12-23 +3039976 Collet de la Llosa Collet de la Llosa 42.56667 1.5 T PASS AD 00 0 1636 Europe/Andorra 1993-12-23 +3039977 Clots de la Llosa Clots de la Llosa 42.61667 1.61667 H RVN AD 00 0 2352 Europe/Andorra 1993-12-23 +3039978 Canal de la Llosa Canal de la Llosa 42.56667 1.5 H STM AD 00 0 1636 Europe/Andorra 1993-12-23 +3039979 Llorts Llorts Llors,Llorta,Lors 42.59625 1.52658 P PPL AD AD 05 0 1695 Europe/Andorra 2007-04-16 +3039980 Canal de les Llongues Canal de les Llongues 42.55 1.51667 H STM AD 00 0 1397 Europe/Andorra 1993-12-23 +3039981 Bosc de les Llongues Bosc de les Llongues 42.55 1.51667 V FRST AD 00 0 1397 Europe/Andorra 1993-12-23 +3039982 Costa dels Llomassos Costa dels Llomassos 42.58333 1.45 T SLP AD 00 0 2156 Europe/Andorra 1993-12-23 +3039983 Canal dels Llomassos Canal dels Llomassos 42.55 1.46667 H STM AD 00 0 1585 Europe/Andorra 1993-12-23 +3039984 Pleta del Llomar Pleta del Llomar 42.61667 1.56667 L GRAZ AD 00 0 2228 Europe/Andorra 1993-12-23 +3039985 Clot del Llomar Clot del Llomar 42.53333 1.48333 H RVN AD 00 0 1677 Europe/Andorra 1993-12-23 +3039986 Camí de la Llobatera Cami de la Llobatera 42.55 1.48333 R TRL AD 00 0 1548 Europe/Andorra 1993-12-23 +3039987 Canal Llisa Canal Llisa 42.56667 1.51667 H STM AD 00 0 1500 Europe/Andorra 1993-12-23 +3039988 Canal Llisa Canal Llisa 42.53333 1.6 H STM AD 00 0 1888 Europe/Andorra 1993-12-23 +3039989 Torrent Llimois Torrent Llimois 42.48333 1.43333 H STM AD 00 0 1938 Europe/Andorra 1993-12-23 +3039990 Solana dels Llimois Solana dels Llimois 42.5 1.43333 T SLP AD 00 0 1654 Europe/Andorra 1993-12-23 +3039991 Bosc de Llevai Bosc de Llevai 42.53333 1.55 V FRST AD 00 0 1344 Europe/Andorra 1993-12-23 +3039992 Basers de la Llessa Basers de la Llessa 42.48333 1.5 T CLF AD 00 0 1631 Europe/Andorra 1993-12-23 +3039993 Planell de la Llentiga Planell de la Llentiga 42.6 1.51667 T UPLD AD 00 0 1445 Europe/Andorra 1993-12-23 +3039994 Barranc del Llempo Barranc del Llempo 42.55 1.51667 H STM AD 00 0 1397 Europe/Andorra 1993-12-23 +3039995 Casa Llècsia Casa Llecsia 42.56667 1.6 S HSE AD 00 0 1655 Europe/Andorra 1993-12-23 +3039996 Borda del Llècsia Borda del Llecsia 42.58333 1.6 S HUT AD 00 0 1828 Europe/Andorra 1993-12-23 +3039997 Solana dels Llaurers Solana dels Llaurers 42.48333 1.43333 T SLP AD 00 0 1938 Europe/Andorra 1993-12-23 +3039998 Obaga dels Llaurers Obaga dels Llaurers 42.48333 1.43333 T SLP AD 00 0 1938 Europe/Andorra 1993-12-23 +3039999 Bony dels Llaurers Bony dels Llaurers 42.48333 1.43333 T PK AD 00 0 1938 Europe/Andorra 1993-12-23 +3040000 Roc Llarg Roc Llarg 42.55 1.45 T SPUR AD 00 0 1788 Europe/Andorra 1993-12-23 +3040001 Pont del Llarg Pont del Llarg 42.6 1.68333 S BDG AD 00 0 2089 Europe/Andorra 1993-12-23 +3040002 Fontanal Llarg Fontanal Llarg 42.53333 1.46667 H SPNG AD 00 0 1846 Europe/Andorra 1993-12-23 +3040003 Casa Llarg Casa Llarg 42.55 1.58333 S HSE AD 00 0 1499 Europe/Andorra 1993-12-23 +3040004 Canal del Llarg Canal del Llarg 42.5 1.48333 H STM AD 00 0 1316 Europe/Andorra 1993-12-23 +3040005 Solana dels Llampells Solana dels Llampells 42.51667 1.46667 T SLP AD 00 0 1840 Europe/Andorra 1993-12-23 +3040006 Torrent de la Llampa Torrent de la Llampa 42.56667 1.6 H STM AD 00 0 1655 Europe/Andorra 1993-12-23 +3040007 Riu dels Llacs Riu dels Llacs 42.55 1.43333 H STM AD 00 0 1949 Europe/Andorra 1993-12-23 +3040008 Pleta dels Llacs Pleta dels Llacs 42.6 1.63333 L GRAZ AD 00 0 1893 Europe/Andorra 1993-12-23 +3040009 Pic dels Llacs Pic dels Llacs Pic dels Llacs 42.53333 1.41667 T PK AD 00 0 1948 Europe/Andorra 2011-11-05 +3040010 Pales dels Llacs Pales dels Llacs 42.6 1.61667 T CLF AD 00 0 2271 Europe/Andorra 1993-12-23 +3040011 Font dels Llacs Font dels Llacs 42.55 1.43333 H SPNG AD 00 0 1949 Europe/Andorra 1993-12-23 +3040012 Bosc dels Llacs Bosc dels Llacs 42.55 1.41667 V FRST AD 00 0 2105 Europe/Andorra 1993-12-23 +3040013 L’Hospital L'Hospital 42.48333 1.55 A ADMD AD 00 0 2233 Europe/Andorra 1993-12-23 +3040014 L’Hortó L'Horto 42.58333 1.63333 L LCTY AD 00 0 1722 Europe/Andorra 1993-12-23 +3040015 L’Hortó L'Horto 42.56667 1.51667 L LCTY AD 00 0 1500 Europe/Andorra 1993-12-23 +3040016 L’Hortell L'Hortell 42.61667 1.51667 L LCTY AD 00 0 1716 Europe/Andorra 1993-12-23 +3040017 Les Tres Oles Les Tres Oles 42.51667 1.55 H RVN AD 00 0 1322 Europe/Andorra 1993-12-23 +3040018 Les Tres Fonts Les Tres Fonts 42.5 1.46667 H SPNG AD 00 0 1678 Europe/Andorra 1993-12-23 +3040019 Les Tarteres Les Tarteres 42.45 1.48333 L LCTY AD 00 0 1111 Europe/Andorra 1993-12-23 +3040020 L’Estanyassa L'Estanyassa 42.58333 1.65 L LCTY AD 00 0 1767 Europe/Andorra 1993-12-23 +3040021 Les Tallades Les Tallades 42.61667 1.55 A ADMD AD 00 0 2007 Europe/Andorra 1993-12-23 +3040022 L’Estall L'Estall 42.5 1.58333 L LCTY AD 00 0 1888 Europe/Andorra 1993-12-23 +3040023 Les Sorobilles Les Sorobilles 42.56667 1.53333 T CLF AD 00 0 1669 Europe/Andorra 1993-12-23 +3040024 Les Solanelles Les Solanelles 42.55 1.6 L LCTY AD 00 0 2210 Europe/Andorra 1993-12-23 +3040025 Les Sobiranes Les Sobiranes 42.61667 1.55 L LCTY AD 00 0 2007 Europe/Andorra 1993-12-23 +3040026 Les Salses Les Salses 42.63333 1.5 T SLP AD 00 0 1979 Europe/Andorra 1993-12-23 +3040027 Les Salines Les Salines 42.60952 1.53697 P PPL AD 05 0 1793 Europe/Andorra 2007-04-16 +3040028 Les Ribaltes Les Ribaltes 42.53333 1.53333 L LCTY AD 00 0 1521 Europe/Andorra 1993-12-23 +3040029 Les Rebes Les Rebes 42.61667 1.61667 T UPLD AD 00 0 2352 Europe/Andorra 1993-12-23 +3040030 Les Queroles Les Queroles 42.6 1.53333 L LCTY AD 00 0 1695 Europe/Andorra 1993-12-23 +3040031 Les Portes Les Portes 42.48333 1.48333 L LCTY AD 00 0 981 Europe/Andorra 1993-12-23 +3040032 Les Planes de Sornàs Les Planes de Sornas 42.56667 1.53333 L LCTY AD 00 0 1669 Europe/Andorra 1993-12-23 +3040033 Les Planes Les Planes 42.63333 1.5 L LCTY AD 00 0 1979 Europe/Andorra 1993-12-23 +3040034 Les Planes Les Planes 42.53333 1.6 A ADMD AD 00 0 1888 Europe/Andorra 1993-12-23 +3040035 Les Planades Les Planades 42.6 1.68333 L LCTY AD 00 0 2089 Europe/Andorra 1993-12-23 +3040036 Les Pedrusques Les Pedrusques 42.51667 1.63333 T SLP AD 00 0 2379 Europe/Andorra 1993-12-23 +3040037 Les Pedrasses Les Pedrasses 42.55 1.51667 L LCTY AD 00 0 1397 Europe/Andorra 1993-12-23 +3040038 Les Pardines Les Pardines 42.58333 1.48333 T SLP AD 00 0 1809 Europe/Andorra 1993-12-23 +3040039 Les Pardines Les Pardines 42.43333 1.46667 S HUTS AD 00 0 1113 Europe/Andorra 1993-12-23 +3040040 Les Obagues Les Obagues 42.58333 1.48333 L LCTY AD 00 0 1809 Europe/Andorra 1993-12-23 +3040041 Les Neres Les Neres 42.55 1.56667 A ADMD AD 00 0 1828 Europe/Andorra 1993-12-23 +3040042 Les Molleres Les Molleres 42.55 1.53333 L LCTY AD 00 0 1593 Europe/Andorra 1993-12-23 +3040043 Les Majobarnes Les Majobarnes 42.55 1.48333 L LCTY AD 00 0 1548 Europe/Andorra 1993-12-23 +3040044 Les Llanasques Les Llanasques 42.58333 1.58333 L LCTY AD 00 0 1993 Europe/Andorra 1993-12-23 +3040045 Les Forques Les Forques 42.55 1.53333 L LCTY AD 00 0 1593 Europe/Andorra 1993-12-23 +3040046 Les Fonts Les Fonts 42.6 1.6 T UPLD AD 00 0 2143 Europe/Andorra 1993-12-23 +3040047 Les Fonts Les Fonts 42.6 1.48333 L LCTY AD 00 0 2441 Europe/Andorra 1993-12-23 +3040048 Les Feixes Les Feixes 42.55 1.43333 L LCTY AD 00 0 1949 Europe/Andorra 1993-12-23 +3040049 Les Feixes Les Feixes 42.53333 1.46667 L LCTY AD 00 0 1846 Europe/Andorra 1993-12-23 +3040050 Les Fargues Les Fargues 42.48333 1.6 S ANS AD 00 0 2250 Europe/Andorra 1993-12-23 +3040051 les Escaldes les Escaldes Ehskal'des-Ehndzhordani,Escaldes,Escaldes-Engordany,Les Escaldes,esukarudesu=engorudani jiao qu,lai sai si ka er de-en ge er da,Эскальдес-Энджордани,エスカルデス=エンゴルダニ教区,萊塞斯卡爾德-恩戈爾達,萊塞斯卡爾德-恩戈爾達 42.50729 1.53414 P PPLA AD 08 15853 1350 Europe/Andorra 2008-10-15 +3040052 Les Deveses Les Deveses 42.53333 1.65 A ADMD AD 00 0 2508 Europe/Andorra 1993-12-23 +3040053 Les Costes Les Costes 42.51667 1.55 A ADMD AD 00 0 1322 Europe/Andorra 1993-12-23 +3040054 Les Costeres Les Costeres 42.53333 1.53333 L LCTY AD 00 0 1521 Europe/Andorra 1993-12-23 +3040055 Les Comelletes Les Comelletes 42.48333 1.46667 L LCTY AD 00 0 1148 Europe/Andorra 1993-12-23 +3040056 Les Comarques Les Comarques 42.55 1.51667 L LCTY AD 00 0 1397 Europe/Andorra 1993-12-23 +3040057 Les Colleroles Les Colleroles 42.58333 1.6 T SLP AD 00 0 1828 Europe/Andorra 1993-12-23 +3040058 Les Codolles Les Codolles 42.53333 1.51667 L LCTY AD 00 0 1361 Europe/Andorra 1993-12-23 +3040059 L’Escobar L'Escobar 42.61667 1.68333 L LCTY AD 00 0 2406 Europe/Andorra 1993-12-23 +3040060 Les Claperes Les Claperes 42.55 1.5 L LCTY AD 00 0 1292 Europe/Andorra 1993-12-23 +3040061 Les Carboneres Les Carboneres 42.48333 1.46667 L LCTY AD 00 0 1148 Europe/Andorra 1993-12-23 +3040062 Les Canyorques Les Canyorques 42.58333 1.43333 T SLP AD 00 0 2412 Europe/Andorra 1993-12-23 +3040063 Les Canals Les Canals 42.58333 1.58333 L LCTY AD 00 0 1993 Europe/Andorra 1993-12-23 +3040064 Les Canaletes Les Canaletes 42.6 1.45 T RKS AD 00 0 2174 Europe/Andorra 1993-12-23 +3040065 Les Canadilles Les Canadilles 42.48333 1.48333 H STM AD 00 0 981 Europe/Andorra 1993-12-23 +3040066 Les Bordes Les Bordes 42.58333 1.63333 S HUTS AD 00 0 1722 Europe/Andorra 1993-12-23 +3040067 Les Bons Les Bons Els Bons 42.53873 1.58649 P PPL AD AD 03 0 1490 Europe/Andorra 2007-04-16 +3040068 Les Bartigues Les Bartigues 42.6 1.53333 L LCTY AD 00 0 1695 Europe/Andorra 1993-12-23 +3040069 Les Barreres Les Barreres 42.55 1.6 L LCTY AD 00 0 2210 Europe/Andorra 1993-12-23 +3040070 Les Barreres Les Barreres 42.53333 1.53333 L LCTY AD 00 0 1521 Europe/Andorra 1993-12-23 +3040071 Les Bagelles Les Bagelles 42.46667 1.5 L LCTY AD 00 0 1383 Europe/Andorra 1993-12-23 +3040072 Les Aubes Les Aubes 42.51667 1.55 L LCTY AD 00 0 1322 Europe/Andorra 1993-12-23 +3040073 Les Aspades Les Aspades 42.56667 1.55 L LCTY AD 00 0 1996 Europe/Andorra 1993-12-23 +3040074 Les Angleves Les Angleves 42.53333 1.53333 L LCTY AD 00 0 1521 Europe/Andorra 1993-12-23 +3040075 Les Allaus Les Allaus 42.63333 1.53333 L LCTY AD 00 0 2072 Europe/Andorra 1993-12-23 +3040076 Les Agols Les Agols 42.51667 1.6 A ADMD AD 00 0 2085 Europe/Andorra 1993-12-23 +3040077 Les Abelletes Les Abelletes 42.53333 1.73333 L LCTY AD 00 0 2300 Europe/Andorra 1993-12-23 +3040078 L’Ensegur L'Ensegur 42.58333 1.53333 A ADMD AD 00 0 1924 Europe/Andorra 1993-12-23 +3040079 L’Avetar L'Avetar 42.6 1.68333 L LCTY AD 00 0 2089 Europe/Andorra 1993-12-23 +3040080 Planell de Laverdú Planell de Laverdu 42.63333 1.53333 T UPLD AD 00 0 2072 Europe/Andorra 1993-12-23 +3040081 Laverdú Laverdu 42.63333 1.53333 L LCTY AD 00 0 2072 Europe/Andorra 1993-12-23 +3040082 La Vaquerissa La Vaquerissa 42.55 1.45 L LCTY AD 00 0 1788 Europe/Andorra 1993-12-23 +3040083 L’Ausany L'Ausany 42.61667 1.53333 L LCTY AD 00 0 1609 Europe/Andorra 1993-12-23 +3040084 La Uïna La Uina 42.55 1.51667 A ADMD AD 00 0 1397 Europe/Andorra 1993-12-23 +3040085 La Trava La Trava 42.58333 1.61667 L LCTY AD 00 0 1707 Europe/Andorra 1993-12-23 +3040086 La Trava La Trava 42.56667 1.53333 L GRAZ AD 00 0 1669 Europe/Andorra 1993-12-23 +3040087 La Tosa La Tosa 42.56667 1.46667 L LCTY AD 00 0 1673 Europe/Andorra 1993-12-23 +3040088 L’Assalador L'Assalador 42.5 1.43333 L GRAZ AD 00 0 1654 Europe/Andorra 1993-12-23 +3040089 L’Asparró L'Asparro 42.48333 1.5 T PK AD 00 0 1631 Europe/Andorra 1993-12-23 +3040090 La Solaneta La Solaneta 42.53333 1.53333 L LCTY AD 00 0 1521 Europe/Andorra 1993-12-23 +3040091 La Solanella La Solanella 42.46667 1.5 L LCTY AD 00 0 1383 Europe/Andorra 1993-12-23 +3040092 La Solana La Solana 42.58333 1.76667 A ADMD AD 00 0 1945 Europe/Andorra 1993-12-23 +3040093 La Serreta La Serreta 42.58333 1.61667 T SPUR AD 00 0 1707 Europe/Andorra 1993-12-23 +3040094 La Serradora La Serradora 42.46667 1.46667 L LCTY AD 00 0 1340 Europe/Andorra 1993-12-23 +3040095 La Serra La Serra 42.45204 1.49609 S HUTS AD 00 0 1270 Europe/Andorra 2011-04-19 +3040096 La Senyoreta La Senyoreta 42.45 1.48333 A ADMD AD 00 0 1111 Europe/Andorra 1993-12-23 +3040097 L’Artiga L'Artiga 42.56946 1.60243 L LCTY AD 00 0 1655 Europe/Andorra 2011-04-19 +3040098 L’Artic L'Artic 42.5 1.46667 L LCTY AD 00 0 1678 Europe/Andorra 1993-12-23 +3040099 La Rovira La Rovira 42.45 1.46667 L LCTY AD 00 0 935 Europe/Andorra 1993-12-23 +3040100 La Roca La Roca 42.55 1.58333 L LCTY AD 00 0 1499 Europe/Andorra 1993-12-23 +3040101 L’Armiana L'Armiana 42.58333 1.6 A ADMD AD 00 0 1828 Europe/Andorra 1993-12-23 +3040102 La Riberola La Riberola 42.45 1.48333 L LCTY AD 00 0 1111 Europe/Andorra 1993-12-23 +3040103 La Rabassa La Rabassa 42.63333 1.55 A ADMD AD 00 0 2053 Europe/Andorra 1993-12-23 +3040104 La Rabassa La Rabassa Bois de la Rabassa,Bois de la Rabossa,La Rabassa 42.43333 1.51667 A ADMD AD AD 00 0 2031 Europe/Andorra 2011-11-05 +3040105 La Quera La Quera 42.51667 1.51667 L LCTY AD 00 0 1265 Europe/Andorra 1993-12-23 +3040106 La Presó La Preso 42.61667 1.56667 L LCTY AD 00 0 2228 Europe/Andorra 1993-12-23 +3040107 La Posa La Posa 42.53333 1.6 L LCTY AD 00 0 1888 Europe/Andorra 1993-12-23 +3040108 La Portelleta La Portelleta 42.48333 1.65 L LCTY AD 00 0 2658 Europe/Andorra 1993-12-23 +3040109 La Portella La Portella 42.55218 1.62761 T PK AD 00 0 2364 Europe/Andorra 2011-04-19 +3040110 La Portella La Portella 42.45 1.5 T PK AD 00 0 1614 Europe/Andorra 1993-12-23 +3040111 La Portella La Portella 42.56667 1.71667 A ADMD AD 00 0 2219 Europe/Andorra 1993-12-23 +3040112 La Polguera La Polguera 42.56667 1.58333 L LCTY AD 00 0 1919 Europe/Andorra 1993-12-23 +3040113 La Pleta La Pleta 42.55 1.43333 S HUTS AD 00 0 1949 Europe/Andorra 1993-12-23 +3040114 La Planada La Planada 42.6 1.6 T UPLD AD 00 0 2143 Europe/Andorra 1993-12-23 +3040115 La Plana La Plana 42.51667 1.51667 T UPLD AD 00 0 1265 Europe/Andorra 1993-12-23 +3040116 La Plana La Plana 42.5 1.55 L LCTY AD 00 0 1566 Europe/Andorra 1993-12-23 +3040117 La Pinatella La Pinatella 42.53333 1.6 L LCTY AD 00 0 1888 Europe/Andorra 1993-12-23 +3040118 La Peracaus La Peracaus 42.56667 1.6 L LCTY AD 00 0 1655 Europe/Andorra 1993-12-23 +3040119 La Pera La Pera 42.56667 1.46667 L LCTY AD 00 0 1673 Europe/Andorra 1993-12-23 +3040120 La Peguera La Peguera 42.45 1.53333 A ADMD AD 00 0 1859 Europe/Andorra 1993-12-23 +3040121 La Pedregosa La Pedregosa 42.58333 1.61667 L LCTY AD 00 0 1707 Europe/Andorra 1993-12-23 +3040122 La Passera La Passera 42.6 1.53333 H STM AD 00 0 1695 Europe/Andorra 1993-12-23 +3040123 La Palomera La Palomera 42.58333 1.78333 L LCTY AD 00 0 1694 Europe/Andorra 1993-12-23 +3040124 L’Angonella L'Angonella 42.6 1.5 A ADMD AD 00 0 1923 Europe/Andorra 1993-12-23 +3040125 L’Andorrana L'Andorrana 42.55 1.43333 L LCTY AD 00 0 1949 Europe/Andorra 1993-12-23 +3040126 La Muga La Muga 42.48333 1.65 L LCTY AD 00 0 2658 Europe/Andorra 1993-12-23 +3040127 La Molina La Molina 42.45 1.51667 L LCTY AD 00 0 1790 Europe/Andorra 1993-12-23 +3040128 La Molina La Molina 42.51667 1.6 A ADMD AD 00 0 2085 Europe/Andorra 1993-12-23 +3040129 La Moixella La Moixella 42.43333 1.46667 S HUTS AD 00 0 1113 Europe/Andorra 1993-12-23 +3040130 La Mentirosa La Mentirosa 42.43333 1.51667 L LCTY AD 00 0 2031 Europe/Andorra 1993-12-23 +3040131 Parròquia de la Massana Parroquia de la Massana La Massana,Parroquia de la Massana,Parròquia de la Massana,la Massana 42.56667 1.48333 A ADM1 AD 04 8953 1508 Europe/Andorra 2008-03-17 +3040132 la Massana la Massana La Macana,La Massana,La Maçana,La-Massana,la Massana,ma sa na,Ла-Массана,ラ・マサナ教区,马萨纳 42.54499 1.51483 P PPLA AD 04 7211 1257 Europe/Andorra 2008-10-15 +3040133 La Margineda La Margineda 42.48333 1.5 A ADMD AD 00 0 1631 Europe/Andorra 1993-12-23 +3040134 La Mandurana La Mandurana 42.56667 1.61667 A ADMD AD 00 0 1920 Europe/Andorra 1993-12-23 +3040135 L’Alzinar L'Alzinar 42.48333 1.5 L LCTY AD 00 0 1631 Europe/Andorra 1993-12-23 +3040136 La Lomera La Lomera 42.46667 1.48333 L LCTY AD 00 0 1134 Europe/Andorra 1993-12-23 +3040137 La Llosada La Llosada 42.55 1.63333 A ADMD AD 00 0 2336 Europe/Andorra 1993-12-23 +3040138 Serrat de La Llonga Serrat de La Llonga 42.56667 1.51667 T RDGE AD 00 0 1500 Europe/Andorra 1993-12-23 +3040139 La Llonga La Llonga 42.56667 1.51667 A ADMD AD 00 0 1500 Europe/Andorra 1993-12-23 +3040140 l'Aldosa l'Aldosa 42.58333 1.63333 P PPL AD 02 195 1722 Europe/Andorra 2007-04-29 +3040141 l'Aldosa l'Aldosa 42.54391 1.52289 P PPL AD 04 594 1397 Europe/Andorra 2007-04-29 +3040142 L’Airola L'Airola 42.46667 1.46667 L LCTY AD 00 0 1340 Europe/Andorra 1993-12-23 +3040143 La Gonarda La Gonarda 42.55 1.53333 L LCTY AD 00 0 1593 Europe/Andorra 1993-12-23 +3040144 La Gonarda La Gonarda 42.55 1.53333 A ADMD AD 00 0 1593 Europe/Andorra 1993-12-23 +3040145 La Ginebrosa La Ginebrosa 42.55 1.51667 L LCTY AD 00 0 1397 Europe/Andorra 1993-12-23 +3040146 La Garganta La Garganta 42.53333 1.6 L LCTY AD 00 0 1888 Europe/Andorra 1993-12-23 +3040147 La Gargallera La Gargallera 42.48333 1.45 L LCTY AD 00 0 1195 Europe/Andorra 1993-12-23 +3040148 La Fonteta La Fonteta 42.58333 1.46667 L LCTY AD 00 0 1643 Europe/Andorra 1993-12-23 +3040149 La Fita La Fita 42.55 1.45 L LCTY AD 00 0 1788 Europe/Andorra 1993-12-23 +3040150 La Cuina La Cuina 42.56667 1.48333 T SPUR AD 00 0 1508 Europe/Andorra 1993-12-23 +3040151 La Creu de les Portes La Creu de les Portes 42.48333 1.48333 L LCTY AD 00 0 981 Europe/Andorra 1993-12-23 +3040152 La Costa La Costa 42.57834 1.64324 P PPL AD 02 0 1737 Europe/Andorra 2011-04-19 +3040153 La Coruvilla La Coruvilla 42.58333 1.46667 A ADMD AD 00 0 1643 Europe/Andorra 1993-12-23 +3040154 La Cortinada La Cortinada La Cortinada 42.57601 1.51896 P PPL AD 05 0 1722 Europe/Andorra 2011-11-05 +3040155 La Cortada La Cortada 42.45 1.5 L LCTY AD 00 0 1614 Europe/Andorra 1993-12-23 +3040156 La Comella La Comella 42.51667 1.68333 L LCTY AD 00 0 2352 Europe/Andorra 1993-12-23 +3040157 La Comella La Comella 42.5 1.53333 S HUTS AD 00 0 1574 Europe/Andorra 1993-12-23 +3040158 La Comarqueta La Comarqueta 42.58333 1.71667 L LCTY AD 00 0 2553 Europe/Andorra 1993-12-23 +3040159 La Comarqueta La Comarqueta 42.48333 1.63333 L LCTY AD 00 0 2296 Europe/Andorra 1993-12-23 +3040160 La Colilla La Colilla 42.53333 1.6 L LCTY AD 00 0 1888 Europe/Andorra 1993-12-23 +3040161 La Colilla La Colilla 42.5 1.58333 L LCTY AD 00 0 1888 Europe/Andorra 1993-12-23 +3040162 La Clota La Clota 42.56667 1.53333 L LCTY AD 00 0 1669 Europe/Andorra 1993-12-23 +3040163 La Caubella La Caubella 42.58333 1.48333 L CLG AD 00 0 1809 Europe/Andorra 1993-12-23 +3040164 La Castelleta La Castelleta 42.53333 1.51667 T SPUR AD 00 0 1361 Europe/Andorra 1993-12-23 +3040165 La Carbonera La Carbonera 42.46667 1.63333 L LCTY AD 00 0 2619 Europe/Andorra 1993-12-23 +3040166 La Caolla La Caolla 42.5 1.61667 T SPUR AD 00 0 2560 Europe/Andorra 1993-12-23 +3040167 La Callisa La Callisa 42.56667 1.48333 S BDG AD 00 0 1508 Europe/Andorra 1993-12-23 +3040168 La Cabeça La Cabeca 42.48333 1.45 L LCTY AD 00 0 1195 Europe/Andorra 1994-04-16 +3040169 La Cabanella La Cabanella 42.51667 1.46667 A ADMD AD 00 0 1840 Europe/Andorra 1993-12-23 +3040170 La Burna La Burna 42.6 1.48333 T CRQ AD 00 0 2441 Europe/Andorra 1993-12-23 +3040171 La Borda Nova La Borda Nova 42.61667 1.53333 S HUT AD 00 0 1609 Europe/Andorra 1993-12-23 +3040172 La Bor La Bor 42.55 1.58333 A ADMD AD 00 0 1499 Europe/Andorra 1993-12-23 +3040173 La Boixosa La Boixosa 42.56667 1.53333 L LCTY AD 00 0 1669 Europe/Andorra 1993-12-23 +3040174 La Beçosa La Becosa 42.61667 1.55 L LCTY AD 00 0 2007 Europe/Andorra 1994-04-16 +3040175 La Bauma La Bauma 42.48333 1.61667 S CAVE AD 00 0 2217 Europe/Andorra 1993-12-23 +3040176 La Basseta La Basseta 42.48333 1.65 H LK AD 00 0 2658 Europe/Andorra 1993-12-23 +3040177 La Basera La Basera 42.58333 1.65 L LCTY AD 00 0 1767 Europe/Andorra 1993-12-23 +3040178 La Bartra del Ganxo La Bartra del Ganxo 42.48333 1.46667 L LCTY AD 00 0 1148 Europe/Andorra 1993-12-23 +3040179 La Bartra La Bartra 42.51667 1.55 L LCTY AD 00 0 1322 Europe/Andorra 1993-12-23 +3040180 La Bartra La Bartra 42.46667 1.46667 L LCTY AD 00 0 1340 Europe/Andorra 1993-12-23 +3040181 La Bartra La Bartra La Barta,La Bartra 42.51667 1.56667 A ADMD AD AD 00 0 1759 Europe/Andorra 2011-11-05 +3040182 L’Abarsetar L'Abarsetar 42.61667 1.51667 L LCTY AD 00 0 1716 Europe/Andorra 1993-12-23 +3040183 L’Abarsetar L'Abarsetar 42.53333 1.61667 L LCTY AD 00 0 2237 Europe/Andorra 1993-12-23 +3040184 La Baladosa La Baladosa 42.6 1.68333 L LCTY AD 00 0 2089 Europe/Andorra 1993-12-23 +3040185 Tosa de Juclar Tosa de Juclar 42.6 1.71667 T UPLD AD 00 0 2516 Europe/Andorra 1993-12-23 +3040186 Solana de Juclar Solana de Juclar 42.6 1.7 T SLP AD 00 0 2354 Europe/Andorra 1993-12-23 +3040187 Riu de Juclar Riu de Juclar 42.60124 1.69807 H STM AD 00 0 2147 Europe/Andorra 2011-04-19 +3040188 Pleta de Juclar Pleta de Juclar 42.6 1.71667 L GRAZ AD 00 0 2516 Europe/Andorra 1993-12-23 +3040189 Obaga de Juclar Obaga de Juclar 42.61667 1.7 T SLP AD 00 0 2285 Europe/Andorra 1993-12-23 +3040190 Collada de Juclar Collada de Juclar Col de Joucla,Col de l' Albe,Col de l’ Albe,Collada de Juclar,Port de Jogela,Port de Joucla 42.61667 1.73333 T PASS AD 00 0 2508 Europe/Andorra 2011-11-05 +3040191 Canals de Juclar Canals de Juclar 42.6 1.71667 H RVN AD 00 0 2516 Europe/Andorra 1993-12-23 +3040192 Camí de Juclar Cami de Juclar 42.6 1.7 R TRL AD 00 0 2354 Europe/Andorra 1993-12-23 +3040193 Alt de Juclar Alt de Juclar 42.61667 1.7 T RDGE AD 00 0 2285 Europe/Andorra 1993-12-23 +3040194 Juclar Juclar 42.6 1.71667 A ADMD AD 00 0 2516 Europe/Andorra 1993-12-23 +3040195 Carretera de la Juberrussa Carretera de la Juberrussa 42.45 1.48333 R RD AD 00 0 1111 Europe/Andorra 1993-12-23 +3040196 Canal de la Juberrussa Canal de la Juberrussa 42.43333 1.48333 H STM AD 00 0 1228 Europe/Andorra 1993-12-23 +3040197 Bosc de la Juberrussa Bosc de la Juberrussa 42.43333 1.48333 V FRST AD 00 0 1228 Europe/Andorra 1993-12-23 +3040198 Bordes de la Juberrussa Bordes de la Juberrussa 42.43333 1.48333 S FRM AD 00 0 1228 Europe/Andorra 1993-12-23 +3040199 Juberrussa Juberrussa 42.43333 1.48333 A ADMD AD 00 0 1228 Europe/Andorra 1993-12-23 +3040200 Juberri Juberri Juberri,Juverri 42.44069 1.48972 P PPL AD 06 0 1460 Europe/Andorra 2011-11-05 +3040201 Font de la Jubanya Font de la Jubanya 42.58333 1.45 H SPNG AD 00 0 2156 Europe/Andorra 1993-12-23 +3040202 Coll Jovell Coll Jovell 42.45 1.53333 T SPUR AD 00 0 1859 Europe/Andorra 1993-12-23 +3040203 Coll Jovell Coll Jovell 42.5 1.56667 T PK AD 00 0 1776 Europe/Andorra 1993-12-23 +3040204 Coll Jovell Coll Jovell 42.48333 1.48333 T PK AD 00 0 981 Europe/Andorra 1993-12-23 +3040205 Jovell Jovell 42.58333 1.63333 L LCTY AD 00 0 1722 Europe/Andorra 1993-12-23 +3040206 Coll de Jou Coll de Jou 42.51667 1.55 T SPUR AD 00 0 1322 Europe/Andorra 1993-12-23 +3040207 Coll de Jou Coll de Jou 42.45 1.46667 T PASS AD 00 0 935 Europe/Andorra 1993-12-23 +3040208 Canal del Jou Canal del Jou 42.56667 1.5 H STM AD 00 0 1636 Europe/Andorra 1993-12-23 +3040209 Camí del Jou Cami del Jou 42.56667 1.5 R TRL AD 00 0 1636 Europe/Andorra 1993-12-23 +3040210 Bosc del Jou Bosc del Jou 42.56667 1.51667 V FRST AD 00 0 1500 Europe/Andorra 1993-12-23 +3040211 Solana del Jordà Solana del Jorda 42.51667 1.6 T SLP AD 00 0 2085 Europe/Andorra 1993-12-23 +3040212 Borda del Joansaus Borda del Joansaus 42.58333 1.65 S HUT AD 00 0 1767 Europe/Andorra 1993-12-23 +3040213 Portella de Joan Antoni Portella de Joan Antoni 42.51195 1.70887 T PASS AD 00 0 2550 Europe/Andorra 2011-04-19 +3040214 Pleta de Jes Agols Pleta de Jes Agols 42.51667 1.6 L GRAZ AD 00 0 2085 Europe/Andorra 1993-12-23 +3040215 Borda del Jep Borda del Jep Borda del Gep,Borda del Jep 42.56667 1.58333 S HUT AD AD 00 0 1919 Europe/Andorra 2011-11-05 +3040216 Borda del Jarca Borda del Jarca 42.56667 1.58333 S HUT AD 00 0 1919 Europe/Andorra 1993-12-23 +3040217 Borda del Jarca Borda del Jarca 42.55 1.6 S HUT AD 00 0 2210 Europe/Andorra 1993-12-23 +3040218 Borda del Janramon Borda del Janramon 42.56667 1.58333 S HUT AD 00 0 1919 Europe/Andorra 1993-12-23 +3040219 Turó de Jan Turo de Jan 42.61667 1.63333 T SPUR AD 00 0 2331 Europe/Andorra 1993-12-23 +3040220 Riu de Jan Riu de Jan 42.61667 1.63333 H STM AD 00 0 2331 Europe/Andorra 1993-12-23 +3040221 Pala de Jan Pala de Jan 42.61667 1.63333 T CLF AD 00 0 2331 Europe/Andorra 1993-12-23 +3040222 Cóms de Jan Coms de Jan 42.61667 1.63333 H LK AD 00 0 2331 Europe/Andorra 1993-12-23 +3040223 Collada de Jan Collada de Jan Collada de Jan 42.61667 1.63333 T PASS AD 00 0 2331 Europe/Andorra 2011-11-05 +3040224 Estany de l’ Isla Estany de l' Isla 42.61667 1.68333 H LK AD 00 0 2406 Europe/Andorra 1993-12-23 +3040225 Font dels Isards Font dels Isards 42.58333 1.7 H SPNG AD 00 0 2584 Europe/Andorra 1993-12-23 +3040226 Costa dels Isards Costa dels Isards 42.58333 1.6 T SLP AD 00 0 1828 Europe/Andorra 1993-12-23 +3040227 Coll dels Isards Coll dels Isards 42.51831 1.73762 T PASS AD 00 0 2659 Europe/Andorra 2011-04-19 +3040228 Canal dels Isards Canal dels Isards 42.5 1.66667 H RVN AD 00 0 2441 Europe/Andorra 1993-12-23 +3040229 Canal de l’ Isard Canal de l' Isard 42.58333 1.46667 H STM AD 00 0 1643 Europe/Andorra 1993-12-23 +3040230 Pla de l’ Ingla Pla de l' Ingla 42.48333 1.61667 T UPLD AD 00 0 2217 Europe/Andorra 1993-12-23 +3040231 Collet de l’ Infern Collet de l' Infern 42.48333 1.6 T PASS AD 00 0 2250 Europe/Andorra 1993-12-23 +3040232 Canal de l’ Infern Canal de l' Infern 42.53333 1.6 H STM AD 00 0 1888 Europe/Andorra 1993-12-23 +3040233 Torrent dels Indrets Torrent dels Indrets 42.48333 1.45 H STM AD 00 0 1195 Europe/Andorra 1993-12-23 +3040234 Riu d’ Incles Riu d' Incles 42.60159 1.68721 H STM AD 00 0 2014 Europe/Andorra 2011-04-19 +3040235 Prats d’ Incles Prats d' Incles 42.6 1.66667 L GRAZ AD 00 0 1858 Europe/Andorra 1993-12-23 +3040236 Port de Fontargente Port de Fontargente Port d' Incles,Port de Fontargent,Port de Fontargente,Port d’ Incles 42.61667 1.71667 T PASS AD 00 0 2352 Europe/Andorra 2011-11-05 +3040237 Pont d’ Incles Pont d' Incles 42.58333 1.66667 S BDG AD 00 0 2159 Europe/Andorra 1993-12-23 +3040238 Camí d’ Incles Cami d' Incles 42.6 1.66667 R TRL AD 00 0 1858 Europe/Andorra 1993-12-23 +3040239 Bosc d’ Incles Bosc d' Incles 42.58333 1.66667 V FRST AD 00 0 2159 Europe/Andorra 1993-12-23 +3040240 Estany de l’ Illa Estany de l' Illa 42.49785 1.65852 H RSV AD 00 0 2553 Europe/Andorra 2011-04-19 +3040241 Obagues de la Iesca Obagues de la Iesca 42.48333 1.43333 T SLP AD 00 0 1938 Europe/Andorra 1993-12-23 +3040242 Bosc de l’ Hoste Bosc de l' Hoste 42.55 1.68333 V FRST AD 00 0 2254 Europe/Andorra 1993-12-23 +3040243 Bosc de l’ Hostal del Poll Bosc de l' Hostal del Poll 42.61667 1.63333 V FRST AD 00 0 2331 Europe/Andorra 1993-12-23 +3040244 Riu dels Hortons Riu dels Hortons 42.51667 1.46667 H STM AD 00 0 1840 Europe/Andorra 1993-12-23 +3040245 Bosc dels Hortons Bosc dels Hortons 42.53333 1.55 V FRST AD 00 0 1344 Europe/Andorra 1993-12-23 +3040246 Torrent dels Hortells Torrent dels Hortells 42.45 1.48333 H STM AD 00 0 1111 Europe/Andorra 1993-12-23 +3040247 Serra de l’ Hortell Serra de l' Hortell 42.61667 1.51667 T MT AD 00 0 1716 Europe/Andorra 1993-12-23 +3040248 Pic de l’ Hortell Pic de l' Hortell 42.61914 1.50815 T PK AD 00 0 2390 Europe/Andorra 2011-04-19 +3040249 Torrent dels Hortals Torrent dels Hortals 42.53333 1.58333 H STM AD 00 0 1571 Europe/Andorra 1993-12-23 +3040250 Serra de l’ Honor Serra de l' Honor 42.53333 1.51667 T SPUR AD 00 0 1361 Europe/Andorra 1993-12-23 +3040251 Roc del’ Home Dret Roc del' Home Dret 42.58333 1.66667 T SPUR AD 00 0 2159 Europe/Andorra 1993-12-23 +3040252 Roca Herbosa Roca Herbosa 42.48333 1.56667 T RK AD 00 0 2231 Europe/Andorra 1993-12-23 +3040253 Pleta de Guitard Pleta de Guitard Pleta de Guitard,Pleta de Guitart 42.53333 1.6 L GRAZ AD AD 00 0 1888 Europe/Andorra 2011-11-05 +3040254 Cortal del Guitard Cortal del Guitard Cortal del Guitard,Cortal del Guitart 42.45 1.5 S CRRL AD AD 00 0 1614 Europe/Andorra 2011-11-05 +3040255 Tartera de les Guineus Tartera de les Guineus 42.56667 1.68333 T TAL AD 00 0 2340 Europe/Andorra 1993-12-23 +3040256 Roc de la Guilla Roc de la Guilla 42.51667 1.56667 T RK AD 00 0 1759 Europe/Andorra 1993-12-23 +3040257 Bony de les Guardioles Bony de les Guardioles 42.55 1.51667 T SPUR AD 00 0 1397 Europe/Andorra 1993-12-23 +3040258 Serra de la Guardiola Serra de la Guardiola 42.58081 1.71111 T RDGE AD 00 0 2544 Europe/Andorra 2011-04-19 +3040259 Obaga de la Guardiola Obaga de la Guardiola 42.56667 1.68333 T SLP AD 00 0 2340 Europe/Andorra 1993-12-23 +3040260 Planell de la Guàrdia Planell de la Guardia 42.61667 1.51667 T UPLD AD 00 0 1716 Europe/Andorra 1993-12-23 +3040261 Roques Grosses Roques Grosses 42.58333 1.66667 T RKS AD 00 0 2159 Europe/Andorra 1993-12-23 +3040262 Riba Grossa Riba Grossa 42.55 1.6 T TAL AD 00 0 2210 Europe/Andorra 1993-12-23 +3040263 Roc Gros Roc Gros 42.58333 1.48333 T RK AD 00 0 1809 Europe/Andorra 1993-12-23 +3040264 Riu Gros Riu Gros 42.56667 1.66667 H STM AD 00 0 1938 Europe/Andorra 1993-12-23 +3040265 Alt del Griu Alt del Griu 42.52534 1.65114 T MT AD 00 0 2508 Europe/Andorra 2011-04-19 +3040266 Riu del Grill Riu del Grill 42.51667 1.6 H STM AD 00 0 2085 Europe/Andorra 1993-12-23 +3040267 Font de les Greixes Font de les Greixes 42.46667 1.45 H SPNG AD 00 0 1562 Europe/Andorra 1993-12-23 +3040268 Clot de les Greixes Clot de les Greixes 42.46667 1.45 H RVN AD 00 0 1562 Europe/Andorra 1993-12-23 +3040269 Camí de les Gravades Cami de les Gravades 42.53333 1.51667 R TRL AD 00 0 1361 Europe/Andorra 1993-12-23 +3040270 Clot dels Gravaders Clot dels Gravaders 42.46667 1.55 H RVN AD 00 0 2341 Europe/Andorra 1993-12-23 +3040271 Pleta dels Graus Pleta dels Graus 42.48333 1.56667 L GRAZ AD 00 0 2231 Europe/Andorra 1993-12-23 +3040272 Grau Roig Grau Roig 42.53333 1.7 S RSRT AD 03 0 2357 Europe/Andorra 2010-01-11 +3040273 Obaga de Graupont Obaga de Graupont 42.48333 1.46667 T SLP AD 00 0 1148 Europe/Andorra 1993-12-23 +3040274 Clot de Graupont Clot de Graupont 42.48333 1.46667 H RVN AD 00 0 1148 Europe/Andorra 1993-12-23 +3040275 Grau d’Incles Grau d'Incles 42.58333 1.65 L LCTY AD 00 0 1767 Europe/Andorra 1993-12-23 +3040276 Grau del Cabrer Grau del Cabrer 42.56667 1.71667 L LCTY AD 00 0 2219 Europe/Andorra 1993-12-23 +3040277 Plana del Grau Plana del Grau 42.58333 1.51667 T UPLD AD 00 0 1722 Europe/Andorra 1993-12-23 +3040278 Costa del Grau Costa del Grau 42.56667 1.6 T SLP AD 00 0 1655 Europe/Andorra 1993-12-23 +3040279 Canal del Grau Canal del Grau 42.56667 1.6 H STM AD 00 0 1655 Europe/Andorra 1993-12-23 +3040280 Canal Gran de la Serrera Canal Gran de la Serrera 42.61667 1.58333 H RVN AD 00 0 2374 Europe/Andorra 1993-12-23 +3040281 Canal Gran de la Grella Canal Gran de la Grella 42.51667 1.51667 H STM AD 00 0 1265 Europe/Andorra 1993-12-23 +3040282 Planell Gran de la Cebollera Planell Gran de la Cebollera 42.63333 1.58333 T UPLD AD 00 0 2470 Europe/Andorra 1993-12-23 +3040283 Costa de les Grandalles Costa de les Grandalles 42.53333 1.7 T SLP AD 00 0 2357 Europe/Andorra 1993-12-23 +3040284 Planell Gran Planell Gran 42.63333 1.55 T UPLD AD 00 0 2053 Europe/Andorra 1993-12-23 +3040285 Planell Gran Planell Gran 42.58333 1.66667 T UPLD AD 00 0 2159 Europe/Andorra 1993-12-23 +3040286 Planell Gran Planell Gran 42.56667 1.46667 T UPLD AD 00 0 1673 Europe/Andorra 1993-12-23 +3040287 Planell Gran Planell Gran 42.55 1.68333 T UPLD AD 00 0 2254 Europe/Andorra 1993-12-23 +3040288 Planell Gran Planell Gran 42.55 1.65 T UPLD AD 00 0 2432 Europe/Andorra 1993-12-23 +3040289 Planell Gran Planell Gran 42.46667 1.56667 T UPLD AD 00 0 2365 Europe/Andorra 1993-12-23 +3040290 Costa Gran Costa Gran 42.61667 1.61667 T SLP AD 00 0 2352 Europe/Andorra 1993-12-23 +3040291 Costa Gran Costa Gran 42.6 1.61667 T SLP AD 00 0 2271 Europe/Andorra 1993-12-23 +3040292 Costa Gran Costa Gran 42.51667 1.48333 T SLP AD 00 0 1839 Europe/Andorra 1993-12-23 +3040293 Canal Gran Canal Gran 42.58333 1.46667 H STM AD 00 0 1643 Europe/Andorra 1993-12-23 +3040294 Canal Gran Canal Gran 42.56667 1.51667 H STM AD 00 0 1500 Europe/Andorra 1993-12-23 +3040295 Canal Gran Canal Gran 42.56667 1.48333 H STM AD 00 0 1508 Europe/Andorra 1993-12-23 +3040296 Canal Gran Canal Gran 42.55 1.58333 H STM AD 00 0 1499 Europe/Andorra 1993-12-23 +3040297 Canal Gran Canal Gran 42.55 1.5 H STM AD 00 0 1292 Europe/Andorra 1993-12-23 +3040298 Canal Gran Canal Gran 42.5 1.63333 H STM AD 00 0 2545 Europe/Andorra 1993-12-23 +3040299 Canal Gran Canal Gran 42.48333 1.48333 H STM AD 00 0 981 Europe/Andorra 1993-12-23 +3040300 Canal Gran Canal Gran 42.46667 1.48333 H STM AD 00 0 1134 Europe/Andorra 1993-12-23 +3040301 Basera Gran Basera Gran 42.5 1.48333 T CLF AD 00 0 1316 Europe/Andorra 1993-12-23 +3040302 Plana de Gral Plana de Gral 42.58333 1.48333 T UPLD AD 00 0 1809 Europe/Andorra 1993-12-23 +3040303 Canya de les Grailes Canya de les Grailes 42.48333 1.51667 S CAVE AD 00 0 2061 Europe/Andorra 1993-12-23 +3040304 Canya de les Grailes Canya de les Grailes 42.46667 1.46667 S CAVE AD 00 0 1340 Europe/Andorra 1993-12-23 +3040305 Canal de les Grailes Canal de les Grailes 42.5 1.61667 H STM AD 00 0 2560 Europe/Andorra 1993-12-23 +3040306 Roc del Grailer Roc del Grailer 42.56667 1.51667 T RK AD 00 0 1500 Europe/Andorra 1993-12-23 +3040307 Tartera del Goter Tartera del Goter 42.56667 1.73333 T TAL AD 00 0 2096 Europe/Andorra 1993-12-23 +3040308 Roc del Goter Roc del Goter 42.56667 1.73333 T CLF AD 00 0 2096 Europe/Andorra 1993-12-23 +3040309 Pala del Goter Pala del Goter 42.56667 1.73333 T SLP AD 00 0 2096 Europe/Andorra 1993-12-23 +3040310 Bosc de la Gonarda Bosc de la Gonarda 42.55 1.53333 V FRST AD 00 0 1593 Europe/Andorra 1993-12-23 +3040311 Coll de Gomà Coll de Goma 42.55 1.55 T PASS AD 00 0 2097 Europe/Andorra 1993-12-23 +3040312 Planell de Ginestar Planell de Ginestar 42.6 1.55 T UPLD AD 00 0 2298 Europe/Andorra 1993-12-23 +3040313 Bony de la Ginebrera Bony de la Ginebrera 42.45 1.46667 T SPUR AD 00 0 935 Europe/Andorra 1993-12-23 +3040314 Font del Ginebre Font del Ginebre 42.43333 1.45 H SPNG AD 00 0 877 Europe/Andorra 1993-12-23 +3040315 Prat del Gilet Prat del Gilet 42.51667 1.6 L GRAZ AD 00 0 2085 Europe/Andorra 1993-12-23 +3040316 Pla del Géspit Pla del Gespit 42.55 1.61667 T UPLD AD 00 0 2206 Europe/Andorra 1993-12-23 +3040317 Pala del Géspit Pala del Gespit 42.61667 1.55 T SLP AD 00 0 2007 Europe/Andorra 1993-12-23 +3040318 Pala del Géspit Pala del Gespit 42.56667 1.55 T SLP AD 00 0 1996 Europe/Andorra 1993-12-23 +3040319 Borda del Germà Borda del Germa 42.45 1.48333 S FRM AD 00 0 1111 Europe/Andorra 1993-12-23 +3040320 Costa de les Gerderes Costa de les Gerderes 42.55 1.6 T SLP AD 00 0 2210 Europe/Andorra 1993-12-23 +3040321 Cortal del Genret Cortal del Genret 42.45 1.5 S CRRL AD 00 0 1614 Europe/Andorra 1993-12-23 +3040322 Clot del Gel Clot del Gel 42.51667 1.48333 H RVN AD 00 0 1839 Europe/Andorra 1993-12-23 +3040323 Canal del Gel Canal del Gel 42.48333 1.46667 H STM AD 00 0 1148 Europe/Andorra 1993-12-23 +3040324 Solana de la Gaverna Solana de la Gaverna 42.51667 1.6 T SLP AD 00 0 2085 Europe/Andorra 1993-12-23 +3040325 Font de la Gavatxa Font de la Gavatxa 42.53333 1.73333 H SPNG AD 00 0 2300 Europe/Andorra 1993-12-23 +3040326 Borda del Gastó Borda del Gasto 42.45 1.46667 S HUT AD 00 0 935 Europe/Andorra 1993-12-23 +3040327 Serrat de la Garriga Serrat de la Garriga 42.53333 1.61667 T SPUR AD 00 0 2237 Europe/Andorra 1993-12-23 +3040328 Crestes de Gargantillar Crestes de Gargantillar 42.50208 1.63061 T RDGE AD 00 0 2666 Europe/Andorra 2011-04-19 +3040329 Collades de Gargantillar Collades de Gargantillar 42.5 1.65 T PASS AD 00 0 2542 Europe/Andorra 1993-12-23 +3040330 Clots de Gargantillar Clots de Gargantillar 42.5 1.65 H RVN AD 00 0 2542 Europe/Andorra 1993-12-23 +3040331 Gargantillar Gargantillar 42.5 1.65 A ADMD AD 00 0 2542 Europe/Andorra 1993-12-23 +3040332 Roc de la Garganta Roc de la Garganta 42.55 1.6 T RK AD 00 0 2210 Europe/Andorra 1993-12-23 +3040333 Pas dels Gargalls Pas dels Gargalls 42.6 1.68333 T PASS AD 00 0 2089 Europe/Andorra 1993-12-23 +3040334 Bosc de la Gargallosa Bosc de la Gargallosa 42.56667 1.51667 V FRST AD 00 0 1500 Europe/Andorra 1993-12-23 +3040335 Torrent del Gargallet Torrent del Gargallet 42.45 1.53333 H STM AD 00 0 1859 Europe/Andorra 1993-12-23 +3040336 Font del Gargallet Font del Gargallet 42.45 1.53333 H SPNG AD 00 0 1859 Europe/Andorra 1993-12-23 +3040337 Clotada del Gargallet Clotada del Gargallet 42.45 1.55 H RVN AD 00 0 2457 Europe/Andorra 1993-12-23 +3040338 Solana de Galliner Solana de Galliner 42.56667 1.46667 T SLP AD 00 0 1673 Europe/Andorra 1993-12-23 +3040339 Riu de Galliner Riu de Galliner 42.56667 1.48333 H STM AD 00 0 1508 Europe/Andorra 1993-12-23 +3040340 Galliner Galliner 42.56667 1.46667 A ADMD AD 00 0 1673 Europe/Andorra 1993-12-23 +3040341 Planell de la Gallina Planell de la Gallina 42.43333 1.5 T UPLD AD 00 0 1804 Europe/Andorra 1993-12-23 +3040342 Coll de la Gallina Coll de la Gallina 42.46667 1.45 T PASS AD 00 0 1562 Europe/Andorra 1993-12-23 +3040343 Canal dels Gais Canal dels Gais 42.48333 1.55 H STM AD 00 0 2233 Europe/Andorra 1993-12-23 +3040344 Borda del Gabriel Borda del Gabriel 42.56667 1.58333 S HUT AD 00 0 1919 Europe/Andorra 1993-12-23 +3040345 Canal de la Fusta Canal de la Fusta 42.55 1.55 H RVN AD 00 0 2097 Europe/Andorra 1993-12-23 +3040346 Font Freda Font Freda 42.63333 1.56667 H SPNG AD 00 0 2394 Europe/Andorra 1993-12-23 +3040347 Font Freda Font Freda 42.56667 1.46667 H SPNG AD 00 0 1673 Europe/Andorra 1993-12-23 +3040348 Font Freda Font Freda 42.45 1.5 H SPNG AD 00 0 1614 Europe/Andorra 1993-12-23 +3040349 Font Fred Font Fred 42.48333 1.6 H SPNG AD 00 0 2250 Europe/Andorra 1993-12-23 +3040350 Francolí Francoli 42.48333 1.43333 A ADMD AD 00 0 1938 Europe/Andorra 1993-12-23 +3040351 Obaga Fosca Obaga Fosca 42.48333 1.43333 T SLP AD 00 0 1938 Europe/Andorra 1993-12-23 +3040352 Collada Fosca Collada Fosca 42.43333 1.5 T SPUR AD 00 0 1804 Europe/Andorra 1993-12-23 +3040353 Canal Fosca Canal Fosca 42.6 1.53333 H STM AD 00 0 1695 Europe/Andorra 1993-12-23 +3040354 Canal Fosca Canal Fosca 42.5 1.56667 H STM AD 00 0 1776 Europe/Andorra 1993-12-23 +3040355 Bosc Fosc Bosc Fosc 42.56667 1.66667 V FRST AD 00 0 1938 Europe/Andorra 1993-12-23 +3040356 Pleta del Forquilló Pleta del Forquillo 42.61667 1.7 L GRAZ AD 00 0 2285 Europe/Andorra 1993-12-23 +3040357 Collet de Forns Collet de Forns 42.48333 1.48333 T SPUR AD 00 0 981 Europe/Andorra 1993-12-23 +3040358 Canals de la Forniga Canals de la Forniga 42.5 1.45 H STM AD 00 0 1840 Europe/Andorra 1993-12-23 +3040359 Prat del Fornet Prat del Fornet 42.55 1.61667 L GRAZ AD 00 0 2206 Europe/Andorra 1993-12-23 +3040360 Font del Fornell Font del Fornell 42.45 1.5 H SPNG AD 00 0 1614 Europe/Andorra 1993-12-23 +3040361 Canal del Forn de la Calç Canal del Forn de la Calc 42.55 1.55 H STM AD 00 0 2097 Europe/Andorra 1993-12-23 +3040362 Forn de Cals Forn de Cals 42.56667 1.6 L LCTY AD 00 0 1655 Europe/Andorra 1993-12-23 +3040363 Turó del Forn Turo del Forn 42.63333 1.58333 T PK AD 00 0 2470 Europe/Andorra 1993-12-23 +3040364 Torrent del Forn Torrent del Forn 42.5 1.51667 H STM AD 00 0 1410 Europe/Andorra 1993-12-23 +3040365 Serrat del Forn Serrat del Forn 42.55 1.51667 T SPUR AD 00 0 1397 Europe/Andorra 1993-12-23 +3040366 Roca del Forn Roca del Forn 42.55 1.61667 T RK AD 00 0 2206 Europe/Andorra 1993-12-23 +3040367 Riu del Forn Riu del Forn 42.55 1.6 H STM AD 00 0 2210 Europe/Andorra 1993-12-23 +3040368 Portella del Forn Portella del Forn 42.63333 1.58333 T PASS AD 00 0 2470 Europe/Andorra 1993-12-23 +3040369 Planells del Forn Planells del Forn 42.55 1.6 T UPLD AD 00 0 2210 Europe/Andorra 1993-12-23 +3040370 Obaga del Forn Obaga del Forn 42.48333 1.43333 T SLP AD 00 0 1938 Europe/Andorra 1993-12-23 +3040371 Clots del Forn Clots del Forn 42.63333 1.58333 H RVN AD 00 0 2470 Europe/Andorra 1993-12-23 +3040372 Carretera del Forn Carretera del Forn 42.55 1.58333 R RD AD 00 0 1499 Europe/Andorra 1993-12-23 +3040373 Carrerada del Forn Carrerada del Forn 42.56667 1.63333 R TRL AD 00 0 2016 Europe/Andorra 1993-12-23 +3040374 Canal del Forn Canal del Forn 42.56667 1.51667 H STM AD 00 0 1500 Europe/Andorra 1993-12-23 +3040375 Camí del Forn Cami del Forn 42.55 1.58333 R TRL AD 00 0 1499 Europe/Andorra 1993-12-23 +3040376 Estanys Forcats Estanys Forcats 42.6 1.45 H LKS AD 00 0 2174 Europe/Andorra 1993-12-23 +3040377 Torrent Forcat Torrent Forcat 42.45 1.51667 H STM AD 00 0 1790 Europe/Andorra 1993-12-23 +3040378 Estany Forcat Estany Forcat 42.49439 1.63825 H LK AD 00 0 2538 Europe/Andorra 2011-04-19 +3040379 Estany Forcat Estany Forcat 42.5 1.63333 H LK AD 00 0 2545 Europe/Andorra 1993-12-23 +3040380 Forats de l’Óssa Forats de l'Ossa 42.61667 1.53333 L LCTY AD 00 0 1609 Europe/Andorra 1993-12-23 +3040381 Forat Fosc Forat Fosc 42.55 1.56667 L LCTY AD 00 0 1828 Europe/Andorra 1993-12-23 +3040382 Riu de Forat de Rius Riu de Forat de Rius 42.58333 1.63333 H STM AD 00 0 1722 Europe/Andorra 1993-12-23 +3040383 Collada del Forat de Malhiverns Collada del Forat de Malhiverns 42.6 1.43333 T PASS AD 00 0 2667 Europe/Andorra 1993-12-23 +3040384 Cresta del Forat dels Malhiverns Cresta del Forat dels Malhiverns Cresta del Forat dels Malhiverns 42.6 1.43333 T RDGE AD 00 0 2667 Europe/Andorra 2011-11-05 +3040385 Forat dels Malhiverns Forat dels Malhiverns 42.6 1.45 L LCTY AD 00 0 2174 Europe/Andorra 1993-12-23 +3040386 Forat dels Clots de Massat Forat dels Clots de Massat 42.55 1.7 L LCTY AD 00 0 2358 Europe/Andorra 1993-12-23 +3040387 Forat d’Arau Forat d'Arau 42.56667 1.48333 L LCTY AD 00 0 1508 Europe/Andorra 1993-12-23 +3040388 Coma del Forat Coma del Forat 42.61667 1.48333 H STMH AD 00 0 2470 Europe/Andorra 1993-12-23 +3040389 Font de Fontverd Font de Fontverd 42.5 1.6 H SPNG AD 00 0 2416 Europe/Andorra 1993-12-23 +3040390 Fontverd Fontverd 42.48333 1.6 S RUIN AD 00 0 2250 Europe/Andorra 1993-12-23 +3040391 Fontverd Fontverd 42.5 1.6 A ADMD AD 00 0 2416 Europe/Andorra 1993-12-23 +3040392 Riu de les Fonts de la Tosa Riu de les Fonts de la Tosa 42.6 1.68333 H STM AD 00 0 2089 Europe/Andorra 1993-12-23 +3040393 Tosa de les Fonts Tosa de les Fonts 42.55 1.65 T UPLD AD 00 0 2432 Europe/Andorra 1993-12-23 +3040394 Pic de les Fonts Pic de les Fonts 42.6 1.6 T PK AD 00 0 2143 Europe/Andorra 1993-12-23 +3040395 Pic de les Fonts Pic de les Fonts 42.6 1.48333 T PK AD 00 0 2441 Europe/Andorra 1993-12-23 +3040396 Estany de les Fonts Estany de les Fonts 42.51667 1.66667 H LK AD 00 0 2410 Europe/Andorra 1993-12-23 +3040397 Comella de les Fonts Comella de les Fonts 42.45 1.46667 H STM AD 00 0 935 Europe/Andorra 1993-12-23 +3040398 Clots de les Fonts Clots de les Fonts 42.58333 1.68333 H RVN AD 00 0 2294 Europe/Andorra 1993-12-23 +3040399 Clot de les Fonts Clot de les Fonts 42.55 1.65 H RVN AD 00 0 2432 Europe/Andorra 1993-12-23 +3040400 Clot de les Fonts Clot de les Fonts 42.46667 1.45 H RVN AD 00 0 1562 Europe/Andorra 1993-12-23 +3040401 Clotada de les Fonts Clotada de les Fonts 42.6 1.48333 T SLP AD 00 0 2441 Europe/Andorra 1993-12-23 +3040402 Canal de les Fonts Canal de les Fonts 42.61667 1.51667 H STM AD 00 0 1716 Europe/Andorra 1993-12-23 +3040403 Bosc de les Fonts Bosc de les Fonts 42.56667 1.6 V FRST AD 00 0 1655 Europe/Andorra 1993-12-23 +3040404 Aspre de les Fonts Aspre de les Fonts 42.6 1.48333 V VINS AD 00 0 2441 Europe/Andorra 1993-12-23 +3040405 Bosc de la Font Roja Bosc de la Font Roja 42.55 1.45 V FRST AD 00 0 1788 Europe/Andorra 1993-12-23 +3040406 Collet de Font Podrida Collet de Font Podrida 42.58333 1.46667 T PK AD 00 0 1643 Europe/Andorra 1993-12-23 +3040407 Canal de la Font Llarga Canal de la Font Llarga 42.6 1.65 H STM AD 00 0 2131 Europe/Andorra 1993-12-23 +3040408 Costa de Font Freda Costa de Font Freda 42.63333 1.56667 T SLP AD 00 0 2394 Europe/Andorra 1993-12-23 +3040409 Font de Fontduí Font de Fontdui 42.56667 1.68333 H SPNG AD 00 0 2340 Europe/Andorra 1993-12-23 +3040410 Obaga de la Font dels Pets Obaga de la Font dels Pets 42.6 1.48333 T SLP AD 00 0 2441 Europe/Andorra 1993-12-23 +3040411 Torrent de la Font dels Pals Torrent de la Font dels Pals 42.45 1.51667 H STM AD 00 0 1790 Europe/Andorra 1993-12-23 +3040412 Font del Solà Font del Sola 42.58333 1.66667 H STM AD 00 0 2159 Europe/Andorra 1993-12-23 +3040413 Costa de la Font dels Miquelets Costa de la Font dels Miquelets 42.58333 1.43333 T SLP AD 00 0 2412 Europe/Andorra 1993-12-23 +3040414 Font dels Comellassos Font dels Comellassos 42.6 1.68333 H STM AD 00 0 2089 Europe/Andorra 1993-12-23 +3040415 Bosc de la Font del Pi Bosc de la Font del Pi 42.58333 1.53333 V FRST AD 00 0 1924 Europe/Andorra 1993-12-23 +3040416 Bosc de la Font del Pascol Bosc de la Font del Pascol 42.53333 1.55 V FRST AD 00 0 1344 Europe/Andorra 1993-12-23 +3040417 Serrat de la Font del Mallol Serrat de la Font del Mallol 42.55 1.55 T SPUR AD 00 0 2097 Europe/Andorra 1993-12-23 +3040418 Bosc de la Font del Mallol Bosc de la Font del Mallol 42.55 1.55 V FRST AD 00 0 2097 Europe/Andorra 1993-12-23 +3040419 Canal de la Font del Llop Canal de la Font del Llop 42.55 1.46667 H STM AD 00 0 1585 Europe/Andorra 1993-12-23 +3040420 Bosc de la Font del Gripal Bosc de la Font del Gripal 42.51667 1.5 V FRST AD 00 0 1688 Europe/Andorra 1993-12-23 +3040421 Canal de la Font del Cuc Canal de la Font del Cuc 42.48333 1.51667 H STM AD 00 0 2061 Europe/Andorra 1993-12-23 +3040422 Canal de la Font del Boix Canal de la Font del Boix 42.55 1.48333 H STM AD 00 0 1548 Europe/Andorra 1993-12-23 +3040423 Bosc de la Font del Bisbe Bosc de la Font del Bisbe 42.55 1.46667 V FRST AD 00 0 1585 Europe/Andorra 1993-12-23 +3040424 Barranc de la Font de la Pauca Barranc de la Font de la Pauca 42.56667 1.58333 H STM AD 00 0 1919 Europe/Andorra 1993-12-23 +3040425 Canal de la Font de l’Angleveta Canal de la Font de l'Angleveta 42.53333 1.5 H STM AD 00 0 1357 Europe/Andorra 1993-12-23 +3040426 Planell de la Font de l’Altar Planell de la Font de l'Altar 42.55 1.41667 T UPLD AD 00 0 2105 Europe/Andorra 1993-12-23 +3040427 Canal de la Font de la Gallina Canal de la Font de la Gallina 42.48333 1.46667 H STM AD 00 0 1148 Europe/Andorra 1993-12-23 +3040428 Oratori de la Font de Joans Oratori de la Font de Joans 42.48333 1.48333 S AMTH AD 00 0 981 Europe/Andorra 1993-12-23 +3040429 Basers de la Font de Joans Basers de la Font de Joans 42.48333 1.48333 T CLF AD 00 0 981 Europe/Andorra 1993-12-23 +3040430 Canal de la Font de Gambada Canal de la Font de Gambada 42.56667 1.5 H STM AD 00 0 1636 Europe/Andorra 1993-12-23 +3040431 Fontauzina Fontauzina 42.58333 1.63333 T SLP AD 00 0 1722 Europe/Andorra 1993-12-23 +3040432 Camí de Fontargent Cami de Fontargent 42.61667 1.71667 R TRL AD 00 0 2352 Europe/Andorra 1993-12-23 +3040433 Barranc de la Font Antiga Barranc de la Font Antiga 42.55 1.48333 H STM AD 00 0 1548 Europe/Andorra 1993-12-23 +3040434 Canal de les Fontanelles Canal de les Fontanelles 42.45 1.48333 H STM AD 00 0 1111 Europe/Andorra 1993-12-23 +3040435 Pont de Fontaneda Pont de Fontaneda 42.46667 1.48333 S BDG AD 00 0 1134 Europe/Andorra 1993-12-23 +3040436 Boscarró de Fontaneda Boscarro de Fontaneda 42.45 1.48333 V FRST AD 00 0 1111 Europe/Andorra 1993-12-23 +3040437 Fontaneda Fontaneda 42.45432 1.46402 P PPL AD 06 0 1253 Europe/Andorra 2011-04-19 +3040438 Fontanals del Pui Fontanals del Pui 42.46667 1.48333 H STM AD 00 0 1134 Europe/Andorra 1993-12-23 +3040439 Bosc dels Fontanals Bosc dels Fontanals 42.55 1.58333 V FRST AD 00 0 1499 Europe/Andorra 1993-12-23 +3040440 Font del Fontanal Font del Fontanal 42.46667 1.5 H SPNG AD 00 0 1383 Europe/Andorra 1993-12-23 +3040441 Canal del Fontanal Canal del Fontanal 42.58333 1.65 H RVN AD 00 0 1767 Europe/Andorra 1993-12-23 +3040442 Riu de Font Amagada Riu de Font Amagada 42.53333 1.53333 H STM AD 00 0 1521 Europe/Andorra 1993-12-23 +3040443 Planell de la Font Planell de la Font 42.56667 1.66667 T UPLD AD 00 0 1938 Europe/Andorra 1993-12-23 +3040444 Costa de la Font Costa de la Font 42.53333 1.51667 T SLP AD 00 0 1361 Europe/Andorra 1993-12-23 +3040445 Clot de la Font Clot de la Font 42.6 1.66667 H RVN AD 00 0 1858 Europe/Andorra 1993-12-23 +3040446 Canal de la Font Canal de la Font 42.58333 1.48333 H STM AD 00 0 1809 Europe/Andorra 1993-12-23 +3040447 Clots Fondos Clots Fondos 42.55 1.61667 H RVN AD 00 0 2206 Europe/Andorra 1993-12-23 +3040448 Collada Fonda Collada Fonda Collada Fonda 42.46667 1.63333 T PASS AD 00 0 2619 Europe/Andorra 2011-11-05 +3040449 Canal Fonda Canal Fonda 42.53333 1.61667 H STM AD 00 0 2237 Europe/Andorra 1993-12-23 +3040450 Cortal del Folc Cortal del Folc 42.45 1.5 S CRRL AD 00 0 1614 Europe/Andorra 1993-12-23 +3040451 Planell del Fogal Planell del Fogal 42.63333 1.56667 T UPLD AD 00 0 2394 Europe/Andorra 1993-12-23 +3040452 Planell de les Flores Planell de les Flores 42.61667 1.5 T UPLD AD 00 0 2390 Europe/Andorra 1993-12-23 +3040453 Canal de les Flamies Canal de les Flamies 42.58333 1.61667 H RVN AD 00 0 1707 Europe/Andorra 1993-12-23 +3040454 Roc del Fiter Roc del Fiter 42.45 1.51667 T CLF AD 00 0 1790 Europe/Andorra 1993-12-23 +3040455 Borda del Fiter Borda del Fiter 42.58333 1.61667 S HUT AD 00 0 1707 Europe/Andorra 1993-12-23 +3040456 Canal de la Fita Canal de la Fita 42.53333 1.6 H STM AD 00 0 1888 Europe/Andorra 1993-12-23 +3040457 Bosc de la Fita Bosc de la Fita 42.56667 1.53333 V FRST AD 00 0 1669 Europe/Andorra 1993-12-23 +3040458 Coll de Finestres Coll de Finestres 42.43333 1.55 T SPUR AD 00 0 2178 Europe/Andorra 1993-12-23 +3040459 Coll de la Finestra Coll de la Finestra 42.5 1.53333 T SPUR AD 00 0 1574 Europe/Andorra 1993-12-23 +3040460 Bosc de la Finestra Bosc de la Finestra 42.55 1.46667 V FRST AD 00 0 1585 Europe/Andorra 1993-12-23 +3040461 Canal de les Fijoles Canal de les Fijoles 42.58333 1.48333 H RVN AD 00 0 1809 Europe/Andorra 1993-12-23 +3040462 Canal de Fhasa Canal de Fhasa 42.51667 1.56667 H CNL AD 00 0 1759 Europe/Andorra 1993-12-23 +3040463 Font de Ferrús Font de Ferrus 42.51667 1.51667 H SPNG AD 00 0 1265 Europe/Andorra 1993-12-23 +3040464 Font de Ferro del Planell Gran Font de Ferro del Planell Gran 42.53333 1.6 H SPNG AD 00 0 1888 Europe/Andorra 1993-12-23 +3040465 Font de Ferro Font de Ferro 42.58333 1.58333 H SPNG AD 00 0 1993 Europe/Andorra 1993-12-23 +3040466 Font de Ferro Font de Ferro 42.46667 1.48333 H SPNG AD 00 0 1134 Europe/Andorra 1993-12-23 +3040467 Solana de Ferreroles Solana de Ferreroles 42.6 1.56667 T SLP AD 00 0 2513 Europe/Andorra 1993-12-23 +3040468 Riu de Ferreroles Riu de Ferreroles 42.6 1.53333 H STM AD 00 0 1695 Europe/Andorra 1993-12-23 +3040469 Planells de Ferreroles Planells de Ferreroles 42.6 1.55 T UPLD AD 00 0 2298 Europe/Andorra 1993-12-23 +3040470 Collada de Ferreroles Collada de Ferreroles 42.61667 1.56667 T PASS AD 00 0 2228 Europe/Andorra 1993-12-23 +3040471 Clots de Ferreroles Clots de Ferreroles 42.6 1.56667 H RVN AD 00 0 2513 Europe/Andorra 1993-12-23 +3040472 Pont de Ferreres Pont de Ferreres 42.6 1.53333 S BDG AD 00 0 1695 Europe/Andorra 1993-12-23 +3040473 Font del Feritxet Font del Feritxet 42.51667 1.6 H SPNG AD 00 0 2085 Europe/Andorra 1993-12-23 +3040474 Feritxet Feritxet 42.51667 1.6 A ADMD AD 00 0 2085 Europe/Andorra 1993-12-23 +3040475 Font del Fenoll Font del Fenoll 42.58333 1.46667 H SPNG AD 00 0 1643 Europe/Andorra 1993-12-23 +3040476 Barranc del Fenetau Barranc del Fenetau 42.6 1.66667 H STM AD 00 0 1858 Europe/Andorra 1993-12-23 +3040477 Bosc dels Feners Bosc dels Feners 42.43333 1.5 V FRST AD 00 0 1804 Europe/Andorra 1993-12-23 +3040478 Bordes dels Fenerols Bordes dels Fenerols 42.53333 1.5 S HUTS AD 00 0 1357 Europe/Andorra 1993-12-23 +3040479 Fener Llong Fener Llong 42.55 1.55 L LCTY AD 00 0 2097 Europe/Andorra 1993-12-23 +3040480 Canal de Fener de Cussols Canal de Fener de Cussols 42.53333 1.51667 H STM AD 00 0 1361 Europe/Andorra 1993-12-23 +3040481 Fener de Comadejó Fener de Comadejo 42.5 1.48333 L LCTY AD 00 0 1316 Europe/Andorra 1993-12-23 +3040482 Canal del Fener Blanc Canal del Fener Blanc 42.48333 1.48333 H STM AD 00 0 981 Europe/Andorra 1993-12-23 +3040483 Torrent dels Fenerals Torrent dels Fenerals 42.5 1.45 H STM AD 00 0 1840 Europe/Andorra 1993-12-23 +3040484 Obagues dels Fenerals Obagues dels Fenerals 42.5 1.45 T SLP AD 00 0 1840 Europe/Andorra 1993-12-23 +3040485 Bosc de les Fenemores Bosc de les Fenemores 42.53333 1.48333 V FRST AD 00 0 1677 Europe/Andorra 1993-12-23 +3040486 Borda del Fenemars Borda del Fenemars 42.58333 1.63333 S HUT AD 00 0 1722 Europe/Andorra 1993-12-23 +3040487 Barraca de Fembra Morta Barraca de Fembra Morta 42.56667 1.71667 S HUT AD 00 0 2219 Europe/Andorra 1993-12-23 +3040488 Bosc del Felegrill Bosc del Felegrill 42.53333 1.53333 V FRST AD 00 0 1521 Europe/Andorra 1993-12-23 +3040489 Bosc de les Feixes Bosc de les Feixes 42.55 1.43333 V FRST AD 00 0 1949 Europe/Andorra 1993-12-23 +3040490 Feixar de Setut Feixar de Setut 42.46667 1.63333 L LCTY AD 00 0 2619 Europe/Andorra 1993-12-23 +3040491 Feixar del Baladre Feixar del Baladre 42.65 1.55 L LCTY AD 00 0 2181 Europe/Andorra 1993-12-23 +3040492 Pic del Feixar Pic del Feixar 42.46667 1.63333 T PK AD 00 0 2619 Europe/Andorra 1993-12-23 +3040493 Font del Feixar Font del Feixar 42.46667 1.63333 H SPNG AD 00 0 2619 Europe/Andorra 1993-12-23 +3040494 Feixants de Xixerella Feixants de Xixerella 42.55 1.48333 L LCTY AD 00 0 1548 Europe/Andorra 1993-12-23 +3040495 Feixa de l’Escobar Feixa de l'Escobar 42.43333 1.5 L LCTY AD 00 0 1804 Europe/Andorra 1993-12-23 +3040496 Clots de la Febrerrussa Clots de la Febrerrussa 42.46667 1.55 H RVN AD 00 0 2341 Europe/Andorra 1993-12-23 +3040497 Canal del Favar Canal del Favar 42.51667 1.53333 H STM AD 00 0 1460 Europe/Andorra 1993-12-23 +3040498 Solà de Faucellers Sola de Faucellers 42.45 1.5 T SLP AD 00 0 1614 Europe/Andorra 1993-12-23 +3040499 Pont de Faucellers Pont de Faucellers 42.45 1.5 S BDG AD 00 0 1614 Europe/Andorra 1993-12-23 +3040500 Faucellers Faucellers 42.45 1.5 L LCTY AD 00 0 1614 Europe/Andorra 1993-12-23 +3040501 Serrat de la Farga Serrat de la Farga 42.45 1.53333 T RDGE AD 00 0 1859 Europe/Andorra 1993-12-23 +3040502 Pont de la Farga Pont de la Farga 42.61667 1.53333 S BDG AD 00 0 1609 Europe/Andorra 1993-12-23 +3040503 Barraca de la Farga Barraca de la Farga 42.5 1.6 S HUT AD 00 0 2416 Europe/Andorra 1993-12-23 +3040504 Roc del Far Roc del Far 42.43333 1.5 T RK AD 00 0 1804 Europe/Andorra 1993-12-23 +3040505 Plana del Far Plana del Far 42.48333 1.41667 T SLP AD 00 0 1920 Europe/Andorra 1993-12-23 +3040506 Fangots de Moretó Fangots de Moreto 42.55 1.68333 L LCTY AD 00 0 2254 Europe/Andorra 1993-12-23 +3040507 Fangots dels Maians Fangots dels Maians 42.55 1.61667 L LCTY AD 00 0 2206 Europe/Andorra 1993-12-23 +3040508 Fangot Gran Fangot Gran 42.53333 1.63333 L LCTY AD 00 0 2360 Europe/Andorra 1993-12-23 +3040509 Canya de les Falgueres Canya de les Falgueres 42.45 1.46667 S CAVE AD 00 0 935 Europe/Andorra 1993-12-23 +3040510 Falconeres Falconeres 42.55 1.7 L LCTY AD 00 0 2358 Europe/Andorra 1993-12-23 +3040511 Serra de Falcobí Serra de Falcobi 42.63333 1.55 T MT AD 00 0 2053 Europe/Andorra 1993-12-23 +3040512 Canya dels Eucassers Canya dels Eucassers 42.55 1.61667 S CAVE AD 00 0 2206 Europe/Andorra 1993-12-23 +3040513 Cabana de l' Eucasser Cabana de l' Eucasser 42.63086 1.48341 S HUT AD 07 0 2111 Europe/Andorra 2007-03-04 +3040514 Cabana de l’ Eucasser Cabana de l' Eucasser 42.61667 1.56667 S HUT AD 00 0 2228 Europe/Andorra 1993-12-23 +3040515 Cabana de l’ Eucasser Cabana de l' Eucasser 42.58333 1.61667 S HUT AD 00 0 1707 Europe/Andorra 1993-12-23 +3040516 Pala Estreta Pala Estreta 42.55 1.7 T SLP AD 00 0 2358 Europe/Andorra 1993-12-23 +3040517 Torrent Estret Torrent Estret 42.53333 1.56667 H STM AD 00 0 1418 Europe/Andorra 1993-12-23 +3040518 Cortal de Estevet Cortal de Estevet 42.5 1.53333 S CRRL AD 00 0 1574 Europe/Andorra 1993-12-23 +3040519 Collada dels Estanys Forcats Collada dels Estanys Forcats Collada dels Estanys Forcats 42.6 1.45 T PK AD 00 0 2174 Europe/Andorra 2011-11-05 +3040520 Clots de l’ Estany Segon Clots de l' Estany Segon 42.61667 1.73333 H RVN AD 00 0 2508 Europe/Andorra 1993-12-23 +3040521 Estanys de Tristaina Estanys de Tristaina 42.64217 1.48615 H LKS AD 07 0 2530 Europe/Andorra 2007-04-29 +3040522 Estanys del Pessons Estanys del Pessons 42.51667 1.66667 L LCTY AD 00 0 2410 Europe/Andorra 1993-12-23 +3040523 Estanys de l’Obac Estanys de l'Obac 42.51667 1.66667 L LCTY AD 00 0 2410 Europe/Andorra 1993-12-23 +3040524 Estanys de la Solana Estanys de la Solana 42.53333 1.66667 L LCTY AD 00 0 2489 Europe/Andorra 1993-12-23 +3040525 Estanys de Juclar Estanys de Juclar 42.61667 1.71667 L LCTY AD 00 0 2352 Europe/Andorra 1993-12-23 +3040526 Serra dels Estanys Serra dels Estanys 42.58333 1.58333 T RDGE AD 00 0 1993 Europe/Andorra 1993-12-23 +3040527 Riu dels Estanys Riu dels Estanys 42.6 1.61667 H STM AD 00 0 2271 Europe/Andorra 1993-12-23 +3040528 Collada dels Estanys Collada dels Estanys 42.58333 1.58333 T PASS AD 00 0 1993 Europe/Andorra 1993-12-23 +3040529 Camí dels Estanys Cami dels Estanys 42.48333 1.65 R TRL AD 00 0 2658 Europe/Andorra 1993-12-23 +3040530 Cabana dels Estanys Cabana dels Estanys 42.48333 1.65 S HUT AD 00 0 2658 Europe/Andorra 1993-12-23 +3040531 Estanyons de Banyell Estanyons de Banyell 42.65 1.56667 L LCTY AD 00 0 2471 Europe/Andorra 1993-12-23 +3040532 Pic dels Estanyons Pic dels Estanyons Pic dels Estanyons,Toseta de la Colilla,Tosseta de la Caulla,Tosseta de la Caülla 42.46667 1.61667 T PK AD 00 0 2448 Europe/Andorra 2011-11-05 +3040533 Estanys dels Estanyons Estanys dels Estanyons 42.46667 1.61667 H LKS AD 00 0 2448 Europe/Andorra 1993-12-23 +3040534 Canals Tancades dels Estanyons Canals Tancades dels Estanyons 42.46667 1.63333 H RVN AD 00 0 2619 Europe/Andorra 1993-12-23 +3040535 Bosc dels Estanyons Bosc dels Estanyons 42.48333 1.63333 V FRST AD 00 0 2296 Europe/Andorra 1993-12-23 +3040536 Serra de l’ Estanyó Serra de l' Estanyo 42.6 1.58333 T MT AD 00 0 2461 Europe/Andorra 1993-12-23 +3040537 Saleres de l’ Estanyó Saleres de l' Estanyo 42.61667 1.56667 L SALT AD 00 0 2228 Europe/Andorra 1993-12-23 +3040538 Riu de l’ Estanyó Riu de l' Estanyo 42.61667 1.56667 H STM AD 00 0 2228 Europe/Andorra 1993-12-23 +3040539 Pic de l’ Estanyó Pic de l' Estanyo Montagne de l' Estanyo,Montagne de l’ Estanyó,Pic de l' Estanyo,Pic de l’ Estanyó 42.6088 1.59235 T PK AD 00 0 2709 Europe/Andorra 2011-11-05 +3040540 Estret de l’ Estanyó Estret de l' Estanyo 42.61667 1.56667 T PASS AD 00 0 2228 Europe/Andorra 1993-12-23 +3040541 Estany de l’ Estanyó Estany de l' Estanyo 42.61667 1.58333 H LK AD 00 0 2374 Europe/Andorra 1993-12-23 +3040542 Clots de l’ Estanyó Clots de l' Estanyo 42.61667 1.58333 H STMH AD 00 0 2374 Europe/Andorra 1993-12-23 +3040543 Canals de l’ Estanyó Canals de l' Estanyo 42.6 1.58333 H RVN AD 00 0 2461 Europe/Andorra 1993-12-23 +3040544 Serrat de l’ Estany Negre Serrat de l' Estany Negre 42.58333 1.43333 T SPUR AD 00 0 2412 Europe/Andorra 1993-12-23 +3040545 Rocs de l’ Estany Negre Rocs de l' Estany Negre 42.58333 1.43333 T RKS AD 00 0 2412 Europe/Andorra 1993-12-23 +3040546 Basses de l’ Estany Negre Basses de l' Estany Negre 42.58333 1.43333 H LK AD 00 0 2412 Europe/Andorra 1993-12-23 +3040547 Bony de l’ Estany Mort Bony de l' Estany Mort 42.61667 1.61667 T SPUR AD 00 0 2352 Europe/Andorra 1993-12-23 +3040548 Roc de l’ Estany Moreno Roc de l' Estany Moreno 42.51667 1.63333 T CLF AD 00 0 2379 Europe/Andorra 1993-12-23 +3040549 Pala de l’ Estany Gran Pala de l' Estany Gran 42.6 1.58333 T CLF AD 00 0 2461 Europe/Andorra 1993-12-23 +3040550 Riu de l' Estany Esbalçat Riu de l' Estany Esbalcat 42.63612 1.51736 H STM AD 07 0 2334 Europe/Andorra 2007-03-04 +3040551 Port de l’ Estany Esbalçat Port de l' Estany Esbalcat 42.65 1.51667 T PASS AD 00 0 2546 Europe/Andorra 1993-12-23 +3040552 Costa de l’ Estany de Més Avall Costa de l' Estany de Mes Avall 42.6 1.48333 T SPUR AD 00 0 2441 Europe/Andorra 1993-12-23 +3040553 Clots de l’ Estany de Més Avall Clots de l' Estany de Mes Avall 42.6 1.48333 T TAL AD 00 0 2441 Europe/Andorra 1993-12-23 +3040554 Costa de l’ Estany de Més Amunt Costa de l' Estany de Mes Amunt 42.61667 1.48333 T SLP AD 00 0 2470 Europe/Andorra 1993-12-23 +3040555 Costa de l’ Estany del Mig Costa de l' Estany del Mig 42.65 1.48333 T SLP AD 00 0 2341 Europe/Andorra 1993-12-23 +3040556 Canals d’Amunt de l’ Estany del Mig Canals d'Amunt de l' Estany del Mig 42.6 1.48333 H RVN AD 00 0 2441 Europe/Andorra 1993-12-23 +3040557 Riu de l’ Estany de l’Isla Riu de l' Estany de l'Isla 42.61667 1.7 H STM AD 00 0 2285 Europe/Andorra 1993-12-23 +3040558 Canal de l’ Estany de l’Isla Canal de l' Estany de l'Isla 42.61667 1.68333 H RVN AD 00 0 2406 Europe/Andorra 1993-12-23 +3040559 Solana de l’ Estany de l’Illa Solana de l' Estany de l'Illa 42.5 1.65 T SLP AD 00 0 2542 Europe/Andorra 1993-12-23 +3040560 Baser de l’ Estany de les Truites Baser de l' Estany de les Truites 42.56667 1.43333 T CLF AD 00 0 2402 Europe/Andorra 1993-12-23 +3040561 Turó de l’ Estany de la Nou Turo de l' Estany de la Nou 42.46667 1.58333 T SPUR AD 00 0 2367 Europe/Andorra 1993-12-23 +3040562 Camí de l’ Estany de la Nou Cami de l' Estany de la Nou 42.48333 1.58333 R TRL AD 00 0 2349 Europe/Andorra 1993-12-23 +3040563 Riu de l' Estany de Creussans Riu de l' Estany de Creussans 42.63292 1.47976 H STM AD 07 0 2283 Europe/Andorra 2007-03-04 +3040564 Vial de l’ Estany Blau Vial de l' Estany Blau 42.5 1.61667 R RD AD 00 0 2560 Europe/Andorra 1993-12-23 +3040565 Turo de l’ Estany Blau Turo de l' Estany Blau 42.5 1.61667 T PK AD 00 0 2560 Europe/Andorra 1993-12-23 +3040566 Riu de l’ Estany Blau Riu de l' Estany Blau 42.5 1.61667 H STM AD 00 0 2560 Europe/Andorra 1993-12-23 +3040567 Canals de l’ Estany Blau Canals de l' Estany Blau 42.5 1.6 H RVN AD 00 0 2416 Europe/Andorra 1993-12-23 +3040568 Serrat de l’ Estany Serrat de l' Estany 42.51667 1.56667 T MT AD 00 0 1759 Europe/Andorra 1993-12-23 +3040569 Riu de l’ Estany Riu de l' Estany 42.58333 1.43333 H STM AD 00 0 2412 Europe/Andorra 1993-12-23 +3040570 Pla de l’ Estany Pla de l' Estany 42.6 1.46667 T UPLD AD 00 0 2421 Europe/Andorra 1993-12-23 +3040571 Pleta de l’ Estall Serrer Pleta de l' Estall Serrer 42.48333 1.61667 L GRAZ AD 00 0 2217 Europe/Andorra 1993-12-23 +3040572 Planells de l’ Estall Serrer Planells de l' Estall Serrer 42.48333 1.61667 T UPLD AD 00 0 2217 Europe/Andorra 1993-12-23 +3040573 Canals de l’ Estall Serrer Canals de l' Estall Serrer 42.48333 1.61667 H RVN AD 00 0 2217 Europe/Andorra 1993-12-23 +3040574 Bosc de l’ Estall Serrer Bosc de l' Estall Serrer 42.48333 1.61667 V FRST AD 00 0 2217 Europe/Andorra 1993-12-23 +3040575 Estall Serrer Estall Serrer 42.48333 1.61667 L LCTY AD 00 0 2217 Europe/Andorra 1993-12-23 +3040576 Estall Serrer Estall Serrer 42.46667 1.61667 A ADMD AD 00 0 2448 Europe/Andorra 1993-12-23 +3040577 Roc de l’ Estall Roc de l' Estall 42.5 1.58333 T RK AD 00 0 1888 Europe/Andorra 1993-12-23 +3040578 Planell de l’ Estall Planell de l' Estall 42.55 1.55 T UPLD AD 00 0 2097 Europe/Andorra 1993-12-23 +3040579 Collada de l’ Estall Collada de l' Estall 42.55 1.55 T PASS AD 00 0 2097 Europe/Andorra 1993-12-23 +3040580 Carretera de l’ Estall Carretera de l' Estall 42.53333 1.53333 R RD AD 00 0 1521 Europe/Andorra 1993-12-23 +3040581 Borda de l’ Estall Borda de l' Estall 42.55 1.55 S HUT AD 00 0 2097 Europe/Andorra 1993-12-23 +3040582 Pleta de l’ Estaleritx Pleta de l' Estaleritx 42.61667 1.55 L GRAZ AD 00 0 2007 Europe/Andorra 1993-12-23 +3040583 Collada de l’ Estaleritx Collada de l' Estaleritx 42.61667 1.55 T SPUR AD 00 0 2007 Europe/Andorra 1993-12-23 +3040584 Pont dels Esquirols Pont dels Esquirols 42.56667 1.48333 S BDG AD 00 0 1508 Europe/Andorra 1993-12-23 +3040585 Roc de les Esquiroles Roc de les Esquiroles 42.46667 1.5 T RK AD 00 0 1383 Europe/Andorra 1993-12-23 +3040586 Roc de les Esquiroles Roc de les Esquiroles 42.45 1.48333 T RK AD 00 0 1111 Europe/Andorra 1993-12-23 +3040587 Canal de les Esquiroles Canal de les Esquiroles 42.45 1.48333 H STM AD 00 0 1111 Europe/Andorra 1993-12-23 +3040588 Roc d’ Esquers Roc d' Esquers 42.5 1.55 T RK AD 00 0 1566 Europe/Andorra 1993-12-23 +3040589 Roc de l’ Espluga Roc de l' Espluga 42.46667 1.46667 T RK AD 00 0 1340 Europe/Andorra 1993-12-23 +3040590 Planell de l’ Espluga Planell de l' Espluga 42.46667 1.46667 T UPLD AD 00 0 1340 Europe/Andorra 1993-12-23 +3040591 Tosa dels Espiolets Tosa dels Espiolets 42.55 1.65 T UPLD AD 00 0 2432 Europe/Andorra 1993-12-23 +3040592 Espeluga Espeluga 42.56667 1.43333 L LCTY AD 00 0 2402 Europe/Andorra 1993-12-23 +3040593 Espeluga Espeluga 42.53333 1.55 A ADMD AD 00 0 1344 Europe/Andorra 1993-12-23 +3040594 Pont de l’ Espalmera Pont de l' Espalmera 42.55 1.46667 S BDG AD 00 0 1585 Europe/Andorra 1993-12-23 +3040595 Riu de l’ Escobet Riu de l' Escobet 42.46667 1.51667 H STM AD 00 0 1985 Europe/Andorra 1993-12-23 +3040596 Escobet Escobet 42.46667 1.51667 L LCTY AD 00 0 1985 Europe/Andorra 1993-12-23 +3040597 Cylindre d’ Ascobes Cylindre d' Ascobes Cylindre d' Ascobes,Cylindre d’ Ascobes,Pic d' Escobes,Pic d’ Escobes 42.6 1.73333 T PK AD 00 0 2383 Europe/Andorra 2011-11-05 +3040598 Comella dels Esclops Comella dels Esclops 42.43333 1.48333 H STM AD 00 0 1228 Europe/Andorra 1993-12-23 +3040599 Solà d’ Escàs Sola d' Escas 42.55 1.5 T SLP AD 00 0 1292 Europe/Andorra 1993-12-23 +3040600 Camí d’ Escàs Cami d' Escas 42.55 1.5 R TRL AD 00 0 1292 Europe/Andorra 1993-12-23 +3040601 Escàs Escas 42.54643 1.50895 P PPL AD 04 0 1257 Europe/Andorra 2011-04-19 +3040602 Roc d’ Escalluquer Roc d' Escalluquer 42.55 1.5 T CLF AD 00 0 1292 Europe/Andorra 1993-12-23 +3040603 Bosc d’ Escalluquer Bosc d' Escalluquer 42.55 1.5 V FRST AD 00 0 1292 Europe/Andorra 1993-12-23 +3040604 Escalluquer Escalluquer 42.55 1.5 A ADMD AD 00 0 1292 Europe/Andorra 1993-12-23 +3040605 Canal de l’ Escalella Canal de l' Escalella 42.5 1.45 H STM AD 00 0 1840 Europe/Andorra 1993-12-23 +3040606 Vial de l’ Escala Vial de l' Escala 42.48333 1.5 R RD AD 00 0 1631 Europe/Andorra 1993-12-23 +3040607 Estany Esbalçat Estany Esbalcat 42.64002 1.51371 H LK AD 07 0 2130 Europe/Andorra 2007-03-04 +3040608 Obac d’ Erts Obac d' Erts 42.56667 1.5 T SLP AD 00 0 1636 Europe/Andorra 1993-12-23 +3040609 Erts Erts Ercs,Ercz,Erez 42.56218 1.4968 P PPL AD AD 04 0 1430 Europe/Andorra 2007-04-16 +3040610 Costa de les Eroles Costa de les Eroles 42.56667 1.45 T SLP AD 00 0 2137 Europe/Andorra 1993-12-23 +3040611 Solana de l’ Era de Mitges Solana de l' Era de Mitges 42.46667 1.45 T SLP AD 00 0 1562 Europe/Andorra 1993-12-23 +3040612 Refugi d’ Envalira Refugi d' Envalira 42.53333 1.68333 S RSRT AD 00 0 2322 Europe/Andorra 1993-12-23 +3040613 Port d’ Envalira Port d' Envalira Port d' Envalira,Port d’ Envalira,Puerto d' Envalira,Puerto d’ Envalira 42.54041 1.71897 T PASS AD 00 0 2230 Europe/Andorra 2011-11-05 +3040615 Bordes d’ Envalira Bordes d' Envalira Bordas d' Envalira,Bordas d’ Envalira,Bordes d' Envalira,Bordes d’ Envalira 42.56667 1.68333 S HUTS AD 00 0 2340 Europe/Andorra 2011-11-05 +3040616 Envalira Envalira 42.53333 1.7 A ADMD AD 00 0 2357 Europe/Andorra 1993-12-23 +3040617 Solà d’ Entremesaiqües Sola d' Entremesaiques 42.50094 1.55771 T SLP AD 00 0 1621 Europe/Andorra 2011-04-19 +3040618 Pont d’ Entremesaigües Pont d' Entremesaigues 42.5 1.56667 S BDG AD 00 0 1776 Europe/Andorra 1993-12-23 +3040619 Entremesaigües Entremesaigues 42.49692 1.55577 L LCTY AD 00 0 1566 Europe/Andorra 2011-04-19 +3040620 Roca Entravessada Roca Entravessada 42.5986 1.44241 T SPUR AD 00 0 2406 Europe/Andorra 2011-04-19 +3040621 Font de les Entrades Font de les Entrades 42.56667 1.48333 H SPNG AD 00 0 1508 Europe/Andorra 1993-12-23 +3040622 Bosc de l’ Entrada Bosc de l' Entrada 42.55 1.46667 V FRST AD 00 0 1585 Europe/Andorra 1993-12-23 +3040623 Camí d’ Entor Cami d' Entor 42.58333 1.63333 R TRL AD 00 0 1722 Europe/Andorra 1993-12-23 +3040624 Bosc d’ Entor Bosc d' Entor 42.58333 1.65 V FRST AD 00 0 1767 Europe/Andorra 1993-12-23 +3040625 Entor Entor 42.6 1.65 A ADMD AD 00 0 2131 Europe/Andorra 1993-12-23 +3040626 Collada d’ Entinyola Collada d' Entinyola 42.51667 1.65 T PASS AD 00 0 2633 Europe/Andorra 1993-12-23 +3040627 Clots d’ Entinyac Clots d' Entinyac 42.58333 1.68333 H STMH AD 00 0 2294 Europe/Andorra 1993-12-23 +3040628 Tarteres d’ Entalàs Tarteres d' Entalas 42.53333 1.63333 T TAL AD 00 0 2360 Europe/Andorra 1993-12-23 +3040629 Canals d’ Entalàs Canals d' Entalas 42.53333 1.63333 H RVN AD 00 0 2360 Europe/Andorra 1993-12-23 +3040630 Bosc d’ En Som Bosc d' En Som 42.56667 1.58333 V FRST AD 00 0 1919 Europe/Andorra 1993-12-23 +3040631 Serra de l’ Ensegur Serra de l' Ensegur 42.58333 1.55 T RDGE AD 00 0 2357 Europe/Andorra 1993-12-23 +3040632 Riu de l’ Ensegur Riu de l' Ensegur 42.6 1.53333 H STM AD 00 0 1695 Europe/Andorra 1993-12-23 +3040633 Obaga de l’ Ensegur Obaga de l' Ensegur 42.58333 1.55 T SLP AD 00 0 2357 Europe/Andorra 1993-12-23 +3040634 Collada de l’ Ensegur Collada de l' Ensegur 42.58333 1.53333 T PASS AD 00 0 1924 Europe/Andorra 1993-12-23 +3040635 Clot de l’ Ensegur Clot de l' Ensegur 42.58333 1.55 H RVN AD 00 0 2357 Europe/Andorra 1993-12-23 +3040636 Camí de l’ Ensegur Cami de l' Ensegur 42.58333 1.53333 R TRL AD 00 0 1924 Europe/Andorra 1993-12-23 +3040637 Bosc de l’ Ensegur Bosc de l' Ensegur 42.6 1.55 V FRST AD 00 0 2298 Europe/Andorra 1993-12-23 +3040638 Bordes de l’ Ensegur Bordes de l' Ensegur 42.58333 1.55 S HUTS AD 00 0 2357 Europe/Andorra 1993-12-23 +3040639 Aspres de l’ Ensegur Aspres de l' Ensegur 42.58333 1.55 V VINS AD 00 0 2357 Europe/Andorra 1993-12-23 +3040640 Solana d’ Ensagents Solana d' Ensagents 42.51667 1.63333 T SLP AD 00 0 2379 Europe/Andorra 1993-12-23 +3040641 Riu d’ Ensagents Riu d' Ensagents 42.52752 1.6099 H STM AD 00 0 2101 Europe/Andorra 2011-04-19 +3040642 Obaga d’ Ensagents Obaga d' Ensagents 42.51667 1.63333 T SLP AD 00 0 2379 Europe/Andorra 1993-12-23 +3040643 Estanys d’ Ensagents Estanys d' Ensagents 42.52041 1.64793 H LKS AD 00 0 2627 Europe/Andorra 2011-04-19 +3040644 Ensagents Ensagents 42.51667 1.65 A ADMD AD 00 0 2633 Europe/Andorra 1993-12-23 +3040645 Costa d’ Enradort Costa d' Enradort 42.53333 1.66667 T SLP AD 00 0 2489 Europe/Andorra 1993-12-23 +3040646 Collada d’ Enradort Collada d' Enradort 42.53333 1.66667 T PASS AD 00 0 2489 Europe/Andorra 1993-12-23 +3040647 Rec d’ Engordany Rec d' Engordany 42.51667 1.53333 H CNL AD 00 0 1460 Europe/Andorra 1993-12-23 +3040648 Engordany Engordany Engordany 42.51115 1.54118 P PPL AD 08 0 1139 Europe/Andorra 2007-04-05 +3040649 Pla d’ Engolasters Pla d' Engolasters 42.5 1.56667 T UPLD AD 00 0 1776 Europe/Andorra 1993-12-23 +3040650 Estany d'Engolasters Estany d'Engolasters 42.51966 1.56772 H LK AD 07 0 1615 1759 Europe/Andorra 2007-04-05 +3040651 Carretera d’ Engolasters Carretera d' Engolasters 42.51667 1.56667 R RD AD 00 0 1759 Europe/Andorra 1993-12-23 +3040652 Canal d’ Engolasters Canal d' Engolasters 42.53333 1.6 H CNL AD 00 0 1888 Europe/Andorra 1993-12-23 +3040653 Engolasters Engolasters 42.5 1.56667 A ADMD AD 00 0 1776 Europe/Andorra 1993-12-23 +3040654 Estany d’ Engaït Estany d' Engait 42.51667 1.71667 H LK AD 00 0 2591 Europe/Andorra 1993-12-23 +3040655 Engaït Engait 42.51667 1.71667 A ADMD AD 00 0 2591 Europe/Andorra 1993-12-23 +3040656 Serrat de l’ Enfreu Serrat de l' Enfreu 42.56667 1.56667 T RDGE AD 00 0 2089 Europe/Andorra 1993-12-23 +3040657 Riu de l’ Enfreu Riu de l' Enfreu 42.56667 1.55 H STM AD 00 0 1996 Europe/Andorra 1993-12-23 +3040658 Bosc de l’ Enfreu Bosc de l' Enfreu 42.56667 1.55 V FRST AD 00 0 1996 Europe/Andorra 1993-12-23 +3040659 Borda d’ Endrieta Borda d' Endrieta 42.55 1.58333 S HUT AD 00 0 1499 Europe/Andorra 1993-12-23 +3040660 Obaga d’ Encortesa Obaga d' Encortesa 42.45 1.51667 T SLP AD 00 0 1790 Europe/Andorra 1993-12-23 +3040661 Carretera Encortesa Carretera Encortesa 42.45 1.5 R RD AD 00 0 1614 Europe/Andorra 1993-12-23 +3040662 Encortesa Encortesa 42.45 1.51667 L LCTY AD 00 0 1790 Europe/Andorra 1993-12-23 +3040663 Camí d’ Encodina Cami d' Encodina 42.63333 1.53333 R TRL AD 00 0 2072 Europe/Andorra 1993-12-23 +3040664 Encodina Encodina 42.63333 1.53333 L LCTY AD 00 0 2072 Europe/Andorra 1993-12-23 +3040665 Serra d’ Enclar Serra d' Enclar 42.51408 1.48329 T RDGE AD 00 0 2069 Europe/Andorra 2011-04-19 +3040666 Riu d’ Enclar Riu d' Enclar 42.49067 1.49562 H STM AD 00 0 1353 Europe/Andorra 2011-04-19 +3040667 Prat d’ Enclar Prat d' Enclar 42.5 1.48333 L GRAZ AD 00 0 1316 Europe/Andorra 1993-12-23 +3040668 Bony de Garci Bony de Garci Bony de Garci,Pic d' Enclar,Pic d’ Enclar,Puig de Ancla,Puig de Anclá 42.51667 1.46667 T PK AD 00 0 1840 Europe/Andorra 2011-11-05 +3040669 Camí d’ Enclar Cami d' Enclar 42.5 1.48333 R TRL AD 00 0 1316 Europe/Andorra 1993-12-23 +3040670 Bosc d’ Enclar Bosc d' Enclar 42.48333 1.48333 V FRST AD 00 0 981 Europe/Andorra 1993-12-23 +3040671 Font de l’ Enciam Font de l' Enciam 42.61667 1.51667 H SPNG AD 00 0 1716 Europe/Andorra 1993-12-23 +3040672 Carrerons d’ Encenrera Carrerons d' Encenrera 42.53333 1.68333 R TRL AD 00 0 2322 Europe/Andorra 1993-12-23 +3040673 Encenrera Encenrera 42.53333 1.68333 L LCTY AD 00 0 2322 Europe/Andorra 1993-12-23 +3040674 Clots d’ Encarners Clots d' Encarners 42.6 1.58333 H RVN AD 00 0 2461 Europe/Andorra 1993-12-23 +3040675 Basera d’ Encarners Basera d' Encarners 42.5 1.45 T CLF AD 00 0 1840 Europe/Andorra 1993-12-23 +3040676 Basera d’ Encarners Basera d' Encarners 42.46667 1.55 T CLF AD 00 0 2341 Europe/Andorra 1993-12-23 +3040677 Solà d’ Encampadana Sola d' Encampadana 42.55 1.61667 T SLP AD 00 0 2206 Europe/Andorra 1993-12-23 +3040678 Pic d’ Encampadana Pic d' Encampadana Pic d' Encampadana,Pic d’ Encampadana,Tossa d' Encampdana,Tossa d’ Encampdana,Tossal d' Encampdana,Tossal d’ Encampdana 42.5552 1.63153 T PK AD 00 0 2364 Europe/Andorra 2011-11-05 +3040679 Obaga d’ Encampadana Obaga d' Encampadana 42.55 1.61667 T SLP AD 00 0 2206 Europe/Andorra 1993-12-23 +3040680 Font d’ Encampadana Font d' Encampadana 42.55 1.61667 H SPNG AD 00 0 2206 Europe/Andorra 1993-12-23 +3040681 Clot d’ Encampadana Clot d' Encampadana 42.55 1.61667 H RVN AD 00 0 2206 Europe/Andorra 1993-12-23 +3040682 Encampadana Encampadana 42.56667 1.61667 A ADMD AD 00 0 1920 Europe/Andorra 1993-12-23 +3040683 Serra d’ Encamp Serra d' Encamp 42.53333 1.55 T RDGE AD 00 0 1344 Europe/Andorra 1993-12-23 +3040684 Parròquia d'Encamp Parroquia d'Encamp Encamp,Parroquia d'Encamp,Parròquia d'Encamp 42.53333 1.63333 A ADM1 AD 03 13685 2360 Europe/Andorra 2008-03-17 +3040685 Estany d’ Encamp Estany d' Encamp 42.5 1.65 H LK AD 00 0 2542 Europe/Andorra 1993-12-23 +3040686 Encamp Encamp Ehnkam,Encamp,en kan pu,enkanpu jiao qu,Энкам,エンカンプ教区,恩坎普 42.53451 1.5767 P PPLA AD 03 11223 1309 Europe/Andorra 2011-11-05 +3040687 Borda d’ En Cadena Borda d' En Cadena 42.53333 1.56667 S HUT AD 00 0 1418 Europe/Andorra 1993-12-23 +3040688 Pleta d’ Emportona Pleta d' Emportona 42.53333 1.65 L GRAZ AD 00 0 2508 Europe/Andorra 1993-12-23 +3040689 Emportona Emportona 42.53333 1.65 A ADMD AD 00 0 2508 Europe/Andorra 1993-12-23 +3040690 Riu de l’ Empallador Riu de l' Empallador 42.53333 1.7 H STM AD 00 0 2357 Europe/Andorra 1993-12-23 +3040691 Canal de l’ Embut Canal de l' Embut 42.58333 1.48333 H RVN AD 00 0 1809 Europe/Andorra 1993-12-23 +3040692 Clots d’ Embolcar Clots d' Embolcar 42.61667 1.61667 T CRQS AD 00 0 2352 Europe/Andorra 1993-12-23 +3040693 Basers d’ Embolcar Basers d' Embolcar 42.61667 1.61667 T CLF AD 00 0 2352 Europe/Andorra 1993-12-23 +3040694 El Vilar El Vilar El Vilar 42.57226 1.60781 P PPL AD 02 0 1655 Europe/Andorra 2011-11-05 +3040695 El Vedat El Vedat 42.46667 1.48333 A ADMD AD 00 0 1134 Europe/Andorra 1993-12-23 +3040696 El Turer El Turer 42.56667 1.53333 T SPUR AD 00 0 1669 Europe/Andorra 1993-12-23 +3040697 El Trillar El Trillar 42.46667 1.5 L LCTY AD 00 0 1383 Europe/Andorra 1993-12-23 +3040698 El Tremat El Tremat 42.53348 1.58056 P PPL AD 03 0 1309 Europe/Andorra 2011-04-19 +3040699 El Torrentill El Torrentill 42.45 1.48333 H STM AD 00 0 1111 Europe/Andorra 1993-12-23 +3040700 El Tarter El Tarter 42.58026 1.64902 P PPL AD 02 0 1737 Europe/Andorra 2007-04-16 +3040701 El Tamany El Tamany 42.63333 1.51667 T SLP AD 00 0 1894 Europe/Andorra 1993-12-23 +3040702 Els Tarters Els Tarters 42.56667 1.68333 L LCTY AD 00 0 2340 Europe/Andorra 1993-12-23 +3040703 Els Tarterals Els Tarterals 42.48333 1.51667 L LCTY AD 00 0 2061 Europe/Andorra 1993-12-23 +3040704 Els Rebolians Els Rebolians 42.53333 1.51667 L LCTY AD 00 0 1361 Europe/Andorra 1993-12-23 +3040705 Els Quatre Rocs Els Quatre Rocs 42.46667 1.53333 T RKS AD 00 0 2332 Europe/Andorra 1993-12-23 +3040706 Els Pujols Els Pujols 42.48333 1.48333 L LCTY AD 00 0 981 Europe/Andorra 1993-12-23 +3040707 Els Puiols Els Puiols 42.56667 1.63333 L LCTY AD 00 0 2016 Europe/Andorra 1993-12-23 +3040708 Els Pletius Els Pletius 42.61667 1.68333 L LCTY AD 00 0 2406 Europe/Andorra 1993-12-23 +3040709 Els Plans Els Plans 42.58142 1.63273 P PPL AD 02 0 1722 Europe/Andorra 2011-04-19 +3040710 Els Plans Els Plans 42.45084 1.50641 L LCTY AD 00 0 1394 Europe/Andorra 2011-04-19 +3040711 Els Plans Els Plans 42.45 1.5 S FRM AD 00 0 1614 Europe/Andorra 1993-12-23 +3040712 Els Plans Els Plans 42.53333 1.51667 A ADMD AD 00 0 1361 Europe/Andorra 1993-12-23 +3040713 Els Pessons Els Pessons 42.51667 1.66667 A ADMD AD 00 0 2410 Europe/Andorra 1993-12-23 +3040714 Els Pallers Els Pallers 42.56667 1.75 L LCTY AD 00 0 1923 Europe/Andorra 1993-12-23 +3040715 Els Pallerils Els Pallerils 42.58333 1.53333 L LCTY AD 00 0 1924 Europe/Andorra 1993-12-23 +3040716 Els Padals Els Padals 42.58333 1.66667 L LCTY AD 00 0 2159 Europe/Andorra 1993-12-23 +3040717 Els Orris Els Orris 42.55 1.46667 L LCTY AD 00 0 1585 Europe/Andorra 1993-12-23 +3040718 Els Oriosos Els Oriosos 42.53333 1.53333 L LCTY AD 00 0 1521 Europe/Andorra 1993-12-23 +3040719 El Solà El Sola 42.55 1.53333 L LCTY AD 00 0 1593 Europe/Andorra 1993-12-23 +3040720 Els Obacs Els Obacs 42.6 1.5 T SLP AD 00 0 1923 Europe/Andorra 1993-12-23 +3040721 Els Obacs Els Obacs 42.55 1.48333 L LCTY AD 00 0 1548 Europe/Andorra 1993-12-23 +3040722 Els Maians Els Maians 42.55 1.61667 L LCTY AD 00 0 2206 Europe/Andorra 1993-12-23 +3040723 Els Llacs Els Llacs 42.53333 1.41667 T UPLD AD 00 0 1948 Europe/Andorra 1993-12-23 +3040724 Els Indrets Els Indrets 42.48333 1.45 L LCTY AD 00 0 1195 Europe/Andorra 1993-12-23 +3040725 Els Hortells Els Hortells 42.45 1.5 L LCTY AD 00 0 1614 Europe/Andorra 1993-12-23 +3040726 Els Graus Els Graus 42.56667 1.73333 L LCTY AD 00 0 2096 Europe/Andorra 1993-12-23 +3040727 Els Graus Els Graus 42.48333 1.56667 A ADMD AD 00 0 2231 Europe/Andorra 1993-12-23 +3040728 Els Fontanals Els Fontanals 42.56667 1.68333 L LCTY AD 00 0 2340 Europe/Andorra 1993-12-23 +3040729 Els Feners Els Feners 42.58333 1.66667 T SLP AD 00 0 2159 Europe/Andorra 1993-12-23 +3040730 Els Feners Els Feners 42.48333 1.48333 L LCTY AD 00 0 981 Europe/Andorra 1993-12-23 +3040731 Els Fenerols Els Fenerols 42.53333 1.56667 L LCTY AD 00 0 1418 Europe/Andorra 1993-12-23 +3040732 Els Fenerols Els Fenerols 42.53333 1.5 L LCTY AD 00 0 1357 Europe/Andorra 1993-12-23 +3040733 Els Fenerals Els Fenerals 42.5 1.46667 A ADMD AD 00 0 1678 Europe/Andorra 1993-12-23 +3040734 Els Estanys Els Estanys 42.48333 1.63333 A ADMD AD 00 0 2296 Europe/Andorra 1993-12-23 +3040735 Els Estanyons Els Estanyons 42.46667 1.61667 L LCTY AD 00 0 2448 Europe/Andorra 1993-12-23 +3040736 Els Espiolets Els Espiolets 42.56667 1.66667 L LCTY AD 00 0 1938 Europe/Andorra 1993-12-23 +3040737 El Serrat El Serrat Lo Serrat 42.6183 1.53912 P PPL AD AD 05 0 1704 Europe/Andorra 2007-04-16 +3040738 El Seig El Seig 42.53333 1.58333 A ADMD AD 00 0 1571 Europe/Andorra 1993-12-23 +3040739 Els Cuiners Els Cuiners 42.63333 1.55 L CLG AD 00 0 2053 Europe/Andorra 1993-12-23 +3040740 Els Cortals Els Cortals 42.53333 1.61667 A ADMD AD 00 0 2237 Europe/Andorra 1993-12-23 +3040741 Els Corralets Els Corralets 42.56667 1.55 L LCTY AD 00 0 1996 Europe/Andorra 1993-12-23 +3040742 Els Colls Els Colls 42.55 1.51667 L LCTY AD 00 0 1397 Europe/Andorra 1993-12-23 +3040743 Els Collets Els Collets 42.53333 1.51667 L LCTY AD 00 0 1361 Europe/Andorra 1993-12-23 +3040744 Els Collells Els Collells 42.56667 1.48333 T PK AD 00 0 1508 Europe/Andorra 1993-12-23 +3040745 Els Colells Els Colells 42.6 1.7 L LCTY AD 00 0 2354 Europe/Andorra 1993-12-23 +3040746 Els Colells Els Colells 42.51667 1.7 A ADMD AD 00 0 2435 Europe/Andorra 1993-12-23 +3040747 Els Clots Els Clots 42.56667 1.6 T SLP AD 00 0 1655 Europe/Andorra 1993-12-23 +3040748 Els Clots Els Clots 42.55 1.43333 L LCTY AD 00 0 1949 Europe/Andorra 1993-12-23 +3040749 Els Caubets Els Caubets 42.55 1.48333 T VAL AD 00 0 1548 Europe/Andorra 1993-12-23 +3040750 Els Carabedius Els Carabedius 42.46667 1.45 L LCTY AD 00 0 1562 Europe/Andorra 1993-12-23 +3040751 Els Canalons Els Canalons 42.48333 1.48333 H RVN AD 00 0 981 Europe/Andorra 1993-12-23 +3040752 Els Botaders Els Botaders 42.48333 1.56667 L LCTY AD 00 0 2231 Europe/Andorra 1993-12-23 +3040753 Els Bedres Els Bedres 42.55 1.48333 L LCTY AD 00 0 1548 Europe/Andorra 1993-12-23 +3040754 Els Beçolans Els Becolans 42.63333 1.55 L LCTY AD 00 0 2053 Europe/Andorra 1993-12-23 +3040755 Els Bassots Els Bassots 42.55 1.65 H LKS AD 00 0 2432 Europe/Andorra 1993-12-23 +3040756 Els Aubells Els Aubells 42.56667 1.53333 L LCTY AD 00 0 1669 Europe/Andorra 1993-12-23 +3040757 Els Astrells Els Astrells 42.5 1.56667 L LCTY AD 00 0 1776 Europe/Andorra 1993-12-23 +3040758 Els Assaladors Els Assaladors 42.55 1.66667 L LCTY AD 00 0 2224 Europe/Andorra 1993-12-23 +3040759 Els Aspres Els Aspres 42.56667 1.45 T RKS AD 00 0 2137 Europe/Andorra 1993-12-23 +3040760 Els Aspedius Els Aspedius 42.48333 1.53333 L LCTY AD 00 0 2255 Europe/Andorra 1993-12-23 +3040761 El Saquet El Saquet 42.6 1.53333 A ADMD AD 00 0 1695 Europe/Andorra 1993-12-23 +3040762 Els Amorriadors Els Amorriadors 42.51667 1.6 L LCTY AD 00 0 2085 Europe/Andorra 1993-12-23 +3040763 Els Alabars Els Alabars 42.5 1.48333 L LCTY AD 00 0 1316 Europe/Andorra 1993-12-23 +3040764 El Riguer El Riguer 42.48333 1.55 A ADMD AD 00 0 2233 Europe/Andorra 1993-12-23 +3040765 El Remugar El Remugar 42.56667 1.53333 L LCTY AD 00 0 1669 Europe/Andorra 1993-12-23 +3040766 El Ramer El Ramer 42.56667 1.48333 L LCTY AD 00 0 1508 Europe/Andorra 1993-12-23 +3040767 El Pui El Pui 42.54731 1.51439 P PPL AD 04 0 1257 Europe/Andorra 2011-04-19 +3040768 El Pouader El Pouader El Ponader,El Pouader 42.53333 1.6 T RK AD AD 00 0 1888 Europe/Andorra 2011-11-05 +3040769 El Pletiu El Pletiu 42.5 1.6 L GRAZ AD 00 0 2416 Europe/Andorra 1993-12-23 +3040770 El Planellet El Planellet 42.61667 1.53333 L LCTY AD 00 0 1609 Europe/Andorra 1993-12-23 +3040771 El Pla El Pla 42.53333 1.58333 L LCTY AD 00 0 1571 Europe/Andorra 1993-12-23 +3040772 El Pas Mal El Pas Mal 42.53333 1.65 T PASS AD 00 0 2508 Europe/Andorra 1993-12-23 +3040773 El Pardal El Pardal 42.55 1.5 A ADMD AD 00 0 1292 Europe/Andorra 1993-12-23 +3040774 El Palinqueró El Palinquero 42.58333 1.66667 L LCTY AD 00 0 2159 Europe/Andorra 1993-12-23 +3040775 El Noguer El Noguer 42.51667 1.55 A ADMD AD 00 0 1322 Europe/Andorra 1993-12-23 +3040776 El Mollar El Mollar 42.53333 1.6 L LCTY AD 00 0 1888 Europe/Andorra 1993-12-23 +3040777 El Moixeret El Moixeret 42.58333 1.51667 L LCTY AD 00 0 1722 Europe/Andorra 1993-12-23 +3040778 El Meligar El Meligar 42.5 1.61667 T RDGE AD 00 0 2560 Europe/Andorra 1993-12-23 +3040779 El Mas El Mas 42.56667 1.5 A ADMD AD 00 0 1636 Europe/Andorra 1993-12-23 +3040780 El Maià El Maia 42.56667 1.73333 A ADMD AD 00 0 2096 Europe/Andorra 1993-12-23 +3040781 El Madriu El Madriu 42.48333 1.58333 A ADMD AD 00 0 2349 Europe/Andorra 1993-12-23 +3040782 El Llempo El Llempo 42.58333 1.6 L LCTY AD 00 0 1828 Europe/Andorra 1993-12-23 +3040783 El Jou El Jou 42.56667 1.5 A ADMD AD 00 0 1636 Europe/Andorra 1993-12-23 +3040784 El Griu El Griu 42.53333 1.63333 A ADMD AD 00 0 2360 Europe/Andorra 1993-12-23 +3040785 El Fornet El Fornet 42.55 1.6 L LCTY AD 00 0 2210 Europe/Andorra 1993-12-23 +3040786 El Fornell El Fornell 42.51667 1.51667 L LCTY AD 00 0 1265 Europe/Andorra 1993-12-23 +3040787 El Fornell El Fornell 42.45 1.5 L LCTY AD 00 0 1614 Europe/Andorra 1993-12-23 +3040788 El Forn El Forn 42.55 1.6 A ADMD AD 00 0 2210 Europe/Andorra 1993-12-23 +3040789 El Fontanal El Fontanal 42.46667 1.5 L LCTY AD 00 0 1383 Europe/Andorra 1993-12-23 +3040790 El Cubil El Cubil 42.43333 1.55 L LCTY AD 00 0 2178 Europe/Andorra 1993-12-23 +3040791 El Cubil El Cubil 42.53333 1.68333 A ADMD AD 00 0 2322 Europe/Andorra 1993-12-23 +3040792 El Cresper El Cresper 42.51667 1.56667 A ADMD AD 00 0 1759 Europe/Andorra 1993-12-23 +3040793 El Cortalet El Cortalet 42.55 1.51667 L LCTY AD 00 0 1397 Europe/Andorra 1993-12-23 +3040794 El Cortalet El Cortalet 42.51667 1.56667 L LCTY AD 00 0 1759 Europe/Andorra 1993-12-23 +3040795 El Corbater El Corbater 42.55 1.71667 L LCTY AD 00 0 2192 Europe/Andorra 1993-12-23 +3040796 El Confòs El Confos 42.51667 1.58333 A ADMD AD 00 0 1994 Europe/Andorra 1993-12-23 +3040797 El Collell El Collell 42.45 1.5 T PASS AD 00 0 1614 Europe/Andorra 1993-12-23 +3040798 El Colitx El Colitx 42.58333 1.51667 L LCTY AD 00 0 1722 Europe/Andorra 1993-12-23 +3040799 El Clos El Clos 42.53333 1.6 L LCTY AD 00 0 1888 Europe/Andorra 1993-12-23 +3040800 El Castellar El Castellar 42.63333 1.51667 A ADMD AD 00 0 1894 Europe/Andorra 1993-12-23 +3040801 El Carregador El Carregador 42.56667 1.53333 L LCTY AD 00 0 1669 Europe/Andorra 1993-12-23 +3040802 El Cardemeller El Cardemeller 42.55 1.46667 L LCTY AD 00 0 1585 Europe/Andorra 1993-12-23 +3040803 El Campús El Campus 42.43333 1.48333 T UPLD AD 00 0 1228 Europe/Andorra 1993-12-23 +3040804 El Bullidor El Bullidor 42.55 1.71667 L LCTY AD 00 0 2192 Europe/Andorra 1993-12-23 +3040805 El Brossós El Brossos 42.61667 1.53333 A ADMD AD 00 0 1609 Europe/Andorra 1993-12-23 +3040806 El Braibal El Braibal 42.5 1.58333 L LCTY AD 00 0 1888 Europe/Andorra 1993-12-23 +3040807 El Bosquet El Bosquet 42.56667 1.53333 L LCTY AD 00 0 1669 Europe/Andorra 1993-12-23 +3040808 El Boscarró El Boscarro 42.46667 1.48333 L LCTY AD 00 0 1134 Europe/Andorra 1993-12-23 +3040809 El Barrerol El Barrerol 42.43333 1.45 L LCTY AD 00 0 877 Europe/Andorra 1993-12-23 +3040810 Camí d’ Easagents Cami d' Easagents 42.53333 1.61667 R TRL AD 00 0 2237 Europe/Andorra 1993-12-23 +3040811 Pleta de Duedra Pleta de Duedra 42.63333 1.5 L GRAZ AD 00 0 1979 Europe/Andorra 1993-12-23 +3040812 Pleta de Duedra Pleta de Duedra 42.61667 1.56667 L GRAZ AD 00 0 2228 Europe/Andorra 1993-12-23 +3040813 Plana Duedra Plana Duedra 42.58333 1.51667 T UPLD AD 00 0 1722 Europe/Andorra 1993-12-23 +3040814 Planella del Duc Planella del Duc 42.45 1.5 T SLP AD 00 0 1614 Europe/Andorra 1993-12-23 +3040815 Canal del Duc Canal del Duc 42.58333 1.61667 H RVN AD 00 0 1707 Europe/Andorra 1993-12-23 +3040816 Canal Dreta Canal Dreta 42.55 1.53333 H STM AD 00 0 1593 Europe/Andorra 1993-12-23 +3040817 Canal Dreta Canal Dreta 42.51667 1.48333 H STM AD 00 0 1839 Europe/Andorra 1993-12-23 +3040818 Port Dret Port Dret 42.57454 1.70316 T PASS AD 00 0 2375 Europe/Andorra 2011-04-19 +3040819 Mas del Diumenge Mas del Diumenge 42.51667 1.53333 S FRM AD 00 0 1460 Europe/Andorra 1993-12-23 +3040820 Canal del Diumenge Canal del Diumenge 42.51667 1.53333 H STM AD 00 0 1460 Europe/Andorra 1993-12-23 +3040821 Clot del Diable Clot del Diable 42.56667 1.7 T CRQ AD 00 0 2375 Europe/Andorra 1993-12-23 +3040822 Devesassa Devesassa 42.56667 1.6 L LCTY AD 00 0 1655 Europe/Andorra 1993-12-23 +3040823 Costa de la Devesa Costa de la Devesa 42.55 1.45 T SLP AD 00 0 1788 Europe/Andorra 1993-12-23 +3040824 Bosc de la Devesa Bosc de la Devesa 42.5 1.55 V FRST AD 00 0 1566 Europe/Andorra 1993-12-23 +3040825 Bony de les Deu Hores Bony de les Deu Hores 42.53333 1.65 T SPUR AD 00 0 2508 Europe/Andorra 1993-12-23 +3040826 Pleta de Dalt Pleta de Dalt 42.48333 1.43333 L GRAZ AD 00 0 1938 Europe/Andorra 1993-12-23 +3040827 Carrera de Dalt Carrera de Dalt 42.55 1.61667 R TRL AD 00 0 2206 Europe/Andorra 1993-12-23 +3040828 Serra del Cussol Serra del Cussol 42.45 1.45 T RDGE AD 00 0 1482 Europe/Andorra 1993-12-23 +3040829 Bosc del Cussol Bosc del Cussol 42.45 1.45 V FRST AD 00 0 1482 Europe/Andorra 1993-12-23 +3040830 Borda de la Cultiassa Borda de la Cultiassa 42.53333 1.58333 S HUT AD 00 0 1571 Europe/Andorra 1993-12-23 +3040831 Obaga del Cultiar Obaga del Cultiar 42.55 1.6 T SLP AD 00 0 2210 Europe/Andorra 1993-12-23 +3040832 Cultiar Cultiar 42.55 1.58333 L LCTY AD 00 0 1499 Europe/Andorra 1993-12-23 +3040833 Canal del Cul Canal del Cul 42.48333 1.43333 H STM AD 00 0 1938 Europe/Andorra 1993-12-23 +3040834 Serrat dels Cuiners Serrat dels Cuiners 42.63333 1.55 T SPUR AD 00 0 2053 Europe/Andorra 1993-12-23 +3040835 Roc dels Cuiners Roc dels Cuiners 42.63333 1.55 T RK AD 00 0 2053 Europe/Andorra 1993-12-23 +3040836 Canal del Cuinal Canal del Cuinal 42.45 1.48333 H STM AD 00 0 1111 Europe/Andorra 1993-12-23 +3040837 Bosc del Cúbol Bosc del Cubol 42.6 1.7 V FRST AD 00 0 2354 Europe/Andorra 1993-12-23 +3040838 Costa del Cubil d’Erts Costa del Cubil d'Erts 42.58333 1.48333 T SLP AD 00 0 1809 Europe/Andorra 1993-12-23 +3040839 Bony del Cubil d’Erts Bony del Cubil d'Erts 42.58333 1.48333 T PK AD 00 0 1809 Europe/Andorra 1993-12-23 +3040840 Solana del Cubil Solana del Cubil 42.56667 1.46667 T SLP AD 00 0 1673 Europe/Andorra 1993-12-23 +3040841 Serrat del Cubil Serrat del Cubil 42.55 1.66667 T RDGE AD 00 0 2224 Europe/Andorra 1993-12-23 +3040842 Riu del Cubil Riu del Cubil 42.56667 1.46667 H STM AD 00 0 1673 Europe/Andorra 1993-12-23 +3040843 Riu del Cubil Riu del Cubil 42.55568 1.68579 H STM AD 00 0 2083 Europe/Andorra 2011-04-19 +3040844 Pla del Cubil Pla del Cubil 42.53333 1.66667 T UPLD AD 00 0 2489 Europe/Andorra 1993-12-23 +3040845 Pic del Cubil Pic del Cubil Pic del Cubil 42.53333 1.45 T PK AD 00 0 2130 Europe/Andorra 2011-11-05 +3040846 Pic Baix del Cubil Pic Baix del Cubil 42.53333 1.68333 T PK AD 00 0 2322 Europe/Andorra 1993-12-23 +3040847 Pic Alt del Cubil Pic Alt del Cubil Pic Alt del Cubil,Pic de Cuvil,Pic de Suvil 42.52808 1.66868 T PK AD 00 0 2489 Europe/Andorra 2011-11-05 +3040848 Obaga del Cubil Obaga del Cubil 42.56667 1.46667 T SLP AD 00 0 1673 Europe/Andorra 1993-12-23 +3040849 Llac del Cubil Llac del Cubil 42.53647 1.66891 H LK AD 00 0 2335 Europe/Andorra 2011-04-19 +3040850 Port de Caraussans Port de Caraussans Port de Caraussans,Port de Creussans 42.63333 1.46667 T PASS AD 00 0 2324 Europe/Andorra 2011-11-05 +3040851 Estany de Creussans Estany de Creussans 42.63484 1.47697 H LK AD 07 0 2291 Europe/Andorra 2007-03-04 +3040852 Creussans Creussans 42.63355 1.47785 L LCTY AD 07 0 2291 Europe/Andorra 2007-03-04 +3040853 Planell de la Creueta Planell de la Creueta 42.55 1.55 T UPLD AD 00 0 2097 Europe/Andorra 1993-12-23 +3040854 Creu de Noral Creu de Noral 42.56667 1.55 L LCTY AD 00 0 1996 Europe/Andorra 1993-12-23 +3040855 Serra de la Creu Serra de la Creu 42.48333 1.51667 T MT AD 00 0 2061 Europe/Andorra 1993-12-23 +3040856 Roc de la Creu Roc de la Creu 42.56667 1.48333 T RK AD 00 0 1508 Europe/Andorra 1993-12-23 +3040857 Borda del Cresper Borda del Cresper 42.53333 1.56667 S HUT AD 00 0 1418 Europe/Andorra 1993-12-23 +3040858 Rocs del Cresp Rocs del Cresp 42.58333 1.51667 T RKS AD 00 0 1722 Europe/Andorra 1993-12-23 +3040859 Roc del Cresp Roc del Cresp 42.56667 1.48333 T SPUR AD 00 0 1508 Europe/Andorra 1993-12-23 +3040860 Canal del Cresp Canal del Cresp 42.58333 1.51667 H STM AD 00 0 1722 Europe/Andorra 1993-12-23 +3040861 Font del Crau Font del Crau 42.6 1.51667 H SPNG AD 00 0 1445 Europe/Andorra 1993-12-23 +3040862 Pla de la Cot Pla de la Cot 42.53333 1.46667 T UPLD AD 00 0 1846 Europe/Andorra 1993-12-23 +3040863 Canal de les Costes Canal de les Costes 42.51667 1.53333 H STM AD 00 0 1460 Europe/Andorra 1993-12-23 +3040864 Canal de Costa Verda Canal de Costa Verda 42.5 1.56667 H STM AD 00 0 1776 Europe/Andorra 1993-12-23 +3040865 Collet de Costasseda Collet de Costasseda 42.48333 1.5 T PASS AD 00 0 1631 Europe/Andorra 1993-12-23 +3040866 Bosc de la Costassa Bosc de la Costassa 42.55 1.51667 V FRST AD 00 0 1397 Europe/Andorra 1993-12-23 +3040867 Barranc de la Costa Rodona Barranc de la Costa Rodona 42.56667 1.73333 H STM AD 00 0 2096 Europe/Andorra 1993-12-23 +3040868 Font de la Costa Gran Font de la Costa Gran 42.51667 1.48333 H SPNG AD 00 0 1839 Europe/Andorra 1993-12-23 +3040869 Bony de la Costa del Sodorn Bony de la Costa del Sodorn 42.5 1.45 T PK AD 00 0 1840 Europe/Andorra 1993-12-23 +3040870 Canal de la Costa de les Salineres Canal de la Costa de les Salineres 42.5 1.46667 H STM AD 00 0 1678 Europe/Andorra 1993-12-23 +3040871 Costa de les Neres Costa de les Neres 42.55 1.55 A ADMD AD 00 0 2097 Europe/Andorra 1993-12-23 +3040872 Canal de la Costa de les Gerderes Canal de la Costa de les Gerderes 42.55 1.6 H RVN AD 00 0 2210 Europe/Andorra 1993-12-23 +3040873 Collet de la Costa del Bony Roig Collet de la Costa del Bony Roig 42.6 1.61667 T PASS AD 00 0 2271 Europe/Andorra 1993-12-23 +3040874 Ras de la Costa de l’Avier Ras de la Costa de l'Avier 42.58333 1.5 T SLP AD 00 0 1595 Europe/Andorra 1993-12-23 +3040875 Font de la Costa de l’Avier Font de la Costa de l'Avier 42.56667 1.53333 H SPNG AD 00 0 1669 Europe/Andorra 1993-12-23 +3040876 Canal de Costa de l’Avier Canal de Costa de l'Avier 42.58333 1.48333 H STM AD 00 0 1809 Europe/Andorra 1993-12-23 +3040877 Roc de la Costa Roc de la Costa 42.56667 1.48333 T RK AD 00 0 1508 Europe/Andorra 1993-12-23 +3040878 Solana del Cosp Solana del Cosp 42.56667 1.61667 T SLP AD 00 0 1920 Europe/Andorra 1993-12-23 +3040879 Roca Cosconera Roca Cosconera 42.48333 1.56667 T RK AD 00 0 2231 Europe/Andorra 1993-12-23 +3040880 Font de la Coruvilla Font de la Coruvilla 42.58333 1.46667 H SPNG AD 00 0 1643 Europe/Andorra 1993-12-23 +3040881 Canals de la Coruvilla Canals de la Coruvilla 42.58333 1.46667 H RVN AD 00 0 1643 Europe/Andorra 1993-12-23 +3040882 Borda de la Coruvilla Borda de la Coruvilla 42.58333 1.46667 S FRM AD 00 0 1643 Europe/Andorra 1993-12-23 +3040883 Corts d’Ern Corts d'Ern Corts d'Aern,Corts d'Ern,Corts d’Aern,Corts d’Ern 42.5 1.48333 L LCTY AD 00 0 1316 Europe/Andorra 2011-11-05 +3040884 Bosc de les Corts Bosc de les Corts 42.56667 1.53333 V FRST AD 00 0 1669 Europe/Andorra 1993-12-23 +3040885 Cort d’Esteve Cort d'Esteve 42.6 1.51667 L LCTY AD 00 0 1445 Europe/Andorra 1993-12-23 +3040886 Cort de Rossell Cort de Rossell 42.46667 1.48333 L LCTY AD 00 0 1134 Europe/Andorra 1993-12-23 +3040887 Cort Cremada Cort Cremada 42.56667 1.53333 L LCTY AD 00 0 1669 Europe/Andorra 1993-12-23 +3040888 Bosc de les Cortanbelles Bosc de les Cortanbelles 42.46667 1.45 V FRST AD 00 0 1562 Europe/Andorra 1993-12-23 +3040889 Canal del Cortal Vell Canal del Cortal Vell 42.58333 1.46667 H STM AD 00 0 1643 Europe/Andorra 1993-12-23 +3040890 Cortal Vell Cortal Vell 42.58333 1.46667 L LCTY AD 00 0 1643 Europe/Andorra 1993-12-23 +3040891 Cortals de Sispony Cortals de Sispony Corfots de Sispony,Cortals de Sispony 42.53333 1.5 L LCTY AD AD 00 0 1357 Europe/Andorra 2011-11-05 +3040892 Cortals de Fontaneda Cortals de Fontaneda 42.45 1.46667 L LCTY AD 00 0 935 Europe/Andorra 1993-12-23 +3040893 Riu dels Cortals Riu dels Cortals 42.53333 1.58333 H STM AD 00 0 1571 Europe/Andorra 1993-12-23 +3040894 Riu dels Cortals Riu dels Cortals 42.53333 1.51667 H STM AD 00 0 1361 Europe/Andorra 1993-12-23 +3040895 Carretera dels Cortals Carretera dels Cortals 42.53333 1.58333 R RD AD 00 0 1571 Europe/Andorra 1993-12-23 +3040896 Camí dels Cortals Cami dels Cortals 42.53333 1.53333 R TRL AD 00 0 1521 Europe/Andorra 1993-12-23 +3040897 Canal del Cortalet Canal del Cortalet 42.48333 1.48333 H STM AD 00 0 981 Europe/Andorra 1993-12-23 +3040898 Camí del Cortal de la Serra Cami del Cortal de la Serra 42.53333 1.5 R TRL AD 00 0 1357 Europe/Andorra 1993-12-23 +3040899 Mas del Cortal Mas del Cortal 42.56667 1.6 S FRM AD 00 0 1655 Europe/Andorra 1993-12-23 +3040900 Canal del Cortà Canal del Corta 42.5 1.48333 H STM AD 00 0 1316 Europe/Andorra 1993-12-23 +3040901 Canal de la Corruga Canal de la Corruga 42.58333 1.63333 H RVN AD 00 0 1722 Europe/Andorra 1993-12-23 +3040902 Bosc de la Corruga Bosc de la Corruga 42.56667 1.65 V FRST AD 00 0 1988 Europe/Andorra 1993-12-23 +3040903 Font del Correus Font del Correus 42.56667 1.71667 H SPNG AD 00 0 2219 Europe/Andorra 1993-12-23 +3040904 Corrals de la Mentirosa Corrals de la Mentirosa 42.43333 1.51667 S RUIN AD 00 0 2031 Europe/Andorra 1993-12-23 +3040905 Serra dels Corrals Serra dels Corrals 42.55 1.45 T MT AD 00 0 1788 Europe/Andorra 1993-12-23 +3040906 Serrat de Corpalanca Serrat de Corpalanca 42.53333 1.46667 T RDGE AD 00 0 1846 Europe/Andorra 1993-12-23 +3040907 Canal de Cordabalba Canal de Cordabalba 42.48333 1.55 H STM AD 00 0 2233 Europe/Andorra 1993-12-23 +3040908 Roc dels Corbs Roc dels Corbs 42.5 1.51667 T RK AD 00 0 1410 Europe/Andorra 1993-12-23 +3040909 Torrent de les Corbelles Torrent de les Corbelles 42.55 1.6 H STM AD 00 0 2210 Europe/Andorra 1993-12-23 +3040910 Roca Corba Roca Corba 42.51667 1.53333 T RK AD 00 0 1460 Europe/Andorra 1993-12-23 +3040911 Font del Corb Font del Corb 42.55 1.46667 H SPNG AD 00 0 1585 Europe/Andorra 1993-12-23 +3040912 Canal del Corb Canal del Corb 42.55 1.5 H STM AD 00 0 1292 Europe/Andorra 1993-12-23 +3040913 Canal del Corb Canal del Corb 42.53333 1.56667 H STM AD 00 0 1418 Europe/Andorra 1993-12-23 +3040914 Camí del Corb Cami del Corb 42.63333 1.51667 R TRL AD 00 0 1894 Europe/Andorra 1993-12-23 +3040915 Basers del Corb Basers del Corb 42.63333 1.51667 T CLF AD 00 0 1894 Europe/Andorra 1993-12-23 +3040916 Serrat del Corantell Serrat del Corantell 42.53333 1.5 T RDGE AD 00 0 1357 Europe/Andorra 1993-12-23 +3040917 Roc de la Copa Roc de la Copa 42.5 1.46667 T RK AD 00 0 1678 Europe/Andorra 1993-12-23 +3040918 Font de Conxa Font de Conxa 42.6 1.65 H SPNG AD 00 0 2131 Europe/Andorra 1993-12-23 +3040919 Bosc de Conxa Bosc de Conxa 42.6 1.65 V FRST AD 00 0 2131 Europe/Andorra 1993-12-23 +3040920 Solana del Contador Solana del Contador 42.48333 1.43333 T SLP AD 00 0 1938 Europe/Andorra 1993-12-23 +3040921 Font del Coniol Font del Coniol 42.5 1.58333 H SPNG AD 00 0 1888 Europe/Andorra 1993-12-23 +3040922 Costa del Congost Costa del Congost 42.6 1.46667 T SLP AD 00 0 2421 Europe/Andorra 1993-12-23 +3040923 Conangle Conangle 42.43333 1.51667 L LCTY AD 00 0 2031 Europe/Andorra 1993-12-23 +3040924 Cóms de Jan Coms de Jan 42.63333 1.61667 L LCTY AD 00 0 2541 Europe/Andorra 1993-12-23 +3040925 Roc dels Cóms Roc dels Coms 42.63333 1.63333 T CLF AD 00 0 2603 Europe/Andorra 1993-12-23 +3040926 Planells dels Cóms Planells dels Coms 42.55 1.6 T UPLD AD 00 0 2210 Europe/Andorra 1993-12-23 +3040927 Obaga dels Cóms Obaga dels Coms 42.48333 1.41667 T SLP AD 00 0 1920 Europe/Andorra 1993-12-23 +3040928 Font dels Cóms Font dels Coms 42.45 1.45 H SPNG AD 00 0 1482 Europe/Andorra 1993-12-23 +3040929 Canal dels Cóms Canal dels Coms 42.48333 1.41667 H STM AD 00 0 1920 Europe/Andorra 1993-12-23 +3040930 Bosc dels Cóms Bosc dels Coms 42.53333 1.46667 V FRST AD 00 0 1846 Europe/Andorra 1993-12-23 +3040931 Riu del Comís Vell Riu del Comis Vell 42.63667 1.52189 H STM AD 07 0 2334 Europe/Andorra 2007-03-04 +3040932 Comís Vell Comis Vell 42.63748 1.52098 L LCTY AD 07 0 2334 Europe/Andorra 2007-03-04 +3040933 Borda del Comet Borda del Comet 42.56667 1.58333 S HUT AD 00 0 1919 Europe/Andorra 1993-12-23 +3040934 Comes de Banyàs Comes de Banyas 42.55 1.51667 L LCTY AD 00 0 1397 Europe/Andorra 1993-12-23 +3040935 Bosc de Comes Beçoses Bosc de Comes Becoses 42.51667 1.58333 V FRST AD 00 0 1994 Europe/Andorra 1993-12-23 +3040936 Solà de les Comes Sola de les Comes 42.58333 1.5 T SLP AD 00 0 1595 Europe/Andorra 1993-12-23 +3040937 Portell de les Comes Portell de les Comes 42.5 1.46667 T PASS AD 00 0 1678 Europe/Andorra 1993-12-23 +3040938 Canals de les Comes Canals de les Comes 42.56667 1.51667 H RVN AD 00 0 1500 Europe/Andorra 1993-12-23 +3040939 Borda de les Comes Borda de les Comes 42.53333 1.58333 S FRM AD 00 0 1571 Europe/Andorra 1993-12-23 +3040940 Bosc dels Comellassos Bosc dels Comellassos 42.6 1.66667 V FRST AD 00 0 1858 Europe/Andorra 1993-12-23 +3040941 Costa del Comellar Llarg Costa del Comellar Llarg 42.56667 1.61667 T SLP AD 00 0 1920 Europe/Andorra 1993-12-23 +3040942 Camí del Comellar Llarg Cami del Comellar Llarg 42.56667 1.61667 R TRL AD 00 0 1920 Europe/Andorra 1993-12-23 +3040943 Clot de la Comellada Clot de la Comellada 42.53333 1.45 H RVN AD 00 0 2130 Europe/Andorra 1993-12-23 +3040944 Riu de la Comella Riu de la Comella 42.5 1.53333 H STM AD 00 0 1574 Europe/Andorra 1993-12-23 +3040945 Carretera de la Comella Carretera de la Comella 42.51667 1.55 R RD AD 00 0 1322 Europe/Andorra 1993-12-23 +3040946 Bony de Comascura Bony de Comascura 42.5 1.55 T SPUR AD 00 0 1566 Europe/Andorra 1993-12-23 +3040947 Canal de Coma Sansa Canal de Coma Sansa 42.48333 1.46667 H STM AD 00 0 1148 Europe/Andorra 1993-12-23 +3040948 Riu de la Comarqueta d’Incles Riu de la Comarqueta d'Incles 42.6 1.61667 H STM AD 00 0 2271 Europe/Andorra 1993-12-23 +3040949 Collet de la Comarqueta d’Incles Collet de la Comarqueta d'Incles 42.6 1.61667 T PASS AD 00 0 2271 Europe/Andorra 1993-12-23 +3040950 Comarqueta d’Incles Comarqueta d'Incles 42.6 1.61667 L LCTY AD 00 0 2271 Europe/Andorra 1993-12-23 +3040951 Tosa de la Comarqueta Tosa de la Comarqueta 42.56667 1.73333 T UPLD AD 00 0 2096 Europe/Andorra 1993-12-23 +3040952 Font de la Comarqueta Font de la Comarqueta 42.56667 1.71667 H SPNG AD 00 0 2219 Europe/Andorra 1993-12-23 +3040953 Basers de la Comarqueta Basers de la Comarqueta 42.58333 1.71667 T CLF AD 00 0 2553 Europe/Andorra 1993-12-23 +3040954 Riu de la Comarca de les Fonts Riu de la Comarca de les Fonts 42.6 1.61667 H STM AD 00 0 2271 Europe/Andorra 1993-12-23 +3040955 Obaga de la Comarca Obaga de la Comarca 42.56667 1.46667 T SLP AD 00 0 1673 Europe/Andorra 1993-12-23 +3040956 Font de la Comarca Font de la Comarca 42.56667 1.45 H SPNG AD 00 0 2137 Europe/Andorra 1993-12-23 +3040957 Riu de Coma Pedrosa Riu de Coma Pedrosa 42.58333 1.46667 H STM AD 00 0 1643 Europe/Andorra 1993-12-23 +3040958 Pleta de Coma Pedrosa Pleta de Coma Pedrosa 42.58333 1.45 L GRAZ AD 00 0 2156 Europe/Andorra 1993-12-23 +3040959 Pic de Coma Pedrosa Pic de Coma Pedrosa Pic Alt de la Coma Pedrosa,Pic Alt de la Pedrosa,Pic de Coma Pedrosa 42.5917 1.44428 T PK AD 00 0 2406 Europe/Andorra 2011-11-05 +3040960 Obaga de Coma Pedrosa Obaga de Coma Pedrosa 42.58387 1.44182 T SLP AD 00 0 2350 Europe/Andorra 2011-04-19 +3040961 Grau de Coma Pedrosa Grau de Coma Pedrosa 42.58333 1.46667 T SLP AD 00 0 1643 Europe/Andorra 1993-12-23 +3040962 Collet de Coma Pedrosa Collet de Coma Pedrosa 42.58333 1.45 T PK AD 00 0 2156 Europe/Andorra 1993-12-23 +3040963 Camí de Coma Pedrosa Cami de Coma Pedrosa 42.58333 1.48333 R TRL AD 00 0 1809 Europe/Andorra 1993-12-23 +3040964 Coma Pedrosa Coma Pedrosa Coma Pedrosa 42.58333 1.43333 A ADMD AD 00 0 2412 Europe/Andorra 2011-11-05 +3040965 Serra de Coma Obaga i Ferreroles Serra de Coma Obaga i Ferreroles 42.61667 1.56667 T RDGE AD 00 0 2228 Europe/Andorra 1993-12-23 +3040966 Solana de Coma Obaga Solana de Coma Obaga 42.61667 1.55 T SLP AD 00 0 2007 Europe/Andorra 1993-12-23 +3040967 Serra de Coma Obaga Serra de Coma Obaga 42.61667 1.56667 T RDGE AD 00 0 2228 Europe/Andorra 1993-12-23 +3040968 Pala de Coma Obaga Pala de Coma Obaga 42.61667 1.56667 T SLP AD 00 0 2228 Europe/Andorra 1993-12-23 +3040969 Coma Obaga Coma Obaga 42.6 1.55 A ADMD AD 00 0 2298 Europe/Andorra 1993-12-23 +3040970 Comangerra Comangerra 42.56667 1.5 T SPUR AD 00 0 1636 Europe/Andorra 1993-12-23 +3040971 Canal de Coma Llonga Canal de Coma Llonga 42.56667 1.6 H STM AD 00 0 1655 Europe/Andorra 1993-12-23 +3040972 Riu de Comallempla Riu de Comallempla 42.56667 1.48333 H STM AD 00 0 1508 Europe/Andorra 1993-12-23 +3040973 Portella de Comallempla Portella de Comallempla 42.56667 1.45 T PASS AD 00 0 2137 Europe/Andorra 1993-12-23 +3040974 Camí de Comallempla Cami de Comallempla 42.56667 1.48333 R TRL AD 00 0 1508 Europe/Andorra 1993-12-23 +3040975 Bordes de Comallempla Bordes de Comallempla 42.56667 1.46667 S HUTS AD 00 0 1673 Europe/Andorra 1993-12-23 +3040976 Comallempla Comallempla 42.56667 1.46667 A ADMD AD 00 0 1673 Europe/Andorra 1993-12-23 +3040977 Canal de Coma Fregona Canal de Coma Fregona 42.58333 1.51667 H STM AD 00 0 1722 Europe/Andorra 1993-12-23 +3040978 Canal de Coma Fregona Canal de Coma Fregona 42.56667 1.51667 H STM AD 00 0 1500 Europe/Andorra 1993-12-23 +3040979 Coma Estreta Coma Estreta 42.58333 1.55 L LCTY AD 00 0 2357 Europe/Andorra 1993-12-23 +3040980 Coma Estremera Coma Estremera 42.51667 1.68333 A ADMD AD 00 0 2352 Europe/Andorra 1993-12-23 +3040981 Col de la Portaneille Col de la Portaneille Col de la Portaneille,Portella de la Coma de Varilles 42.61667 1.65 T PASS AD 00 0 2567 Europe/Andorra 2011-11-05 +3040982 Pics de la Portaneille Pics de la Portaneille Passada,Pic de la Coma de Varilles,Pic de la Passada,Picos de la Passade,Pics de la Passade,Pics de la Portaneille 42.61667 1.66667 T PKS AD 00 0 2536 Europe/Andorra 2011-11-05 +3040983 Rocs de Coma de Teix Rocs de Coma de Teix 42.46667 1.46667 T RKS AD 00 0 1340 Europe/Andorra 1993-12-23 +3040984 Coma de Ransol Coma de Ransol 42.6 1.63333 A ADMD AD 00 0 1893 Europe/Andorra 1993-12-23 +3040985 Solana de la Coma dels Llops Solana de la Coma dels Llops 42.51667 1.63333 T SLP AD 00 0 2379 Europe/Andorra 1993-12-23 +3040986 Riu de la Coma dels Llops Riu de la Coma dels Llops 42.52722 1.60965 H STM AD 00 0 2101 Europe/Andorra 2011-04-19 +3040987 Pleta de la Coma dels Llops Pleta de la Coma dels Llops 42.51667 1.61667 L GRAZ AD 00 0 2254 Europe/Andorra 1993-12-23 +3040988 Cap de la Coma dels Llops Cap de la Coma dels Llops 42.50769 1.62525 T RDGE AD 00 0 2666 Europe/Andorra 2011-04-19 +3040989 Bosc de la Coma dels Llops Bosc de la Coma dels Llops 42.51667 1.61667 V FRST AD 00 0 2254 Europe/Andorra 1993-12-23 +3040990 Coma dels Llops Coma dels Llops 42.51667 1.61667 A ADMD AD 00 0 2254 Europe/Andorra 1993-12-23 +3040991 Clot de la Coma del Prat Clot de la Coma del Prat 42.51667 1.46667 H RVN AD 00 0 1840 Europe/Andorra 1993-12-23 +3040992 Clot de la Coma del Pou Clot de la Coma del Pou 42.51667 1.48333 H RVN AD 00 0 1839 Europe/Andorra 1993-12-23 +3040993 Riu de la Coma del Mig Riu de la Coma del Mig 42.63333 1.51667 H STM AD 00 0 1894 Europe/Andorra 1993-12-23 +3040994 Riu de la Coma del Forat Riu de la Coma del Forat 42.63333 1.5 H STM AD 00 0 1979 Europe/Andorra 1993-12-23 +3040995 Costa de la Coma del Forat Costa de la Coma del Forat 42.63333 1.48333 T SLP AD 00 0 2283 Europe/Andorra 1993-12-23 +3040996 Coma del Favar Coma del Favar 42.51667 1.58333 L LCTY AD 00 0 1994 Europe/Andorra 1993-12-23 +3040997 Clot de la Coma de la Sella Clot de la Coma de la Sella 42.51667 1.48333 H RVN AD 00 0 1839 Europe/Andorra 1993-12-23 +3040998 Solà de la Coma de Cardes Sola de la Coma de Cardes 42.58333 1.61667 T SLP AD 00 0 1707 Europe/Andorra 1993-12-23 +3040999 Tosa de Coma Bella Tosa de Coma Bella 42.58333 1.68333 T UPLD AD 00 0 2294 Europe/Andorra 1993-12-23 +3041000 Font de Coma Bella Font de Coma Bella 42.45 1.5 H SPNG AD 00 0 1614 Europe/Andorra 1993-12-23 +3041001 Canal de Coma Bella Canal de Coma Bella 42.45 1.48333 H STM AD 00 0 1111 Europe/Andorra 1993-12-23 +3041002 Coma Bella Coma Bella 42.45 1.5 L LCTY AD 00 0 1614 Europe/Andorra 1993-12-23 +3041003 Planell de Coma Aubosa Planell de Coma Aubosa 42.58333 1.5 T UPLD AD 00 0 1595 Europe/Andorra 1993-12-23 +3041004 Clot de Coma Aubosa Clot de Coma Aubosa 42.58333 1.48333 H RVN AD 00 0 1809 Europe/Andorra 1993-12-23 +3041005 Roc de la Coma Roc de la Coma 42.51667 1.55 T RK AD 00 0 1322 Europe/Andorra 1993-12-23 +3041006 Riu de la Coma Riu de la Coma 42.58333 1.63333 H STM AD 00 0 1722 Europe/Andorra 1993-12-23 +3041007 Riu de la Coma Riu de la Coma 42.45 1.46667 H STM AD 00 0 935 Europe/Andorra 1993-12-23 +3041008 Prats de Coma Prats de Coma 42.56667 1.46667 L GRAZ AD 00 0 1673 Europe/Andorra 1993-12-23 +3041009 Pont de la Coma Pont de la Coma 42.55 1.46667 S BDG AD 00 0 1585 Europe/Andorra 1993-12-23 +3041010 Collet de la Coma Collet de la Coma 42.65 1.51667 T PASS AD 00 0 2546 Europe/Andorra 1993-12-23 +3041011 Collada de la Coma Collada de la Coma 42.6 1.61667 T PASS AD 00 0 2271 Europe/Andorra 1993-12-23 +3041012 Canal de la Coma Canal de la Coma 42.61667 1.55 H STM AD 00 0 2007 Europe/Andorra 1993-12-23 +3041013 Canal de la Coma Canal de la Coma 42.55 1.55 H STM AD 00 0 2097 Europe/Andorra 1993-12-23 +3041014 Canal de la Coma Canal de la Coma 42.6 1.51667 H RVN AD 00 0 1445 Europe/Andorra 1993-12-23 +3041015 Bosc de Coma Bosc de Coma 42.53333 1.55 V FRST AD 00 0 1344 Europe/Andorra 1993-12-23 +3041016 Bony de la Coma Bony de la Coma 42.55 1.53333 T SPUR AD 00 0 1593 Europe/Andorra 1993-12-23 +3041017 Rocs del Colomer Rocs del Colomer 42.53333 1.51667 T SPUR AD 00 0 1361 Europe/Andorra 1993-12-23 +3041018 Collet dels Colls Collet dels Colls 42.55 1.51667 T PASS AD 00 0 1397 Europe/Andorra 1993-12-23 +3041019 Solana de Coll Pa Solana de Coll Pa 42.55 1.43333 T SLP AD 00 0 1949 Europe/Andorra 1993-12-23 +3041020 Serrat de Coll Pa Serrat de Coll Pa 42.55 1.43333 T RDGE AD 00 0 1949 Europe/Andorra 1993-12-23 +3041021 Planell de Coll Pa Planell de Coll Pa 42.48333 1.56667 T UPLD AD 00 0 2231 Europe/Andorra 1993-12-23 +3041022 Pic de Coll Pa Pic de Coll Pa 42.51667 1.48333 T PK AD 00 0 1839 Europe/Andorra 1993-12-23 +3041023 Bosc de Coll Pa Bosc de Coll Pa 42.48333 1.55 V FRST AD 00 0 2233 Europe/Andorra 1993-12-23 +3041024 Basers de Coll Pa Basers de Coll Pa 42.48333 1.56667 T CLF AD 00 0 2231 Europe/Andorra 1993-12-23 +3041025 Canal de Coll Jovell Canal de Coll Jovell 42.5 1.56667 H STM AD 00 0 1776 Europe/Andorra 1993-12-23 +3041026 Canal de Collet Purgat Canal de Collet Purgat 42.46667 1.48333 H STM AD 00 0 1134 Europe/Andorra 1993-12-23 +3041027 Clot del Collet de Font Podrida Clot del Collet de Font Podrida 42.58333 1.46667 T SLP AD 00 0 1643 Europe/Andorra 1993-12-23 +3041028 Camí dels Collells Cami dels Collells 42.56667 1.46667 R TRL AD 00 0 1673 Europe/Andorra 1993-12-23 +3041029 Carretera del Coll d’Ordino Carretera del Coll d'Ordino 42.55 1.53333 R RD AD 00 0 1593 Europe/Andorra 1993-12-23 +3041030 Camí del Coll d’Ordino Cami del Coll d'Ordino 42.55 1.56667 R TRL AD 00 0 1828 Europe/Andorra 1993-12-23 +3041031 Font del Coll de Vista Font del Coll de Vista 42.48333 1.45 H SPNG AD 00 0 1195 Europe/Andorra 1993-12-23 +3041032 Canal del Coll de Vista Canal del Coll de Vista 42.48333 1.45 H STM AD 00 0 1195 Europe/Andorra 1993-12-23 +3041033 Canal del Coll de Turer Canal del Coll de Turer 42.56667 1.46667 H STM AD 00 0 1673 Europe/Andorra 1993-12-23 +3041034 Camí de Coll de Turer Cami de Coll de Turer 42.56667 1.46667 R TRL AD 00 0 1673 Europe/Andorra 1993-12-23 +3041035 Canal de Coll d’Eres Canal de Coll d'Eres 42.5 1.51667 H STM AD 00 0 1410 Europe/Andorra 1993-12-23 +3041036 Camí del Coll dels Isards Cami del Coll dels Isards 42.51667 1.73333 R TRL AD 00 0 2484 Europe/Andorra 1993-12-23 +3041037 Canal del Coll de l’Obac Canal del Coll de l'Obac 42.48333 1.48333 H STM AD 00 0 981 Europe/Andorra 1993-12-23 +3041038 Canal del Coll de les Cases Canal del Coll de les Cases 42.56667 1.5 H STM AD 00 0 1636 Europe/Andorra 1993-12-23 +3041039 Bony del Coll de l’Era Bony del Coll de l'Era 42.48333 1.45 T SPUR AD 00 0 1195 Europe/Andorra 1993-12-23 +3041040 Riu del Coll de l’Aquell Riu del Coll de l'Aquell 42.48333 1.43333 H STM AD 00 0 1938 Europe/Andorra 1993-12-23 +3041041 Canal del Coll de l’Acaumader Canal del Coll de l'Acaumader 42.48333 1.46667 H STM AD 00 0 1148 Europe/Andorra 1993-12-23 +3041042 Canal del Coll de la Cauba Canal del Coll de la Cauba 42.58333 1.61667 H STM AD 00 0 1707 Europe/Andorra 1993-12-23 +3041043 Canal del Coll de la Basera Canal del Coll de la Basera 42.58333 1.65 H RVN AD 00 0 1767 Europe/Andorra 1993-12-23 +3041044 Camí del Coll d’Arenes Cami del Coll d'Arenes 42.6 1.58333 R TRL AD 00 0 2461 Europe/Andorra 1993-12-23 +3041045 Pala de Coll Carnisser Pala de Coll Carnisser 42.6 1.46667 T SLP AD 00 0 2421 Europe/Andorra 1993-12-23 +3041046 Collada de Coll Carnisser Collada de Coll Carnisser 42.6 1.48333 T PASS AD 00 0 2441 Europe/Andorra 1993-12-23 +3041047 Prats de Collart Prats de Collart 42.58333 1.65 L GRAZ AD 00 0 1767 Europe/Andorra 1993-12-23 +3041048 Canal de Collart Canal de Collart 42.58333 1.65 H STM AD 00 0 1767 Europe/Andorra 1993-12-23 +3041049 Bosc de Collart Bosc de Collart 42.56667 1.66667 V FRST AD 00 0 1938 Europe/Andorra 1993-12-23 +3041050 La Colladeta La Colladeta 42.55 1.55 T PASS AD 00 0 2097 Europe/Andorra 1993-12-23 +3041051 Bony de les Collades Bony de les Collades 42.55 1.51667 T MT AD 00 0 1397 Europe/Andorra 1993-12-23 +3041052 Canal de la Collada Gran Canal de la Collada Gran 42.5 1.48333 H STM AD 00 0 1316 Europe/Andorra 1993-12-23 +3041053 Camí de la Collada de Sanfons Cami de la Collada de Sanfons 42.58333 1.45 R TRL AD 00 0 2156 Europe/Andorra 1993-12-23 +3041054 Camí de la Collada d’Enradort Cami de la Collada d'Enradort 42.53333 1.61667 R TRL AD 00 0 2237 Europe/Andorra 1993-12-23 +3041055 Camí de la Collada de la Maiana Cami de la Collada de la Maiana 42.48333 1.61667 R TRL AD 00 0 2217 Europe/Andorra 1993-12-23 +3041056 Camí de la Collada de Ferreroles Cami de la Collada de Ferreroles 42.6 1.56667 R TRL AD 00 0 2513 Europe/Andorra 1993-12-23 +3041057 Clots de la Collada Clots de la Collada 42.61667 1.61667 H RVN AD 00 0 2352 Europe/Andorra 1993-12-23 +3041058 Bosc de la Collada Bosc de la Collada 42.51667 1.46667 V FRST AD 00 0 1840 Europe/Andorra 1993-12-23 +3041059 Planell del Colitx Planell del Colitx 42.61667 1.51667 T UPLD AD 00 0 1716 Europe/Andorra 1993-12-23 +3041060 Font de la Colilla Font de la Colilla 42.51667 1.6 H SPNG AD 00 0 2085 Europe/Andorra 1993-12-23 +3041061 Canal de la Colilla Canal de la Colilla 42.48333 1.58333 H STM AD 00 0 2349 Europe/Andorra 1993-12-23 +3041062 Canal de la Colija Canal de la Colija 42.58333 1.65 H STM AD 00 0 1767 Europe/Andorra 1993-12-23 +3041063 Bosc de la Colija Bosc de la Colija 42.58333 1.65 V FRST AD 00 0 1767 Europe/Andorra 1993-12-23 +3041064 Riu dels Colells Riu dels Colells 42.53333 1.7 H STM AD 00 0 2357 Europe/Andorra 1993-12-23 +3041065 Circ dels Colells Circ dels Colells 42.51667 1.7 T CRQ AD 00 0 2435 Europe/Andorra 1993-12-23 +3041066 Bosc dels Colells Bosc dels Colells 42.53333 1.7 V FRST AD 00 0 2357 Europe/Andorra 1993-12-23 +3041067 Cortal del Coix Cortal del Coix 42.55 1.55 S HUTS AD 00 0 2097 Europe/Andorra 1993-12-23 +3041068 Tartera del Coferony Tartera del Coferony 42.5 1.45 T SLP AD 00 0 1840 Europe/Andorra 1993-12-23 +3041069 Coferony Coferony 42.48333 1.45 L LCTY AD 00 0 1195 Europe/Andorra 1993-12-23 +3041070 Canal de les Codolles Canal de les Codolles 42.53333 1.51667 H STM AD 00 0 1361 Europe/Andorra 1993-12-23 +3041071 Serrat de Codinet Serrat de Codinet 42.51667 1.6 T SPUR AD 00 0 2085 Europe/Andorra 1993-12-23 +3041072 Collada del Clot Sord Collada del Clot Sord 42.6 1.65 T PASS AD 00 0 2131 Europe/Andorra 1993-12-23 +3041073 Pala dels Clots d’Entinyac Pala dels Clots d'Entinyac 42.58333 1.68333 T SLP AD 00 0 2294 Europe/Andorra 1993-12-23 +3041074 Tosa dels Clots de Massat Tosa dels Clots de Massat 42.56667 1.7 T UPLD AD 00 0 2375 Europe/Andorra 1993-12-23 +3041075 Pala dels Clots de Massat Pala dels Clots de Massat 42.56667 1.7 T SLP AD 00 0 2375 Europe/Andorra 1993-12-23 +3041076 Bassot dels Clots de Massat Bassot dels Clots de Massat 42.56667 1.7 H LK AD 00 0 2375 Europe/Andorra 1993-12-23 +3041077 Clots de Massat Clots de Massat 42.56667 1.68333 A ADMD AD 00 0 2340 Europe/Andorra 1993-12-23 +3041078 Clots de l’Ós Clots de l'Os 42.58333 1.68333 A ADMD AD 00 0 2294 Europe/Andorra 1993-12-23 +3041079 Font dels Clots de la Llosa Font dels Clots de la Llosa 42.61667 1.61667 H SPNG AD 00 0 2352 Europe/Andorra 1993-12-23 +3041080 Font dels Clots Font dels Clots 42.55 1.71667 H SPNG AD 00 0 2192 Europe/Andorra 1993-12-23 +3041081 Canal del Clot del Mener Canal del Clot del Mener 42.5 1.53333 H STM AD 00 0 1574 Europe/Andorra 1993-12-23 +3041082 Barranc del Clot de les Deveses Barranc del Clot de les Deveses 42.53333 1.51667 H STM AD 00 0 1361 Europe/Andorra 1993-12-23 +3041083 Pic del Clot del Cavall Pic del Clot del Cavall 42.6 1.5 T PK AD 00 0 1923 Europe/Andorra 1993-12-23 +3041084 Barranc del Clot d’Aixades Barranc del Clot d'Aixades 42.56667 1.58333 H STM AD 00 0 1919 Europe/Andorra 1993-12-23 +3041085 Font de la Closa Font de la Closa 42.5 1.56667 H SPNG AD 00 0 1776 Europe/Andorra 1993-12-23 +3041086 Pas de la Clau Pas de la Clau 42.51667 1.61667 T PASS AD 00 0 2254 Europe/Andorra 1993-12-23 +3041087 Riu de Claror i Perafita Riu de Claror i Perafita 42.5 1.55 H STM AD 00 0 1566 Europe/Andorra 1993-12-23 +3041088 Riu de Claror Riu de Claror 42.47897 1.56898 H STM AD 00 0 2231 Europe/Andorra 2011-04-19 +3041089 Pleta de Claror Pleta de Claror 42.48333 1.56667 L GRAZ AD 00 0 2231 Europe/Andorra 1993-12-23 +3041090 Camí de Claror Cami de Claror 42.48333 1.56667 R TRL AD 00 0 2231 Europe/Andorra 1993-12-23 +3041091 Cabana de Claror Cabana de Claror 42.46667 1.56667 S HUT AD 00 0 2365 Europe/Andorra 1993-12-23 +3041092 Claror Claror 42.46667 1.56667 A ADMD AD 00 0 2365 Europe/Andorra 1993-12-23 +3041093 Riu de les Claperes Riu de les Claperes 42.55 1.51667 H STM AD 00 0 1397 Europe/Andorra 1993-12-23 +3041094 Canal de les Claperes Canal de les Claperes 42.55 1.5 H STM AD 00 0 1292 Europe/Andorra 1993-12-23 +3041095 Civòs Civos 42.45 1.48333 L LCTY AD 00 0 1111 Europe/Andorra 1993-12-23 +3041096 Canal de la Cirera Canal de la Cirera 42.5 1.5 H STM AD 00 0 1135 Europe/Andorra 1993-12-23 +3041097 Conreu de Certers Conreu de Certers 42.48333 1.5 V CULT AD 00 0 1631 Europe/Andorra 1993-12-23 +3041098 Certers Certers Certers,Certes,Certés,Sertes 42.47468 1.50575 P PPL AD 06 0 1383 Europe/Andorra 2011-11-05 +3041099 Coll del Cerc Coll del Cerc 42.46667 1.5 T PASS AD 00 0 1383 Europe/Andorra 1993-12-23 +3041100 Cementiri Cementiri 42.56667 1.73333 L LCTY AD 00 0 2096 Europe/Andorra 1993-12-23 +3041101 Costa dell Cell Costa dell Cell 42.48333 1.48333 T SLP AD 00 0 981 Europe/Andorra 1993-12-23 +3041102 Tarteres de la Cebollera Tarteres de la Cebollera 42.63333 1.6 T TAL AD 00 0 2635 Europe/Andorra 1993-12-23 +3041103 Riu de la Cebollera Riu de la Cebollera 42.61667 1.56667 H STM AD 00 0 2228 Europe/Andorra 1993-12-23 +3041104 Portella de la Cebollera Portella de la Cebollera Portella de la Cebollera 42.63333 1.6 T PASS AD 00 0 2635 Europe/Andorra 2011-11-05 +3041105 Pleta de la Cebollera Pleta de la Cebollera 42.63333 1.58333 L GRAZ AD 00 0 2470 Europe/Andorra 1993-12-23 +3041106 Basses de la Cebollera Basses de la Cebollera 42.63333 1.58333 H LKS AD 00 0 2470 Europe/Andorra 1993-12-23 +3041107 Aspres de la Cebollera Aspres de la Cebollera 42.63333 1.58333 V VINS AD 00 0 2470 Europe/Andorra 1993-12-23 +3041108 Riu de les Cebes Riu de les Cebes 42.61667 1.58333 H STM AD 00 0 2374 Europe/Andorra 1993-12-23 +3041109 Clot del Cavall Clot del Cavall 42.6 1.5 T SLP AD 00 0 1923 Europe/Andorra 1993-12-23 +3041110 Costa del Caup Costa del Caup 42.6 1.66667 T SLP AD 00 0 1858 Europe/Andorra 1993-12-23 +3041111 Solana de la Caülla Solana de la Caulla 42.48333 1.53333 T SLP AD 00 0 2255 Europe/Andorra 1993-12-23 +3041112 Collada de la Caülla Collada de la Caulla 42.48333 1.53333 T PASS AD 00 0 2255 Europe/Andorra 1993-12-23 +3041113 Clots de la Caülla Clots de la Caulla 42.48333 1.53333 H RVN AD 00 0 2255 Europe/Andorra 1993-12-23 +3041114 Bosc de la Caülla Bosc de la Caulla 42.48333 1.53333 V FRST AD 00 0 2255 Europe/Andorra 1993-12-23 +3041115 Planell de la Caubella Planell de la Caubella 42.53333 1.48333 T UPLD AD 00 0 1677 Europe/Andorra 1993-12-23 +3041116 Torrent de la Cauba Torrent de la Cauba 42.55 1.51667 H STM AD 00 0 1397 Europe/Andorra 1993-12-23 +3041117 Roc de la Cauba Roc de la Cauba 42.56114 1.51506 T RK AD 00 0 1551 Europe/Andorra 2011-04-19 +3041118 Coll de la Cauba Coll de la Cauba 42.58333 1.61667 T PASS AD 00 0 1707 Europe/Andorra 1993-12-23 +3041119 Bosc de la Cauba Bosc de la Cauba 42.56667 1.51667 V FRST AD 00 0 1500 Europe/Andorra 1993-12-23 +3041120 Catolla la Guineu Catolla la Guineu 42.46667 1.46667 L LCTY AD 00 0 1340 Europe/Andorra 1993-12-23 +3041121 Pic de Cataverdis Pic de Cataverdis Pic de Cataperdis,Pic de Cataperdís,Pic de Cataverdis 42.61667 1.46667 T PK AD 00 0 2442 Europe/Andorra 2011-11-05 +3041122 Roc dels Castells Roc dels Castells 42.51667 1.55 T RK AD 00 0 1322 Europe/Andorra 1993-12-23 +3041123 Riu de les Castelletes Riu de les Castelletes 42.45 1.53333 H STM AD 00 0 1859 Europe/Andorra 1993-12-23 +3041124 Roc de la Castelleta Roc de la Castelleta 42.56667 1.5 T RK AD 00 0 1636 Europe/Andorra 1993-12-23 +3041125 Canal de la Castelleta Canal de la Castelleta 42.53333 1.5 H STM AD 00 0 1357 Europe/Andorra 1993-12-23 +3041126 Bosc de la Castelleta Bosc de la Castelleta 42.53333 1.5 V FRST AD 00 0 1357 Europe/Andorra 1993-12-23 +3041127 Bony de la Castelleta Bony de la Castelleta 42.53333 1.53333 T SPUR AD 00 0 1521 Europe/Andorra 1993-12-23 +3041128 Font del Casteller Font del Casteller 42.53333 1.55 H SPNG AD 00 0 1344 Europe/Andorra 1993-12-23 +3041129 Castell de Sant Vicenç Castell de Sant Vicenc Castell de Sant Vicenc,Castell de Sant Vicens,Castell de Sant Vicenç 42.49658 1.48686 S RUIN AD 00 0 1027 Europe/Andorra 2011-11-05 +3041130 Castell dels Moros Castell dels Moros Castel dels Moros La Meca,Castell dels Moros,La Meca 42.55 1.53333 T PROM AD AD 00 0 1593 Europe/Andorra 2011-11-05 +3041131 Pleta del Castellar Pleta del Castellar 42.63333 1.51667 L GRAZ AD 00 0 1894 Europe/Andorra 1993-12-23 +3041132 Canal del Castellar Canal del Castellar Canal del Castella,Canal del Castellar,Canal del Castellà 42.6 1.63333 H STM AD AD 00 0 1893 Europe/Andorra 2011-11-05 +3041133 Bosc del Castellar Bosc del Castellar 42.63333 1.51667 V FRST AD 00 0 1894 Europe/Andorra 1993-12-23 +3041134 Bordes del Castellar Bordes del Castellar 42.53031 1.60873 S HUTS AD 00 0 2101 Europe/Andorra 2011-04-19 +3041135 Rocs de Castell Rocs de Castell 42.46667 1.45 T RKS AD 00 0 1562 Europe/Andorra 1993-12-23 +3041136 Roc del Castell Roc del Castell 42.46667 1.46667 T RK AD 00 0 1340 Europe/Andorra 1993-12-23 +3041137 Canal del Castell Canal del Castell 42.58333 1.51667 H STM AD 00 0 1722 Europe/Andorra 1993-12-23 +3041138 Bosc del Castell Bosc del Castell 42.58333 1.51667 V FRST AD 00 0 1722 Europe/Andorra 1993-12-23 +3041139 Coll de les Cases Coll de les Cases 42.58333 1.5 T PK AD 00 0 1595 Europe/Andorra 1993-12-23 +3041140 Canal de les Casasses Canal de les Casasses 42.55 1.5 H STM AD 00 0 1292 Europe/Andorra 1993-12-23 +3041141 Serra de Casamanya Serra de Casamanya 42.58877 1.57163 T RDGE AD 00 0 2423 Europe/Andorra 2011-04-19 +3041142 Riu de Casamanya Riu de Casamanya 42.55 1.55 H STM AD 00 0 2097 Europe/Andorra 1993-12-23 +3041143 Pic de Casamanya Pic de Casamanya Pic de Camanya,Pic de Casamanya 42.58619 1.56971 T PK AD 00 0 2423 Europe/Andorra 2011-11-05 +3041144 Camí de Casamanya Cami de Casamanya 42.56667 1.55 R TRL AD 00 0 1996 Europe/Andorra 1993-12-23 +3041145 Casamanya Casamanya 42.56667 1.55 A ADMD AD 00 0 1996 Europe/Andorra 1993-12-23 +3041146 Borda del Casadet Borda del Casadet 42.56667 1.6 S HUT AD 00 0 1655 Europe/Andorra 1993-12-23 +3041147 Bordes de la Casa Bordes de la Casa Bordes,Bordes de la Casa 42.53333 1.61667 S HUTS AD AD 00 0 2237 Europe/Andorra 2011-11-05 +3041148 Bordes de la Casa Bordes de la Casa 42.53333 1.6 S HUTS AD 00 0 1888 Europe/Andorra 1993-12-23 +3041149 Pic de Carroi Pic de Carroi 42.51667 1.5 T PK AD 00 0 1688 Europe/Andorra 1993-12-23 +3041150 Roc del Carret Roc del Carret 42.56667 1.48333 T RK AD 00 0 1508 Europe/Andorra 1993-12-23 +3041151 Roc del Carrador Roc del Carrador 42.56667 1.48333 T RK AD 00 0 1508 Europe/Andorra 1993-12-23 +3041152 Bosc del Carpider Bosc del Carpider 42.51667 1.5 V FRST AD 00 0 1688 Europe/Andorra 1993-12-23 +3041153 Canal Carnissera Canal Carnissera 42.58333 1.46667 H STM AD 00 0 1643 Europe/Andorra 1993-12-23 +3041154 Canal Carnissera Canal Carnissera 42.5 1.6 H STM AD 00 0 2416 Europe/Andorra 1993-12-23 +3041155 Canal Carnissera Canal Carnissera 42.65 1.55 H RVN AD 00 0 2181 Europe/Andorra 1993-12-23 +3041156 Roca de Carmenús Roca de Carmenus 42.55 1.61667 T RK AD 00 0 2206 Europe/Andorra 1993-12-23 +3041157 Clots de Carmenús Clots de Carmenus 42.55 1.61667 H RVN AD 00 0 2206 Europe/Andorra 1993-12-23 +3041158 Riu del Cardemeller Riu del Cardemeller 42.55 1.46667 H STM AD 00 0 1585 Europe/Andorra 1993-12-23 +3041159 Borda del Cardago Borda del Cardago 42.53333 1.58333 S HUT AD 00 0 1571 Europe/Andorra 1993-12-23 +3041160 Roca de Carcamanyà Roca de Carcamanya 42.53333 1.56667 T RK AD 00 0 1418 Europe/Andorra 1993-12-23 +3041161 Barranc del Carcabanyat Barranc del Carcabanyat 42.55 1.48333 H STM AD 00 0 1548 Europe/Andorra 1993-12-23 +3041162 Carboneres de Ferrer Carboneres de Ferrer 42.48333 1.6 L LCTY AD 00 0 2250 Europe/Andorra 1993-12-23 +3041163 Bosc de les Carboneres Bosc de les Carboneres 42.51667 1.51667 V FRST AD 00 0 1265 Europe/Andorra 1993-12-23 +3041164 Bony de les Carboneres Bony de les Carboneres 42.56667 1.65 T SPUR AD 00 0 1988 Europe/Andorra 1993-12-23 +3041165 Pleta Carbona Pleta Carbona 42.63333 1.5 L GRAZ AD 00 0 1979 Europe/Andorra 1993-12-23 +3041166 Planell del Carbó Planell del Carbo 42.53333 1.48333 T UPLD AD 00 0 1677 Europe/Andorra 1993-12-23 +3041167 Canal de la Carbassa Canal de la Carbassa 42.51667 1.48333 H STM AD 00 0 1839 Europe/Andorra 1993-12-23 +3041168 Tosa de Caraup Tosa de Caraup 42.6 1.65 T UPLD AD 00 0 2131 Europe/Andorra 1993-12-23 +3041169 Planells de Caraup Planells de Caraup 42.61667 1.65 T UPLD AD 00 0 2567 Europe/Andorra 1993-12-23 +3041170 Clots de Caraup Clots de Caraup 42.61667 1.65 H RVN AD 00 0 2567 Europe/Andorra 1993-12-23 +3041171 Riu de Cap Torrent Riu de Cap Torrent 42.53333 1.56667 H STM AD 00 0 1418 Europe/Andorra 1993-12-23 +3041172 Pont de Capigol Pont de Capigol 42.56667 1.66667 S BDG AD 00 0 1938 Europe/Andorra 1993-12-23 +3041173 Font dels Capellans Font dels Capellans 42.6 1.63333 H SPNG AD 00 0 1893 Europe/Andorra 1993-12-23 +3041174 Cortal del Capdevila Cortal del Capdevila 42.53333 1.53333 S CRRL AD 00 0 1521 Europe/Andorra 1993-12-23 +3041175 Estany del Cap dels Pessons Estany del Cap dels Pessons 42.51996 1.67873 H LK AD 00 0 2352 Europe/Andorra 2011-04-19 +3041176 Tosa del Cap del Siscaró Tosa del Cap del Siscaro 42.58333 1.71667 T UPLD AD 00 0 2553 Europe/Andorra 1993-12-23 +3041177 Cap dels Clots de Massat Cap dels Clots de Massat 42.56667 1.7 L LCTY AD 00 0 2375 Europe/Andorra 1993-12-23 +3041178 Collada del Cap dels Clots Collada del Cap dels Clots 42.55 1.63333 T PASS AD 00 0 2336 Europe/Andorra 1993-12-23 +3041179 Cap dels Clots Cap dels Clots 42.55 1.63333 L LCTY AD 00 0 2336 Europe/Andorra 1993-12-23 +3041180 Canal del Cap dels Camp Canal del Cap dels Camp 42.55 1.53333 H STM AD 00 0 1593 Europe/Andorra 1993-12-23 +3041181 Clot del Cap del Maià Clot del Cap del Maia 42.55 1.71667 H RVN AD 00 0 2192 Europe/Andorra 1993-12-23 +3041182 Pala del Cap de les Tallades Pala del Cap de les Tallades 42.61667 1.55 T SLP AD 00 0 2007 Europe/Andorra 1993-12-23 +3041183 Planada del Cap de les Canals dels Obacs Planada del Cap de les Canals dels Obacs 42.6 1.5 T UPLD AD 00 0 1923 Europe/Andorra 1993-12-23 +3041184 Cap de les Agols Cap de les Agols 42.5 1.61667 L LCTY AD 00 0 2560 Europe/Andorra 1993-12-23 +3041185 Cap del Bosc de Moretó Cap del Bosc de Moreto 42.53333 1.68333 L LCTY AD 00 0 2322 Europe/Andorra 1993-12-23 +3041186 Cap del Bosc dels Plans Cap del Bosc dels Plans 42.58333 1.61667 L LCTY AD 00 0 1707 Europe/Andorra 1993-12-23 +3041187 Cap de la Solana del Forn Cap de la Solana del Forn 42.53333 1.65 L LCTY AD 00 0 2508 Europe/Andorra 1993-12-23 +3041188 Cap de la Montada Cap de la Montada 42.56667 1.58333 L LCTY AD 00 0 1919 Europe/Andorra 1993-12-23 +3041189 Tarteres del Cap de la Coma Tarteres del Cap de la Coma 42.61667 1.48333 T TAL AD 00 0 2470 Europe/Andorra 1993-12-23 +3041190 Serra del Cap de la Coma Serra del Cap de la Coma 42.61667 1.48333 T RDGE AD 00 0 2470 Europe/Andorra 1993-12-23 +3041191 Alt de la Capa Alt de la Capa 42.56293 1.45424 T PK AD 00 0 2173 Europe/Andorra 2011-04-19 +3041192 Font de les Canyorques Font de les Canyorques 42.58333 1.43333 H SPNG AD 00 0 2412 Europe/Andorra 1993-12-23 +3041193 Coves de la Canya Gran Coves de la Canya Gran 42.48333 1.46667 S CAVE AD 00 0 1148 Europe/Andorra 1993-12-23 +3041194 Planell de la Canya Planell de la Canya 42.58333 1.6 T UPLD AD 00 0 1828 Europe/Andorra 1993-12-23 +3041195 Bosc de la Canya Bosc de la Canya 42.58333 1.6 V FRST AD 00 0 1828 Europe/Andorra 1993-12-23 +3041196 Font de Cantallops Font de Cantallops 42.56667 1.5 H SPNG AD 00 0 1636 Europe/Andorra 1993-12-23 +3041197 Canal de Cantallops Canal de Cantallops 42.56667 1.5 H STM AD 00 0 1636 Europe/Andorra 1993-12-23 +3041198 Roc de Canomala Roc de Canomala 42.56667 1.68333 T RK AD 00 0 2340 Europe/Andorra 1993-12-23 +3041199 Santuari de Canòlic Santuari de Canolic 42.46667 1.45 S CH AD 00 0 1562 Europe/Andorra 1993-12-23 +3041200 Conreu de Canòlic Conreu de Canolic 42.48333 1.45 V CULT AD 00 0 1195 Europe/Andorra 1993-12-23 +3041201 Carretera de Canòlic Carretera de Canolic 42.48333 1.46667 R RD AD 00 0 1148 Europe/Andorra 1993-12-23 +3041202 Canòlic Canolic 42.46667 1.45 A ADMD AD 00 0 1562 Europe/Andorra 1993-12-23 +3041203 Parròquia de Canillo Parroquia de Canillo Canillo,Parroquia de Canillo,Parròquia de Canillo 42.58333 1.66667 A ADM1 AD AD 02 5067 2159 Europe/Andorra 2011-11-05 +3041204 Canillo Canillo Canillo,Kanil'o,ka ni e,kaniryo jiao qu,Канильо,カニーリョ教区,卡尼略 42.5669 1.59556 P PPLA AD 02 3292 1640 Europe/Andorra 2011-11-05 +3041205 Estany de les Canals Roges Estany de les Canals Roges 42.58333 1.71667 H LK AD 00 0 2553 Europe/Andorra 1993-12-23 +3041206 Cap de les Canals de Ribanelles Cap de les Canals de Ribanelles 42.58333 1.46667 T PK AD 00 0 1643 Europe/Andorra 1993-12-23 +3041207 Pic de les Canals de Montmantell Pic de les Canals de Montmantell 42.6 1.48333 T PK AD 00 0 2441 Europe/Andorra 1993-12-23 +3041208 Canals dels Planells de Baell Canals dels Planells de Baell 42.5 1.6 L LCTY AD 00 0 2416 Europe/Andorra 1993-12-23 +3041209 Canals dels Obacs Canals dels Obacs 42.6 1.5 H RVN AD 00 0 1923 Europe/Andorra 1993-12-23 +3041210 Canals del Pla de l’Ingla Canals del Pla de l'Ingla 42.48333 1.61667 L LCTY AD 00 0 2217 Europe/Andorra 1993-12-23 +3041211 Canals del Maià Canals del Maia 42.56667 1.73333 L LCTY AD 00 0 2096 Europe/Andorra 1993-12-23 +3041212 Canals de la Rabassa Canals de la Rabassa 42.63333 1.56667 L LCTY AD 00 0 2394 Europe/Andorra 1993-12-23 +3041213 Canals de la Comarqueta Canals de la Comarqueta 42.48333 1.61667 L LCTY AD 00 0 2217 Europe/Andorra 1993-12-23 +3041214 Canals de la Burna Canals de la Burna 42.58333 1.5 L LCTY AD 00 0 1595 Europe/Andorra 1993-12-23 +3041215 Serra de les Canals de Falcobí Serra de les Canals de Falcobi 42.63333 1.55 T RDGE AD 00 0 2053 Europe/Andorra 1993-12-23 +3041216 Canals de Falcobí Canals de Falcobi 42.63333 1.55 L LCTY AD 00 0 2053 Europe/Andorra 1993-12-23 +3041217 Canals de Comascura Canals de Comascura 42.5 1.55 L LCTY AD 00 0 1566 Europe/Andorra 1993-12-23 +3041218 Riu de les Canals Riu de les Canals 42.58333 1.63333 H STM AD 00 0 1722 Europe/Andorra 1993-12-23 +3041219 Camí de les Canals Cami de les Canals 42.58333 1.63333 R TRL AD 00 0 1722 Europe/Andorra 1993-12-23 +3041220 Bosc de les Canals Bosc de les Canals 42.58333 1.63333 V FRST AD 00 0 1722 Europe/Andorra 1993-12-23 +3041221 Bosc de la Canal Llisa Bosc de la Canal Llisa 42.56667 1.5 V FRST AD 00 0 1636 Europe/Andorra 1993-12-23 +3041222 Serrat de la Canal de Nicolau Serrat de la Canal de Nicolau 42.61667 1.55 T RDGE AD 00 0 2007 Europe/Andorra 1993-12-23 +3041223 Solana de la Canal Solana de la Canal 42.48333 1.43333 T SLP AD 00 0 1938 Europe/Andorra 1993-12-23 +3041224 Torrent de la Canadilla Torrent de la Canadilla 42.53333 1.58333 H STM AD 00 0 1571 Europe/Andorra 1993-12-23 +3041225 Camps de Sispony Camps de Sispony 42.53333 1.51667 L LCTY AD 00 0 1361 Europe/Andorra 1993-12-23 +3041226 Torrent dels Camps de Pardellà Torrent dels Camps de Pardella 42.46667 1.5 H STM AD 00 0 1383 Europe/Andorra 1993-12-23 +3041227 Camps de Pardellà Camps de Pardella 42.46667 1.51667 L LCTY AD 00 0 1985 Europe/Andorra 1993-12-23 +3041228 Camp Ramonet Camp Ramonet 42.47397 1.53854 L LCTY AD 00 0 2541 Europe/Andorra 2011-04-19 +3041229 Planell de Campillar Planell de Campillar 42.58333 1.68333 T UPLD AD 00 0 2294 Europe/Andorra 1993-12-23 +3041230 Fonts del Campeà Fonts del Campea 42.51667 1.61667 H SPNG AD 00 0 2254 Europe/Andorra 1993-12-23 +3041231 Bosc del Campeà Bosc del Campea 42.53333 1.63333 V FRST AD 00 0 2360 Europe/Andorra 1993-12-23 +3041232 Camp de Vassalló Camp de Vassallo 42.58333 1.53333 L LCTY AD 00 0 1924 Europe/Andorra 1993-12-23 +3041233 Camp del Sastre Camp del Sastre 42.45 1.53333 L LCTY AD 00 0 1859 Europe/Andorra 1993-12-23 +3041234 Camp del Remugar Camp del Remugar 42.56667 1.53333 L LCTY AD 00 0 1669 Europe/Andorra 1993-12-23 +3041235 Camp del Cortal Camp del Cortal 42.56667 1.5 L LCTY AD 00 0 1636 Europe/Andorra 1993-12-23 +3041236 Camp de la Trava Camp de la Trava 42.56667 1.53333 L LCTY AD 00 0 1669 Europe/Andorra 1993-12-23 +3041237 Camp de la Llosa Camp de la Llosa 42.56667 1.51667 L LCTY AD 00 0 1500 Europe/Andorra 1993-12-23 +3041238 Bosc del Camp de la Finestra Bosc del Camp de la Finestra 42.5 1.53333 V FRST AD 00 0 1574 Europe/Andorra 1993-12-23 +3041239 Pedrusques del Camp de Claror Pedrusques del Camp de Claror 42.48333 1.55 T TAL AD 00 0 2233 Europe/Andorra 1993-12-23 +3041240 Camp de Claror Camp de Claror 42.46667 1.55 L LCTY AD 00 0 2341 Europe/Andorra 1993-12-23 +3041241 Camp Borrut Camp Borrut 42.45 1.56667 L LCTY AD 00 0 2558 Europe/Andorra 1993-12-23 +3041242 Pont del Camp Pont del Camp 42.55 1.48333 S BDG AD 00 0 1548 Europe/Andorra 1993-12-23 +3041243 Camí del Canal Cami del Canal 42.51667 1.58333 H CNL AD 00 0 1994 Europe/Andorra 1993-12-23 +3041244 Cal Toni Cal Toni 42.55 1.6 S HSE AD 00 0 2210 Europe/Andorra 1993-12-23 +3041245 Cal Serra Cal Serra 42.46667 1.5 S FRM AD 00 0 1383 Europe/Andorra 1993-12-23 +3041246 Cal Ponet Cal Ponet 42.56667 1.6 S HSE AD 00 0 1655 Europe/Andorra 1993-12-23 +3041247 Cal Patxeta Cal Patxeta 42.56667 1.6 S HSE AD 00 0 1655 Europe/Andorra 1993-12-23 +3041248 Cal Jaumina Cal Jaumina 42.55 1.58333 S HSE AD 00 0 1499 Europe/Andorra 1993-12-23 +3041249 Canal de la Calcinera Canal de la Calcinera Canal de la Calcinera,Canal de la Calzinera 42.53333 1.58333 H STM AD AD 00 0 1571 Europe/Andorra 2011-11-05 +3041250 Cal Call Cal Call 42.55 1.6 S HSE AD 00 0 2210 Europe/Andorra 1993-12-23 +3041251 Cal Borronet Cal Borronet 42.56667 1.6 S HSE AD 00 0 1655 Europe/Andorra 1993-12-23 +3041252 Cal Borró Cal Borro 42.55 1.6 S HSE AD 00 0 2210 Europe/Andorra 1993-12-23 +3041253 Cal Becaina Cal Becaina 42.55 1.58333 S HSE AD 00 0 1499 Europe/Andorra 1993-12-23 +3041254 Cal Bartreta Cal Bartreta 42.55 1.6 S HSE AD 00 0 2210 Europe/Andorra 1993-12-23 +3041255 Solà de Calaup Sola de Calaup 42.58333 1.65 T SLP AD 00 0 1767 Europe/Andorra 1993-12-23 +3041256 Font de la Caitanta Font de la Caitanta 42.48333 1.63333 H SPNG AD 00 0 2296 Europe/Andorra 1993-12-23 +3041257 Serrat del Caire Forc Serrat del Caire Forc 42.53333 1.61667 T SPUR AD 00 0 2237 Europe/Andorra 1993-12-23 +3041258 Riu del Caire Forc Riu del Caire Forc 42.53333 1.61667 H STM AD 00 0 2237 Europe/Andorra 1993-12-23 +3041259 Caire Forc Caire Forc 42.53333 1.63333 L LCTY AD 00 0 2360 Europe/Andorra 1993-12-23 +3041260 Torrent dels Càcols Torrent dels Cacols 42.56667 1.48333 H STM AD 00 0 1508 Europe/Andorra 1993-12-23 +3041261 Roc de la Cacarulla Roc de la Cacarulla 42.55 1.48333 T RK AD 00 0 1548 Europe/Andorra 1993-12-23 +3041262 Collado de Cabris Collado de Cabris Collado de Cabris,Port de Cabus,Port de Cabús 42.55 1.41667 T PASS AD 00 0 2105 Europe/Andorra 2011-11-05 +3041263 Solana de Caborreu Solana de Caborreu 42.43333 1.55 T SLP AD 00 0 2178 Europe/Andorra 1993-12-23 +3041264 Riu de Caborreu Riu de Caborreu 42.45 1.53333 H STM AD 00 0 1859 Europe/Andorra 1993-12-23 +3041265 Bosc de la Cabeça Bosc de la Cabeca 42.5 1.45 V FRST AD 00 0 1840 Europe/Andorra 1993-12-23 +3041266 Pleta de la Cabaneta Pleta de la Cabaneta 42.6 1.61667 L GRAZ AD 00 0 2271 Europe/Andorra 1993-12-23 +3041267 Pic de la Cabaneta Pic de la Cabaneta 42.61667 1.6 T PK AD 00 0 2528 Europe/Andorra 1993-12-23 +3041268 Pic de la Cabanette Pic de la Cabanette Cabaneta,Pic de la Cabaneta,Pic de la Cabanette 42.58333 1.73333 T PK AD 00 0 2378 Europe/Andorra 2011-11-05 +3041269 Bosc de la Cabanella Bosc de la Cabanella 42.51667 1.46667 V FRST AD 00 0 1840 Europe/Andorra 1993-12-23 +3041270 Serra de Cabana Sorda Serra de Cabana Sorda 42.61667 1.66667 T RDGE AD 00 0 2536 Europe/Andorra 1993-12-23 +3041271 Riu de Cabana Sorda Riu de Cabana Sorda 42.6 1.68333 H STM AD 00 0 2089 Europe/Andorra 1993-12-23 +3041272 Pleta de Cabana Sorda Pleta de Cabana Sorda 42.61667 1.68333 L GRAZ AD 00 0 2406 Europe/Andorra 1993-12-23 +3041273 Pales de Cabana Sorda Pales de Cabana Sorda 42.61667 1.66667 T CLF AD 00 0 2536 Europe/Andorra 1993-12-23 +3041274 Estany de Cabana Sorda Estany de Cabana Sorda 42.61667 1.66667 H LK AD 00 0 2536 Europe/Andorra 1993-12-23 +3041275 Cabana Sorda Cabana Sorda 42.61667 1.66667 A ADMD AD 00 0 2536 Europe/Andorra 1993-12-23 +3041276 Font de la Cabana de l’Eucasser Font de la Cabana de l'Eucasser 42.58333 1.61667 H SPNG AD 00 0 1707 Europe/Andorra 1993-12-23 +3041277 Pic de Cabayrou Pic de Cabayrou Cabairu,Cabairú,Pic de Cabagnau,Pic de Cabairu,Pic de Cabairú,Pic de Cabayrou 42.63333 1.46667 T PK AD 00 0 2324 Europe/Andorra 2011-11-05 +3041278 Font de la Ca Font de la Ca 42.45 1.5 H SPNG AD 00 0 1614 Europe/Andorra 1993-12-23 +3041279 Pla de Buscalls Pla de Buscalls Pla de Buscalls,Pla de Busoalls 42.56667 1.65 T UPLD AD AD 00 0 1988 Europe/Andorra 2011-11-05 +3041280 Serrat de la Burna Serrat de la Burna 42.6 1.48333 T SPUR AD 00 0 2441 Europe/Andorra 1993-12-23 +3041281 Pic de la Burna Pic de la Burna 42.6 1.48333 T PK AD 00 0 2441 Europe/Andorra 1993-12-23 +3041282 Clot de la Burna Clot de la Burna 42.6 1.48333 T SLP AD 00 0 2441 Europe/Andorra 1993-12-23 +3041283 Font dels Bullidors Font dels Bullidors 42.46667 1.45 H SPNG AD 00 0 1562 Europe/Andorra 1993-12-23 +3041284 Toll Bullidor Toll Bullidor 42.58333 1.61667 L GRAZ AD 00 0 1707 Europe/Andorra 1993-12-23 +3041285 Barranc del Bullidor Barranc del Bullidor 42.53333 1.71667 H STM AD 00 0 2400 Europe/Andorra 1993-12-23 +3041286 Roc de Bruna Roja Roc de Bruna Roja 42.63333 1.53333 T RK AD 00 0 2072 Europe/Andorra 1993-12-23 +3041287 Pleta del Bruig Pleta del Bruig 42.63333 1.5 L GRAZ AD 00 0 1979 Europe/Andorra 1993-12-23 +3041288 Marrades del Bruig Marrades del Bruig 42.63333 1.5 R TRL AD 00 0 1979 Europe/Andorra 1993-12-23 +3041289 Basers del Bruig Basers del Bruig 42.65 1.5 T CLF AD 00 0 2455 Europe/Andorra 1993-12-23 +3041290 Bruig Bruig 42.65 1.5 T SLP AD 00 0 2455 Europe/Andorra 1993-12-23 +3041291 Pic del Brossós Pic del Brossos 42.61667 1.51667 T PK AD 00 0 1716 Europe/Andorra 1993-12-23 +3041292 Canals del Brossós Canals del Brossos 42.61667 1.53333 H RVN AD 00 0 1609 Europe/Andorra 1993-12-23 +3041293 Camí del Brossós Cami del Brossos 42.61667 1.53333 R TRL AD 00 0 1609 Europe/Andorra 1993-12-23 +3041294 Cortal del Bringuer Cortal del Bringuer 42.45 1.46667 S CRRL AD 00 0 935 Europe/Andorra 1993-12-23 +3041295 Cortal de Bringuer Cortal de Bringuer 42.53333 1.53333 S CRRL AD 00 0 1521 Europe/Andorra 1993-12-23 +3041296 Borda del Bringuer Borda del Bringuer 42.45 1.48333 S HUTS AD 00 0 1111 Europe/Andorra 1993-12-23 +3041297 Clot dels Brillons Clot dels Brillons 42.46667 1.46667 H RVN AD 00 0 1340 Europe/Andorra 1993-12-23 +3041298 Brancs de la Farga Brancs de la Farga 42.48333 1.61667 L LCTY AD 00 0 2217 Europe/Andorra 1993-12-23 +3041299 Tosa del Braibal Tosa del Braibal Tosa del Braibal,Tossal Braibal 42.50302 1.59836 T PK AD 00 0 2436 Europe/Andorra 2011-11-05 +3041300 Planells del Braibal Planells del Braibal 42.51667 1.58333 T UPLD AD 00 0 1994 Europe/Andorra 1993-12-23 +3041301 Font del Braibal Font del Braibal 42.51667 1.58333 H SPNG AD 00 0 1994 Europe/Andorra 1993-12-23 +3041302 Estany de la Bova Estany de la Bova 42.48333 1.65 H LK AD 00 0 2658 Europe/Andorra 1993-12-23 +3041303 Canal de la Bova Canal de la Bova 42.5 1.58333 H STM AD 00 0 1888 Europe/Andorra 1993-12-23 +3041304 Costa de Bou Mort Costa de Bou Mort 42.46667 1.56667 T SLP AD 00 0 2365 Europe/Andorra 1993-12-23 +3041305 Plana del Bou Plana del Bou 42.45 1.46667 T UPLD AD 00 0 935 Europe/Andorra 1993-12-23 +3041306 Cortal del Bou Cortal del Bou 42.45 1.46667 S HUT AD 00 0 935 Europe/Andorra 1993-12-23 +3041307 Roc de la Botiffarra Roc de la Botiffarra 42.48333 1.48333 T RK AD 00 0 981 Europe/Andorra 1993-12-23 +3041308 Col de la Botella Col de la Botella 42.55 1.46667 T PASS AD 00 0 1585 Europe/Andorra 1993-12-23 +3041309 Canal del Botàs Canal del Botas 42.55 1.58333 H STM AD 00 0 1499 Europe/Andorra 1993-12-23 +3041310 Canal dels Botaders Canal dels Botaders 42.5 1.48333 H STM AD 00 0 1316 Europe/Andorra 1993-12-23 +3041311 Canal del Bosc Nou Canal del Bosc Nou 42.58333 1.65 H STM AD 00 0 1767 Europe/Andorra 1993-12-23 +3041312 Canal del Bosc Negre Canal del Bosc Negre 42.55 1.46667 H STM AD 00 0 1585 Europe/Andorra 1993-12-23 +3041313 Bosc del Coll d’Ordino Bosc del Coll d'Ordino 42.55 1.55 A ADMD AD 00 0 2097 Europe/Andorra 1993-12-23 +3041314 Canal del Bosc de Coma Canal del Bosc de Coma 42.53333 1.53333 H STM AD 00 0 1521 Europe/Andorra 1993-12-23 +3041315 Boscarró Boscarro 42.55 1.46667 L LCTY AD 00 0 1585 Europe/Andorra 1993-12-23 +3041316 Torrent del Bosc Torrent del Bosc 42.48333 1.45 H STM AD 00 0 1195 Europe/Andorra 1993-12-23 +3041317 Pla del Bosc Pla del Bosc 42.56667 1.66667 T UPLD AD 00 0 1938 Europe/Andorra 1993-12-23 +3041318 Pla del Bosc Pla del Bosc 42.55 1.6 T UPLD AD 00 0 2210 Europe/Andorra 1993-12-23 +3041319 Clot del Bosc Clot del Bosc 42.43333 1.51667 T SLP AD 00 0 2031 Europe/Andorra 1993-12-23 +3041320 Barranc del Bosc Barranc del Bosc 42.56667 1.58333 H STM AD 00 0 1919 Europe/Andorra 1993-12-23 +3041321 Boïgues de Borró Boigues de Borro 42.55 1.6 V CULT AD 00 0 2210 Europe/Andorra 1993-12-23 +3041322 Pleta dels Borrecs Pleta dels Borrecs 42.58333 1.68333 L GRAZ AD 00 0 2294 Europe/Andorra 1993-12-23 +3041323 Borrassica Borrassica 42.5 1.48333 L LCTY AD 00 0 1316 Europe/Andorra 1993-12-23 +3041324 Pla de Borràs Pla de Borras 42.53333 1.48333 T UPLD AD 00 0 1677 Europe/Andorra 1993-12-23 +3041325 Bosc del Bornal Bosc del Bornal 42.53333 1.46667 V FRST AD 00 0 1846 Europe/Andorra 1993-12-23 +3041326 Pla de Bordetes Pla de Bordetes 42.6 1.66667 T UPLD AD 00 0 1858 Europe/Andorra 1993-12-23 +3041327 Bordes de Ramonet Bordes de Ramonet 42.51667 1.55 A ADMD AD 00 0 1322 Europe/Andorra 1993-12-23 +3041328 Canal de les Bordes Canal de les Bordes 42.56667 1.61667 H RVN AD 00 0 1920 Europe/Andorra 1993-12-23 +3041329 Palanca de la Borda del Sabater Palanca de la Borda del Sabater 42.45 1.48333 S BDG AD 00 0 1111 Europe/Andorra 1993-12-23 +3041330 Bosc de la Borda del Rauquet Bosc de la Borda del Rauquet 42.6 1.63333 V FRST AD 00 0 1893 Europe/Andorra 1993-12-23 +3041331 Borda del Molines Borda del Molines 42.5 1.43333 S RUIN AD 00 0 1654 Europe/Andorra 1993-12-23 +3041332 Borda del Ferrer Nou Borda del Ferrer Nou 42.45 1.48333 S RUIN AD 00 0 1111 Europe/Andorra 1993-12-23 +3041333 Camí de la Borda del Cosp Cami de la Borda del Cosp 42.45 1.48333 R TRL AD 00 0 1111 Europe/Andorra 1993-12-23 +3041334 Basera de la Borda de l’Arena Basera de la Borda de l'Arena 42.48333 1.46667 T CLF AD 00 0 1148 Europe/Andorra 1993-12-23 +3041335 Borda de l’Alma Borda de l'Alma 42.58333 1.65 S RUIN AD 00 0 1767 Europe/Andorra 1993-12-23 +3041336 Riu de la Bor Riu de la Bor 42.58333 1.63333 H STM AD 00 0 1722 Europe/Andorra 1993-12-23 +3041337 Gorges de la Bor Gorges de la Bor 42.55 1.58333 T GRGE AD 00 0 1499 Europe/Andorra 1993-12-23 +3041338 Costa del Bony Roig Costa del Bony Roig 42.6 1.61667 T SLP AD 00 0 2271 Europe/Andorra 1993-12-23 +3041339 Planades del Bony Negre Planades del Bony Negre 42.56667 1.45 T UPLD AD 00 0 2137 Europe/Andorra 1993-12-23 +3041340 Canal Gran del Bony de la Pica Canal Gran del Bony de la Pica 42.5 1.46667 H STM AD 00 0 1678 Europe/Andorra 1993-12-23 +3041341 Obaga del Bony de la Costa Obaga del Bony de la Costa 42.56667 1.53333 T SLP AD 00 0 1669 Europe/Andorra 1993-12-23 +3041342 Obaga del Bony Obaga del Bony 42.5 1.58333 T SLP AD 00 0 1888 Europe/Andorra 1993-12-23 +3041343 Boïga del Bony Boiga del Bony 42.56667 1.48333 V CULT AD 00 0 1508 Europe/Andorra 1993-12-23 +3041344 Boïga del Bony Boiga del Bony 42.45 1.53333 V CULT AD 00 0 1859 Europe/Andorra 1993-12-23 +3041345 Canal de les Bons Canal de les Bons 42.53333 1.58333 H STM AD 00 0 1571 Europe/Andorra 1993-12-23 +3041346 Canal de la Boneta Canal de la Boneta 42.5 1.5 H STM AD 00 0 1135 Europe/Andorra 1993-12-23 +3041347 Pont de Bonavida Pont de Bonavida 42.6 1.68333 S BDG AD 00 0 2089 Europe/Andorra 1993-12-23 +3041348 Bombal Bombal 42.6 1.53333 L LCTY AD 00 0 1695 Europe/Andorra 1993-12-23 +3041349 Bosc de la Boixera Bosc de la Boixera 42.53333 1.51667 V FRST AD 00 0 1361 Europe/Andorra 1993-12-23 +3041350 Canal de la Boïgueta Canal de la Boigueta 42.56667 1.51667 H STM AD 00 0 1500 Europe/Andorra 1993-12-23 +3041351 Costa de les Boïgues Costa de les Boigues 42.48333 1.46667 T SLP AD 00 0 1148 Europe/Andorra 1993-12-23 +3041352 Canal de les Boïgues Canal de les Boigues 42.55 1.46667 H STM AD 00 0 1585 Europe/Andorra 1993-12-23 +3041353 Boïgots Boigots 42.55 1.55 L LCTY AD 00 0 2097 Europe/Andorra 1993-12-23 +3041354 Font del Boïgot Font del Boigot 42.5 1.56667 H SPNG AD 00 0 1776 Europe/Andorra 1993-12-23 +3041355 Canal del Boïgot Canal del Boigot 42.5 1.55 H STM AD 00 0 1566 Europe/Andorra 1993-12-23 +3041356 Bosc de Boïga Plana Bosc de Boiga Plana 42.45 1.45 V FRST AD 00 0 1482 Europe/Andorra 1993-12-23 +3041357 Font de la Boïga Mitgera Font de la Boiga Mitgera 42.5 1.46667 H SPNG AD 00 0 1678 Europe/Andorra 1993-12-23 +3041358 Canal dels Boïgals Canal dels Boigals 42.51667 1.5 H STM AD 00 0 1688 Europe/Andorra 1993-12-23 +3041359 Serrat de Boïga Gran Serrat de Boiga Gran 42.48333 1.48333 T SPUR AD 00 0 981 Europe/Andorra 1993-12-23 +3041360 Font de la Boïga del Roi Font de la Boiga del Roi 42.5 1.48333 H SPNG AD 00 0 1316 Europe/Andorra 1993-12-23 +3041361 Roc de Boïga Curta Roc de Boiga Curta 42.51667 1.55 T RK AD 00 0 1322 Europe/Andorra 1993-12-23 +3041362 Estany Blau Estany Blau 42.49666 1.62069 H LK AD 00 0 2560 Europe/Andorra 2011-04-19 +3041363 Roques Blanques Roques Blanques 42.48333 1.48333 T CLF AD 00 0 981 Europe/Andorra 1993-12-23 +3041364 Rocs Blancs Rocs Blancs 42.45 1.45 T SLP AD 00 0 1482 Europe/Andorra 1993-12-23 +3041365 Roca Blanca Roca Blanca 42.56667 1.48333 T RK AD 00 0 1508 Europe/Andorra 1993-12-23 +3041366 La Porteille Blanche La Porteille Blanche La Porteille Blanche,Porteille Blanche d'Andorra,Porteille Blanche d'Andorre,Porteille Blanche d’Andorra,Porteille Blanche d’Andorre,Portella Blanca 42.5 1.73333 T PASS AD 00 0 2686 Europe/Andorra 2011-11-05 +3041367 Font Blanca Font Blanca 42.65 1.53333 H SPNG AD 00 0 2564 Europe/Andorra 1993-12-23 +3041368 Font Blanca Font Blanca 42.58333 1.58333 H SPNG AD 00 0 1993 Europe/Andorra 1993-12-23 +3041369 Canal Blanca Canal Blanca 42.55 1.61667 H RVN AD 00 0 2206 Europe/Andorra 1993-12-23 +3041370 Vial Blanc Vial Blanc 42.48333 1.5 R RD AD 00 0 1631 Europe/Andorra 1993-12-23 +3041371 Roc Blanc Roc Blanc 42.48333 1.53333 T RK AD 00 0 2255 Europe/Andorra 1993-12-23 +3041372 Riu Blanc Riu Blanc 42.53333 1.58333 H STM AD 00 0 1571 Europe/Andorra 1993-12-23 +3041373 Coll Blanc Coll Blanc 42.52961 1.72014 T PK AD 00 0 2400 Europe/Andorra 2011-04-19 +3041374 Carretera de Bixessarri Carretera de Bixessarri 42.48333 1.46667 R RD AD 00 0 1148 Europe/Andorra 1993-12-23 +3041375 Bixessarri Bixessarri Bicisarri,Bixessarri,Bixisarri,Biçisarri,Vixesarri 42.48238 1.45949 P PPL AD 06 0 1178 Europe/Andorra 2011-11-05 +3041376 Bissets Bissets 42.53333 1.53333 L LCTY AD 00 0 1521 Europe/Andorra 1993-12-23 +3041377 Bisset Bisset 42.55 1.53333 L LCTY AD 00 0 1593 Europe/Andorra 1993-12-23 +3041378 Planell del Bisbe Planell del Bisbe 42.48333 1.58333 T UPLD AD 00 0 2349 Europe/Andorra 1993-12-23 +3041379 Font del Bisbe Font del Bisbe 42.55 1.45 H SPNG AD 00 0 1788 Europe/Andorra 1993-12-23 +3041380 Font de la Birena Font de la Birena 42.51667 1.51667 H SPNG AD 00 0 1265 Europe/Andorra 1993-12-23 +3041381 Fontanal del Besurt Fontanal del Besurt 42.53333 1.48333 H SPNG AD 00 0 1677 Europe/Andorra 1993-12-23 +3041382 Roc del Bessó Roc del Besso 42.45 1.46667 T RK AD 00 0 935 Europe/Andorra 1993-12-23 +3041383 Font del Bessó Font del Besso 42.45 1.48333 H SPNG AD 00 0 1111 Europe/Andorra 1993-12-23 +3041384 Costa de Bescaran Costa de Bescaran 42.43333 1.5 T SLP AD 00 0 1804 Europe/Andorra 1993-12-23 +3041385 Portella de Besalí Portella de Besali 42.63333 1.55 T PASS AD 00 0 2053 Europe/Andorra 1993-12-23 +3041386 Pla de Besalí Pla de Besali 42.63333 1.55 T UPLD AD 00 0 2053 Europe/Andorra 1993-12-23 +3041387 Pic de Besalí Pic de Besali 42.63333 1.53333 T PK AD 00 0 2072 Europe/Andorra 1993-12-23 +3041388 Basers de Besalí Basers de Besali 42.63333 1.55 T CLF AD 00 0 2053 Europe/Andorra 1993-12-23 +3041389 Besalí Besali 42.63333 1.53333 A ADMD AD 00 0 2072 Europe/Andorra 1993-12-23 +3041390 Clot de les Berques Clot de les Berques 42.55 1.48333 H RVN AD 00 0 1548 Europe/Andorra 1993-12-23 +3041391 Coma Bella Coma Bella 42.58333 1.68333 T VAL AD 00 0 2294 Europe/Andorra 1993-12-23 +3041392 Riu de la Beixellosa Riu de la Beixellosa 42.53333 1.53333 H STM AD 00 0 1521 Europe/Andorra 1993-12-23 +3041393 Bosc de la Beixellosa Bosc de la Beixellosa 42.53333 1.53333 V FRST AD 00 0 1521 Europe/Andorra 1993-12-23 +3041394 Collada de Beixalís Collada de Beixalis 42.53333 1.55 T PASS AD 00 0 1344 Europe/Andorra 1993-12-23 +3041395 Carretera Beixalís Carretera Beixalis 42.53333 1.56667 R RD AD 00 0 1418 Europe/Andorra 1993-12-23 +3041396 Bosc de Beixalís Bosc de Beixalis 42.53333 1.55 V FRST AD 00 0 1344 Europe/Andorra 1993-12-23 +3041397 Bordes de Beixalís Bordes de Beixalis 42.53333 1.55 S FRMS AD 00 0 1344 Europe/Andorra 1993-12-23 +3041398 Beixalís Beixalis 42.53333 1.55 A ADMD AD 00 0 1344 Europe/Andorra 1993-12-23 +3041399 Comes Beçoses Comes Becoses 42.51667 1.6 H RVN AD 00 0 2085 Europe/Andorra 1993-12-23 +3041400 Planell dels Beços Planell dels Becos 42.61667 1.56667 T UPLD AD 00 0 2228 Europe/Andorra 1993-12-23 +3041401 Bosc del Becet Bosc del Becet 42.56667 1.53333 V FRST AD 00 0 1669 Europe/Andorra 1993-12-23 +3041402 Vial del Beç Vial del Bec 42.53333 1.46667 R TRL AD 00 0 1846 Europe/Andorra 1993-12-23 +3041403 Solana dels Batallats Solana dels Batallats 42.56667 1.51667 T SLP AD 00 0 1500 Europe/Andorra 1993-12-23 +3041404 Roc dels Batallassos Roc dels Batallassos 42.56667 1.6 T RK AD 00 0 1655 Europe/Andorra 1993-12-23 +3041405 Coll del Bast Coll del Bast 42.48333 1.48333 T PK AD 00 0 981 Europe/Andorra 1993-12-23 +3041406 Basses del Siscaró Basses del Siscaro 42.58333 1.7 L LCTY AD 00 0 2584 Europe/Andorra 1993-12-23 +3041407 Basses dels Basers Basses dels Basers 42.58333 1.7 L LCTY AD 00 0 2584 Europe/Andorra 1993-12-23 +3041408 Pales de les Basses de les Salamandres Pales de les Basses de les Salamandres 42.61667 1.66667 T SLP AD 00 0 2536 Europe/Andorra 1993-12-23 +3041409 Basses de la Burna Basses de la Burna 42.6 1.48333 T RKS AD 00 0 2441 Europe/Andorra 1993-12-23 +3041410 Planell de les Basses Planell de les Basses 42.55 1.58333 T UPLD AD 00 0 1499 Europe/Andorra 1993-12-23 +3041411 Pla de la Bassa de les Granotes Pla de la Bassa de les Granotes 42.58333 1.43333 T UPLD AD 00 0 2412 Europe/Andorra 1993-12-23 +3041412 Basers de l’Estany de Més Amunt Basers de l'Estany de Mes Amunt 42.6 1.46667 L LCTY AD 00 0 2421 Europe/Andorra 1993-12-23 +3041413 Basers de Font Blanca Basers de Font Blanca 42.65 1.55 L LCTY AD 00 0 2181 Europe/Andorra 1993-12-23 +3041414 Coll de Basers Coll de Basers 42.5 1.48333 T RDGE AD 00 0 1316 Europe/Andorra 1993-12-23 +3041415 Baser Negre Baser Negre 42.63333 1.46667 L LCTY AD 00 0 2324 Europe/Andorra 1993-12-23 +3041416 Cap del Baser de la Llonga Cap del Baser de la Llonga 42.56667 1.51667 T SPUR AD 00 0 1500 Europe/Andorra 1993-12-23 +3041417 Cap del Baser Cap del Baser 42.56667 1.51667 T SPUR AD 00 0 1500 Europe/Andorra 1993-12-23 +3041418 Canal de Bartreta Canal de Bartreta 42.55 1.6 H RVN AD 00 0 2210 Europe/Andorra 1993-12-23 +3041419 Bosc de les Bartres Bosc de les Bartres 42.51667 1.5 V FRST AD 00 0 1688 Europe/Andorra 1993-12-23 +3041420 Bosc de la Bartra Bosc de la Bartra 42.5 1.51667 V FRST AD 00 0 1410 Europe/Andorra 1993-12-23 +3041421 Pont dels Barrons Pont dels Barrons 42.61667 1.55 S BDG AD 00 0 2007 Europe/Andorra 1993-12-23 +3041422 Torrent del Barreró Torrent del Barrero 42.48333 1.46667 H STM AD 00 0 1148 Europe/Andorra 1993-12-23 +3041423 Bosc del Barrer d’Areny Bosc del Barrer d'Areny 42.58333 1.46667 V FRST AD 00 0 1643 Europe/Andorra 1993-12-23 +3041424 Barrer d’Areny Barrer d'Areny 42.58333 1.46667 L GRAZ AD 00 0 1643 Europe/Andorra 1993-12-23 +3041425 Roc del Barrer Roc del Barrer 42.55 1.53333 T SPUR AD 00 0 1593 Europe/Andorra 1993-12-23 +3041426 Canal del Barrer Canal del Barrer 42.56667 1.51667 H STM AD 00 0 1500 Europe/Andorra 1993-12-23 +3041427 Riu de la Barraca Cremada Riu de la Barraca Cremada 42.53333 1.7 H STM AD 00 0 2357 Europe/Andorra 1993-12-23 +3041428 Solà de Barra Sola de Barra 42.58333 1.65 T SLP AD 00 0 1767 Europe/Andorra 1993-12-23 +3041429 Prats de la Baronia Prats de la Baronia 42.53333 1.61667 L GRAZ AD 00 0 2237 Europe/Andorra 1993-12-23 +3041430 Planell de la Baronia Planell de la Baronia 42.53333 1.61667 T UPLD AD 00 0 2237 Europe/Andorra 1993-12-23 +3041431 Borda de la Baronia Borda de la Baronia 42.53333 1.61667 S HUT AD 00 0 2237 Europe/Andorra 1993-12-23 +3041432 Canal dels Banys Canal dels Banys 42.53333 1.5 H STM AD 00 0 1357 Europe/Andorra 1993-12-23 +3041433 Bosc dels Banys Bosc dels Banys 42.53333 1.5 V FRST AD 00 0 1357 Europe/Andorra 1993-12-23 +3041434 Port de Banyell Port de Banyell 42.64218 1.5777 T PASS AD 00 0 2365 Europe/Andorra 2011-04-19 +3041435 Font de Banyell Font de Banyell 42.63333 1.56667 H SPNG AD 00 0 2394 Europe/Andorra 1993-12-23 +3041436 Banyell Banyell 42.63333 1.56667 L LCTY AD 00 0 2394 Europe/Andorra 1993-12-23 +3041437 Bosc dels Bancs Bosc dels Bancs 42.48333 1.46667 V FRST AD 00 0 1148 Europe/Andorra 1993-12-23 +3041438 Riu del Bancal Vedeller Riu del Bancal Vedeller 42.6 1.46667 H STM AD 00 0 2421 Europe/Andorra 1993-12-23 +3041439 Basers del Bancal Vedeller Basers del Bancal Vedeller 42.6 1.45 T CLF AD 00 0 2174 Europe/Andorra 1993-12-23 +3041440 Plana del Banc Plana del Banc 42.43333 1.5 T UPLD AD 00 0 1804 Europe/Andorra 1993-12-23 +3041441 Font del Baladre Font del Baladre 42.58333 1.48333 H SPNG AD 00 0 1809 Europe/Andorra 1993-12-23 +3041442 Pont de la Baladosa Pont de la Baladosa 42.6 1.68333 S BDG AD 00 0 2089 Europe/Andorra 1993-12-23 +3041443 Baladosa Baladosa 42.58333 1.68333 L LCTY AD 00 0 2294 Europe/Andorra 1993-12-23 +3041444 Collades Baixes d’Emportona Collades Baixes d'Emportona 42.51667 1.65 T PASS AD 00 0 2633 Europe/Andorra 1993-12-23 +3041445 Collades Baixes Collades Baixes 42.5 1.63333 T PASS AD 00 0 2545 Europe/Andorra 1993-12-23 +3041446 Baixant Baixant 42.55 1.48333 L LCTY AD 00 0 1548 Europe/Andorra 1993-12-23 +3041447 Pleta de Baix Pleta de Baix 42.51667 1.61667 L GRAZ AD 00 0 2254 Europe/Andorra 1993-12-23 +3041448 Pleta de Baix Pleta de Baix 42.48333 1.43333 L GRAZ AD 00 0 1938 Europe/Andorra 1993-12-23 +3041449 Estany de Baix Estany de Baix 42.58333 1.7 H LK AD 00 0 2584 Europe/Andorra 1993-12-23 +3041450 Font de Baiter Font de Baiter 42.55 1.51667 H SPNG AD 00 0 1397 Europe/Andorra 1993-12-23 +3041451 Port de Baiau Port de Baiau Port de Baiau 42.6 1.43333 T PASS AD 00 0 2667 Europe/Andorra 2011-11-05 +3041452 Pic de Baiau Pic de Baiau Pic de Baiau 42.58333 1.43333 T PK AD 00 0 2412 Europe/Andorra 2011-11-05 +3041453 Agulla de Baiau Agulla de Baiau Agulla de Baiau 42.58333 1.43333 T PK AD 00 0 2412 Europe/Andorra 2011-11-05 +3041454 Planells de Baell Planells de Baell 42.48333 1.6 T UPLD AD 00 0 2250 Europe/Andorra 1993-12-23 +3041455 Font de Baell Font de Baell 42.5 1.61667 H SPNG AD 00 0 2560 Europe/Andorra 1993-12-23 +3041456 Pleta de les Bacives Pleta de les Bacives 42.5 1.65 L GRAZ AD 00 0 2542 Europe/Andorra 1993-12-23 +3041457 Serra de l’ Avier Serra de l' Avier 42.6 1.5 T RDGE AD 00 0 1923 Europe/Andorra 1993-12-23 +3041458 Plana de l’ Avier Plana de l' Avier 42.6 1.5 T UPLD AD 00 0 1923 Europe/Andorra 1993-12-23 +3041459 Obaga de l’ Avier Obaga de l' Avier 42.48333 1.53333 T SLP AD 00 0 2255 Europe/Andorra 1993-12-23 +3041460 Costa de l’ Avier Costa de l' Avier 42.56667 1.55 T SLP AD 00 0 1996 Europe/Andorra 1993-12-23 +3041461 Camí de l’ Avier Cami de l' Avier 42.48333 1.55 R TRL AD 00 0 2233 Europe/Andorra 1993-12-23 +3041462 Bosc de l’ Avier Bosc de l' Avier 42.48333 1.53333 V FRST AD 00 0 2255 Europe/Andorra 1993-12-23 +3041463 Torrent de l’ Aviar Torrent de l' Aviar 42.53333 1.56667 H STM AD 00 0 1418 Europe/Andorra 1993-12-23 +3041464 Canal de l’ Avetar Canal de l' Avetar 42.58333 1.65 H STM AD 00 0 1767 Europe/Andorra 1993-12-23 +3041465 Canal de l’ Avetar Canal de l' Avetar 42.5 1.48333 H STM AD 00 0 1316 Europe/Andorra 1993-12-23 +3041466 Bosc de l’ Avetar Bosc de l' Avetar 42.55 1.55 V FRST AD 00 0 2097 Europe/Andorra 1993-12-23 +3041467 Costa de Avet Costa de Avet 42.5 1.56667 T SLP AD 00 0 1776 Europe/Andorra 1993-12-23 +3041468 Canal de l’ Avet Canal de l' Avet 42.55 1.5 H STM AD 00 0 1292 Europe/Andorra 1993-12-23 +3041469 Costa de l’ Ave Maria Costa de l' Ave Maria 42.61667 1.53333 T SLP AD 00 0 1609 Europe/Andorra 1993-12-23 +3041470 Solà de l’ Avellanet Sola de l' Avellanet 42.58333 1.48333 T SLP AD 00 0 1809 Europe/Andorra 1993-12-23 +3041471 Costa dels Avellaners Costa dels Avellaners 42.56667 1.61667 T SLP AD 00 0 1920 Europe/Andorra 1993-12-23 +3041472 Canal dels Avellaners Canal dels Avellaners 42.58333 1.46667 H RVN AD 00 0 1643 Europe/Andorra 1993-12-23 +3041473 Coma Aubosa Coma Aubosa 42.58333 1.5 T SLP AD 00 0 1595 Europe/Andorra 1993-12-23 +3041474 Riu d’ Aubinyà Riu d' Aubinya 42.45 1.48333 H STM AD 00 0 1111 Europe/Andorra 1993-12-23 +3041475 Aubinyà Aubinya Aubinya,Aubinyà,Auvinya 42.45447 1.48761 P PPL AD 06 0 1159 Europe/Andorra 2011-11-05 +3041476 Aubinyà Aubinya 42.45 1.5 A ADMD AD 00 0 1614 Europe/Andorra 1993-12-23 +3041477 Roc de les Aubes Roc de les Aubes 42.51667 1.55 T SPUR AD 00 0 1322 Europe/Andorra 1993-12-23 +3041478 Riu de les Aubes Riu de les Aubes 42.55 1.53333 H STM AD 00 0 1593 Europe/Andorra 1993-12-23 +3041479 Costa de l’ Aubell Costa de l' Aubell 42.56667 1.53333 T SLP AD 00 0 1669 Europe/Andorra 1993-12-23 +3041480 Aubaderes Aubaderes 42.5 1.48333 L LCTY AD 00 0 1316 Europe/Andorra 1993-12-23 +3041481 Roc de l’ Auba Roc de l' Auba 42.56667 1.5 T RK AD 00 0 1636 Europe/Andorra 1993-12-23 +3041482 Canal dels Astrells Canal dels Astrells 42.48333 1.56667 H STM AD 00 0 2231 Europe/Andorra 1993-12-23 +3041483 Riu de l’ Astrell Riu de l' Astrell 42.55 1.55 H STM AD 00 0 2097 Europe/Andorra 1993-12-23 +3041484 Cap de l’ Astrell Cap de l' Astrell 42.56667 1.56667 T SPUR AD 00 0 2089 Europe/Andorra 1993-12-23 +3041485 Bosc de l’ Astrell Bosc de l' Astrell 42.56667 1.56667 V FRST AD 00 0 2089 Europe/Andorra 1993-12-23 +3041486 Canals dels Assaladors dels Pletius Canals dels Assaladors dels Pletius 42.5 1.46667 H STM AD 00 0 1678 Europe/Andorra 1993-12-23 +3041487 Assaladors del Planell Gran Assaladors del Planell Gran 42.56667 1.46667 L LCTY AD 00 0 1673 Europe/Andorra 1993-12-23 +3041488 Assaladors de Cabana Sorda Assaladors de Cabana Sorda 42.6 1.66667 T PKS AD 00 0 1858 Europe/Andorra 1993-12-23 +3041489 Canal de l’ Assalador de Rei Canal de l' Assalador de Rei 42.55 1.46667 H STM AD 00 0 1585 Europe/Andorra 1993-12-23 +3041490 Bosc de l’ Assalador Bosc de l' Assalador 42.61667 1.65 V FRST AD 00 0 2567 Europe/Andorra 1993-12-23 +3041491 Bosc de l’ Assalador Bosc de l' Assalador 42.56667 1.6 V FRST AD 00 0 1655 Europe/Andorra 1993-12-23 +3041492 Bosc de l’ Assalador Bosc de l' Assalador 42.56667 1.58333 V FRST AD 00 0 1919 Europe/Andorra 1993-12-23 +3041493 Serra del Cap dels Aspres de Banyell Serra del Cap dels Aspres de Banyell 42.63333 1.56667 T MT AD 00 0 2394 Europe/Andorra 1993-12-23 +3041494 Aspres de Banyell Aspres de Banyell 42.63333 1.56667 L LCTY AD 00 0 2394 Europe/Andorra 1993-12-23 +3041495 Pic dels Aspres Pic dels Aspres Pic dels Aspres 42.56667 1.45 T PK AD 00 0 2562 2137 Europe/Andorra 2011-11-05 +3041496 Rocs de l’ Aspra Rocs de l' Aspra 42.53333 1.53333 T RKS AD 00 0 1521 Europe/Andorra 1993-12-23 +3041497 Riu de l’ Aspra Riu de l' Aspra 42.55 1.55 H STM AD 00 0 2097 Europe/Andorra 1993-12-23 +3041498 Clots de l’ Aspra Clots de l' Aspra 42.51667 1.63333 H RVN AD 00 0 2379 Europe/Andorra 1993-12-23 +3041499 Alt de l’ Aspra Alt de l' Aspra 42.51667 1.65 T SLP AD 00 0 2633 Europe/Andorra 1993-12-23 +3041500 Canals d’ Aspones Canals d' Aspones 42.61667 1.7 H RVN AD 00 0 2285 Europe/Andorra 1993-12-23 +3041501 Torrent dels Aspedius Torrent dels Aspedius 42.48333 1.53333 H STM AD 00 0 2255 Europe/Andorra 1993-12-23 +3041502 Comella Ascura Comella Ascura 42.45 1.45 H RVN AD 00 0 1482 Europe/Andorra 1993-12-23 +3041503 Rocs de l’ Ascobet Rocs de l' Ascobet 42.61667 1.51667 T RKS AD 00 0 1716 Europe/Andorra 1993-12-23 +3041504 Ascobar de Puntal Ascobar de Puntal 42.63333 1.55 L LCTY AD 00 0 2053 Europe/Andorra 1993-12-23 +3041505 Canal de les Asclades Canal de les Asclades 42.5 1.53333 H STM AD 00 0 1574 Europe/Andorra 1993-12-23 +3041506 Serrat de l’ Ascladella Serrat de l' Ascladella 42.53333 1.46667 T RDGE AD 00 0 1846 Europe/Andorra 1993-12-23 +3041507 Fontanal de l’ Ascladella Fontanal de l' Ascladella 42.53333 1.46667 H SPNG AD 00 0 1846 Europe/Andorra 1993-12-23 +3041508 Coma de l’ Ascladella Coma de l' Ascladella 42.56667 1.48333 T SLP AD 00 0 1508 Europe/Andorra 1993-12-23 +3041509 Torrent dels Artics Torrent dels Artics 42.55 1.58333 H STM AD 00 0 1499 Europe/Andorra 1993-12-23 +3041510 Artic de Capell Artic de Capell 42.58333 1.6 L LCTY AD 00 0 1828 Europe/Andorra 1993-12-23 +3041511 Font de l’ Artic Font de l' Artic 42.48333 1.5 H SPNG AD 00 0 1631 Europe/Andorra 1993-12-23 +3041512 Bony de l’ Artic Bony de l' Artic 42.55 1.55 T SPUR AD 00 0 2097 Europe/Andorra 1993-12-23 +3041513 Serrat de l’ Arna Tova Serrat de l' Arna Tova 42.58333 1.46667 T SPUR AD 00 0 1643 Europe/Andorra 1993-12-23 +3041514 Arna Tova Arna Tova 42.58333 1.46667 L LCTY AD 00 0 1643 Europe/Andorra 1993-12-23 +3041515 Bordes de l’ Armiana Bordes de l' Armiana 42.58333 1.6 S HUTS AD 00 0 1828 Europe/Andorra 1993-12-23 +3041516 Font de l’ Arinsola Font de l' Arinsola 42.48333 1.41667 H SPNG AD 00 0 1920 Europe/Andorra 1993-12-23 +3041517 Riu d’ Arinsal Riu d' Arinsal Riu d' Arinsal,Riu d' Arinsul,Riu d’ Arinsal,Riu d’ Arinsul 42.5456 1.51523 H STM AD 00 0 1257 Europe/Andorra 2011-11-05 +3041518 Port d’ Arinsal Port d' Arinsal Port d' Arinsal,Port d’ Arinsal 42.6 1.46667 T PASS AD 00 0 2421 Europe/Andorra 2011-11-05 +3041519 Arinsal Arinsal Arinsal,Аринсал 42.57205 1.48453 P PPL AD 04 1419 1655 Europe/Andorra 2010-01-29 +3041520 Canal de Argelagosa Canal de Argelagosa 42.51667 1.53333 H STM AD 00 0 1460 Europe/Andorra 1993-12-23 +3041521 Roc de l’ Areny Roc de l' Areny 42.56667 1.6 T PROM AD 00 0 1655 Europe/Andorra 1993-12-23 +3041522 Rec d’ Areny Rec d' Areny 42.58333 1.46667 H STM AD 00 0 1643 Europe/Andorra 1993-12-23 +3041523 Coll d’ Arenes Coll d' Arenes 42.6 1.58333 T PASS AD 00 0 2461 Europe/Andorra 1993-12-23 +3041524 Bassa de l’ Arena Bassa de l' Arena 42.51667 1.63333 H STMH AD 00 0 2379 Europe/Andorra 1993-12-23 +3041525 Font d’ Arduix Font d' Arduix Font d' Arduix,Font d’ Arduix 42.45 1.45 H SPNG AD 00 0 1482 Europe/Andorra 2011-11-05 +3041526 Solana d’ Arcavell Solana d' Arcavell Solana d' Arcabell,Solana d' Arcavell,Solana d’ Arcabell,Solana d’ Arcavell 42.43333 1.51667 T SLP AD 00 0 2031 Europe/Andorra 2011-11-05 +3041527 Serra d’ Arcalís Serra d' Arcalis 42.61667 1.5 T RDGE AD 00 0 2390 Europe/Andorra 1993-12-23 +3041528 Roc d’ Arcalís Roc d' Arcalis 42.63333 1.5 T RK AD 00 0 1979 Europe/Andorra 1993-12-23 +3041529 Riu d’ Arcalís Riu d' Arcalis 42.63333 1.5 H STM AD 00 0 1979 Europe/Andorra 1993-12-23 +3041530 Portella d’ Arcalís Portella d' Arcalis 42.61667 1.48333 T PASS AD 00 0 2470 Europe/Andorra 1993-12-23 +3041531 Pont d’ Arcalís Pont d' Arcalis 42.63333 1.5 S BDG AD 00 0 1979 Europe/Andorra 1993-12-23 +3041532 Pic d’ Arcalís Pic d' Arcalis 42.61575 1.4904 T PK AD 00 0 2431 Europe/Andorra 2011-04-19 +3041533 Feixans d’ Arcalís Feixans d' Arcalis 42.63333 1.5 V CULT AD 00 0 1979 Europe/Andorra 1993-12-23 +3041534 Collades d’ Arcalís Collades d' Arcalis 42.63333 1.51667 T PASS AD 00 0 1894 Europe/Andorra 1993-12-23 +3041535 Cabana d’ Arcalís Cabana d' Arcalis 42.63333 1.5 S HUT AD 00 0 1979 Europe/Andorra 1993-12-23 +3041536 Basers d’ Arcalís Basers d' Arcalis 42.61667 1.5 T CLF AD 00 0 2390 Europe/Andorra 1993-12-23 +3041537 Port de l’ Albeille Port de l' Albeille Port de l' Albeille,Port de l' Albelle,Port de l' Arbeille,Port de l' Arbella,Port de l’ Albeille,Port de l’ Albelle,Port de l’ Arbeille,Port de l’ Arbella,Porteille de l' Albelle,Porteille de l’ Albelle 42.65 1.5 T PASS AD 00 0 2455 Europe/Andorra 2011-11-05 +3041538 Canal de l’ Arbeguer Canal de l' Arbeguer 42.48333 1.43333 H STM AD 00 0 1938 Europe/Andorra 1993-12-23 +3041539 Pont d’ Arans Pont d' Arans 42.58333 1.51667 S BDG AD 00 0 1722 Europe/Andorra 1993-12-23 +3041540 Canals d’ Arans Canals d' Arans 42.58333 1.5 H RVN AD 00 0 1595 Europe/Andorra 1993-12-23 +3041541 Arans Arans Arans 42.58226 1.51844 P PPL AD 05 0 1722 Europe/Andorra 2011-11-05 +3041542 Coll de la Quell Coll de la Quell Coll de l' Aquell,Coll de la Quell,Coll de l’ Aquell 42.48333 1.41667 T PASS AD 00 0 1920 Europe/Andorra 2011-11-05 +3041543 Anyós Anyos 42.53458 1.52672 P PPL AD 04 0 1491 Europe/Andorra 2011-04-19 +3041544 Bosc Gran de l’ Any de la Part Bosc Gran de l' Any de la Part 42.55 1.51667 V FRST AD 00 0 1397 Europe/Andorra 1993-12-23 +3041545 Planell d’ Antònia Planell d' Antonia 42.51667 1.55 T UPLD AD 00 0 1322 Europe/Andorra 1993-12-23 +3041546 Ansalonga Ansalonga Ansalonga 42.56919 1.52285 P PPL AD 05 0 1500 Europe/Andorra 2011-11-05 +3041547 Serra d’ Anrodat Serra d' Anrodat 42.61667 1.68333 T RDGE AD 00 0 2406 Europe/Andorra 1993-12-23 +3041548 Pic de la Coume d’Enfer Pic de la Coume d'Enfer Pic d' Anrodat,Pic de la Coume d'Enfer,Pic de la Coume d’Enfer,Pic d’ Anrodat 42.61667 1.68333 T RDGE AD 00 0 2406 Europe/Andorra 2011-11-05 +3041549 Estany d’ Anrodat Estany d' Anrodat 42.61667 1.68333 H LK AD 00 0 2406 Europe/Andorra 1993-12-23 +3041550 Coll d’ Anrodat Coll d' Anrodat Coll d' Anrodat,Coll d’ Anrodat 42.61667 1.7 T PASS AD 00 0 2285 Europe/Andorra 2011-11-05 +3041551 Anrodat Anrodat 42.61667 1.68333 A ADMD AD 00 0 2406 Europe/Andorra 1993-12-23 +3041552 Riu de l’ Angonella Riu de l' Angonella 42.6 1.53333 H STM AD 00 0 1695 Europe/Andorra 1993-12-23 +3041553 Port de l’ Angonella Port de l' Angonella Port de l' Angonella,Port de l’ Angonella 42.61667 1.46667 T PASS AD 00 0 2442 Europe/Andorra 2011-11-05 +3041554 Pleta de l’ Angonella Pleta de l' Angonella 42.6 1.5 L GRAZ AD 00 0 1923 Europe/Andorra 1993-12-23 +3041555 Pas de l’ Angonella Pas de l' Angonella 42.6 1.5 T PASS AD 00 0 1923 Europe/Andorra 1993-12-23 +3041556 Estret del l’ Angonella Estret del l' Angonella 42.6 1.5 T GRGE AD 00 0 1923 Europe/Andorra 1993-12-23 +3041557 Estanys de l’ Angonella Estanys de l' Angonella 42.6 1.48333 H LKS AD 00 0 2441 Europe/Andorra 1993-12-23 +3041558 Basers de l’ Angonella Basers de l' Angonella 42.61667 1.5 T CLF AD 00 0 2390 Europe/Andorra 1993-12-23 +3041559 Pic de les Angleves Pic de les Angleves 42.55 1.53333 T PK AD 00 0 1593 Europe/Andorra 1993-12-23 +3041560 Solà de Angleva Sola de Angleva 42.56667 1.48333 T SLP AD 00 0 1508 Europe/Andorra 1993-12-23 +3041561 Planell de Andreuet Planell de Andreuet 42.51667 1.6 T UPLD AD 00 0 2085 Europe/Andorra 1993-12-23 +3041562 Barranc de l’ Andorrana Barranc de l' Andorrana 42.55 1.43333 H STM AD 00 0 1949 Europe/Andorra 1993-12-23 +3041563 Andorra la Vella Andorra la Vella Ando-la-Vyey,Andora,Andora la Vela,Andora la Velja,Andora lja Vehl'ja,Andoro Malnova,Andorra,Andorra Tuan,Andorra a Vella,Andorra la Biella,Andorra la Vella,Andorra la Vielha,Andorra-a-Velha,Andorra-la-Vel'ja,Andorra-la-Vielye,Andorre-la-Vieille,Andò-la-Vyèy,Andòrra la Vièlha,an dao er cheng,andolalabeya,andwra la fyla,Ανδόρρα,Андора ла Веля,Андора ла Веља,Андора ля Вэлья,Андорра-ла-Велья,אנדורה לה וולה,أندورا لا فيلا,አንዶራ ላ ቬላ,アンドラ・ラ・ヴェリャ,安道爾城,안도라라베야 42.50779 1.52109 P PPLC AD 07 20430 1073 Europe/Andorra 2010-05-30 +3041564 Rec d’ Andorra Rec d' Andorra 42.51667 1.51667 H CNL AD 00 0 1265 Europe/Andorra 1993-12-23 +3041565 Principality of Andorra Principality of Andorra Andora,Andoro,Andorra,Andorre,Andorrë,Andurra,Andòrra,Andóra,L'Andorre,Landoraen,Landorän,Les Vallees d' Andorre,Les Vallées d’ Andorre,L’Andorre,Principado de Andorra,Principality of Andorra,Principat d' Andorra,Principat d’ Andorra,Principaute d' Andorre,Principauté d’ Andorre,Vallees et Suzerainetes d' Andorre,Valls d' Andorra,Valls d’ Andorra,Vallées et Suzerainetés d’ Andorre,an dao er,andola,andora,andwra,antora,endora,prathes xandxrra,xandxrra,yandwrra,Ανδόρα,Ανδόρρα,Андора,Андорра,Անդորա,אנדורה,آندورا,أندورا,ئاندوررا,اندورا,انډورا,ܐܢܕܘܪܐ,अंडोरा,अन्डोरा,एण्डोरा,অ্যান্ডোরা,আন্ডোরা,এন্ডোরা,அன்டோரா,അന്‍ടോറ,ประเทศอันดอร์รา,อันดอร์รา,ອັນດໍລາ,ཨེན་ཌོ་ར།,ანდორა,አንዶራ,អង់ដូររា,អានដូរ៉ា,アンドラ,安道尔,安道爾,안도라 42.5 1.5 A PCLI AD 00 84000 1135 Europe/Andorra 2011-11-05 +3041566 Parròquia d'Andorra la Vella Parroquia d'Andorra la Vella Andorra la Vella,Andorre-la-Vieille,Parroquia d'Andorra la Vella,Parròquia d'Andorra la Vella 42.5045 1.49414 A ADM1 AD 07 24211 1236 Europe/Andorra 2008-03-17 +3041567 Canal Ampla Canal Ampla 42.48333 1.63333 H STM AD 00 0 2296 Europe/Andorra 1993-12-23 +3041568 Canal Ampla Canal Ampla 42.48333 1.6 H STM AD 00 0 2250 Europe/Andorra 1993-12-23 +3041569 Bosc dels Amorriadors Bosc dels Amorriadors 42.53333 1.48333 V FRST AD 00 0 1677 Europe/Andorra 1993-12-23 +3041570 Solana de l’ Alzinar Solana de l' Alzinar 42.45 1.48333 T SLP AD 00 0 1111 Europe/Andorra 1993-12-23 +3041571 Serrat de l’ Alzinar Serrat de l' Alzinar 42.48333 1.46667 T MT AD 00 0 1148 Europe/Andorra 1993-12-23 +3041572 Canal de l’ Alzina Canal de l' Alzina 42.5 1.5 H STM AD 00 0 1135 Europe/Andorra 1993-12-23 +3041573 Rocs Alts Rocs Alts 42.56667 1.43333 T RKS AD 00 0 2402 Europe/Andorra 1993-12-23 +3041574 Costa de l’ Alt de la Capa Costa de l' Alt de la Capa 42.56667 1.46667 T SLP AD 00 0 1673 Europe/Andorra 1993-12-23 +3041575 Pala Alta Pala Alta 42.6 1.63333 T CLF AD 00 0 1893 Europe/Andorra 1993-12-23 +3041576 Terregalls de l’ Alt Terregalls de l' Alt 42.56667 1.45 T TAL AD 00 0 2137 Europe/Andorra 1993-12-23 +3041577 Terregalls de l’ Alt Terregalls de l' Alt 42.58333 1.43333 T SPUR AD 00 0 2412 Europe/Andorra 1993-12-23 +3041578 Font de l’ Alt Font de l' Alt 42.56667 1.46667 H SPNG AD 00 0 1673 Europe/Andorra 1993-12-23 +3041579 Cresta de l’ Alt Cresta de l' Alt 42.58333 1.45 T SPUR AD 00 0 2156 Europe/Andorra 1993-12-23 +3041580 Costes de l’ Alt Costes de l' Alt 42.56667 1.45 T SLP AD 00 0 2137 Europe/Andorra 1993-12-23 +3041581 Canals de l’ Alt Canals de l' Alt 42.58333 1.43333 H RVN AD 00 0 2412 Europe/Andorra 1993-12-23 +3041582 Canal de l’ Alt Canal de l' Alt 42.58333 1.45 H STM AD 00 0 2156 Europe/Andorra 1993-12-23 +3041583 Planell dels Alls Planell dels Alls 42.5 1.6 T UPLD AD 00 0 2416 Europe/Andorra 1993-12-23 +3041584 Roca de les Allaus Roca de les Allaus 42.63333 1.53333 T RKS AD 00 0 2072 Europe/Andorra 1993-12-23 +3041585 Bosc de les Allaus Bosc de les Allaus 42.53333 1.6 V FRST AD 00 0 1888 Europe/Andorra 1993-12-23 +3041586 Solà de l’ Allau Sola de l' Allau 42.6 1.53333 T SLP AD 00 0 1695 Europe/Andorra 1993-12-23 +3041587 Planell de l’ Allau Planell de l' Allau 42.56667 1.68333 T UPLD AD 00 0 2340 Europe/Andorra 1993-12-23 +3041588 Planell de l’ Allau Planell de l' Allau 42.51667 1.58333 T UPLD AD 00 0 1994 Europe/Andorra 1993-12-23 +3041589 Camí de l’ Allau Cami de l' Allau 42.58333 1.61667 R TRL AD 00 0 1707 Europe/Andorra 1993-12-23 +3041590 Roc de l’ Àliga Roc de l' Aliga 42.55 1.5 T RK AD 00 0 1292 Europe/Andorra 1993-12-23 +3041591 Roc de l’ Àliga Roc de l' Aliga 42.55 1.46667 T RK AD 00 0 1585 Europe/Andorra 1993-12-23 +3041592 Roc de l’ Àliga Roc de l' Aliga 42.46667 1.5 T RK AD 00 0 1383 Europe/Andorra 1993-12-23 +3041593 Pic de l’ Àliga Pic de l' Aliga 42.5 1.66667 T PK AD 00 0 2441 Europe/Andorra 1993-12-23 +3041594 Canal dels Alegrets Canal dels Alegrets 42.5 1.48333 H STM AD 00 0 1316 Europe/Andorra 1993-12-23 +3041595 Pont de l’ Aldosa Pont de l' Aldosa 42.55 1.51667 S BDG AD 00 0 1397 Europe/Andorra 1993-12-23 +3041596 Carretera de l’ Aldosa Carretera de l' Aldosa 42.58333 1.63333 R RD AD 00 0 1722 Europe/Andorra 1993-12-23 +3041597 Pont d’ Aixovall Pont d' Aixovall 42.48333 1.48333 S BDG AD 00 0 981 Europe/Andorra 1993-12-23 +3041598 Aixovall Aixovall Aixovall 42.46667 1.48333 P PPL AD 06 0 1134 Europe/Andorra 2011-11-05 +3041599 Solà d’ Aixirivall Sola d' Aixirivall 42.46667 1.5 T SLP AD 00 0 1383 Europe/Andorra 1993-12-23 +3041600 Riu d’ Aixirivall Riu d' Aixirivall 42.46667 1.5 H STM AD 00 0 1383 Europe/Andorra 1993-12-23 +3041601 Conreu d’ Aixirivall Conreu d' Aixirivall 42.46667 1.5 V CULT AD 00 0 1383 Europe/Andorra 1993-12-23 +3041602 Carretera d’ Aixirivall Carretera d' Aixirivall 42.45 1.48333 R RD AD 00 0 1111 Europe/Andorra 1993-12-23 +3041603 Bordes d’ Aixirivall Bordes d' Aixirivall 42.45 1.51667 S FRMS AD 00 0 1790 Europe/Andorra 1993-12-23 +3041604 Aixirivall Aixirivall Aixirivali,Aixirivall,Aixirvall,Eixirivall 42.46321 1.5029 P PPL AD 06 0 1357 Europe/Andorra 2011-11-05 +3041605 Riu Aixec Riu Aixec 42.58333 1.66667 H STM AD 00 0 2159 Europe/Andorra 1993-12-23 +3041606 Riu Aixec Riu Aixec 42.55 1.58333 H STM AD 00 0 1499 Europe/Andorra 1993-12-23 +3041607 Riu d’ Aixàs Riu d' Aixas 42.48333 1.46667 H STM AD 00 0 1148 Europe/Andorra 1993-12-23 +3041608 Bosc d’ Aixàs Bosc d' Aixas 42.48333 1.46667 V FRST AD 00 0 1148 Europe/Andorra 1993-12-23 +3041609 Aixàs Aixas 42.48333 1.46667 P PPL AD 06 0 1148 Europe/Andorra 1993-12-23 +3041610 Aixàs Aixas 42.48333 1.46667 A ADMD AD 00 0 1148 Europe/Andorra 1993-12-23 +3041611 Clots d’ Aixades Clots d' Aixades 42.58333 1.58333 H RVN AD 00 0 1993 Europe/Andorra 1993-12-23 +3041612 Coll de l’ Airola Coll de l' Airola 42.48333 1.46667 T PK AD 00 0 1148 Europe/Andorra 1993-12-23 +3041613 Bosc de l’ Airola Bosc de l' Airola 42.56667 1.56667 V FRST AD 00 0 2089 Europe/Andorra 1993-12-23 +3041614 Solà d’ Airet Sola d' Airet 42.45 1.45 T SLP AD 00 0 1482 Europe/Andorra 1993-12-23 +3041615 Bosc d’ Aigües Juntes Bosc d' Aigues Juntes 42.58333 1.46667 V FRST AD 00 0 1643 Europe/Andorra 1993-12-23 +3041616 Aigües Juntes Aigues Juntes 42.58333 1.46667 H CNFL AD 00 0 1643 Europe/Andorra 1993-12-23 +3041617 Pont de l’ Aiguerola Pont de l' Aiguerola 42.53333 1.61667 S BDG AD 00 0 2237 Europe/Andorra 1993-12-23 +3041618 Clots d’ Aigua Vella Clots d' Aigua Vella 42.6 1.63333 H RVN AD 00 0 1893 Europe/Andorra 1993-12-23 +3041619 Canal d’ Aigua Vella Canal d' Aigua Vella 42.6 1.63333 H STM AD 00 0 1893 Europe/Andorra 1993-12-23 +3041620 Basers d’ Aigua Vella Basers d' Aigua Vella 42.6 1.63333 T CLF AD 00 0 1893 Europe/Andorra 1993-12-23 +3041621 Riu d’ Aiguarebre Riu d' Aiguarebre 42.6 1.51667 H STM AD 00 0 1445 Europe/Andorra 1993-12-23 +3041622 Planell d’ Aiguarebre Planell d' Aiguarebre 42.61667 1.51667 T UPLD AD 00 0 1716 Europe/Andorra 1993-12-23 +3041623 Costa d’ Aiguarebre Costa d' Aiguarebre 42.61667 1.51667 T SLP AD 00 0 1716 Europe/Andorra 1993-12-23 +3041624 Costa dels Aiguaders Costa dels Aiguaders 42.5 1.43333 T SLP AD 00 0 1654 Europe/Andorra 1993-12-23 +3041625 Presa d’ Aigua Presa d' Aigua 42.5 1.58333 S DAM AD 00 0 1888 Europe/Andorra 1993-12-23 +3041626 Font de Les Agunes Font de Les Agunes 42.58333 1.46667 H SPNG AD 00 0 1643 Europe/Andorra 1993-12-23 +3041627 Borda de les Agunes Borda de les Agunes 42.58333 1.46667 S FRM AD 00 0 1643 Europe/Andorra 1993-12-23 +3041628 Planell de les Agudelles Planell de les Agudelles 42.56667 1.55 T UPLD AD 00 0 1996 Europe/Andorra 1993-12-23 +3041629 Pont dels Agrels Pont dels Agrels 42.55 1.48333 S BDG AD 00 0 1548 Europe/Andorra 1993-12-23 +3041630 Canal dels Agrels Canal dels Agrels 42.55 1.48333 H STM AD 00 0 1548 Europe/Andorra 1993-12-23 +3041631 Serrat de l’ Agraullet Serrat de l' Agraullet 42.53333 1.55 T RDGE AD 00 0 1344 Europe/Andorra 1993-12-23 +3041632 Riu de les Agols Riu de les Agols 42.53125 1.59204 H STM AD 00 0 1756 Europe/Andorra 2011-04-19 +3041633 Coll dels Abòs Coll dels Abos 42.61667 1.53333 T PK AD 00 0 1609 Europe/Andorra 1993-12-23 +3041634 Riu de l’ Abeurador Riu de l' Abeurador 42.58333 1.65 H STM AD 00 0 1767 Europe/Andorra 1993-12-23 +3041635 Clot de les Abelletes Clot de les Abelletes 42.53333 1.73333 T CRQ AD 00 0 2300 Europe/Andorra 1993-12-23 +3041636 Serra del Cap de l’ Abarsetar de Rialb Serra del Cap de l' Abarsetar de Rialb 42.63333 1.55 T RDGE AD 00 0 2053 Europe/Andorra 1993-12-23 +3041637 Abarsetar de Rialb Abarsetar de Rialb 42.65 1.55 L LCTY AD 00 0 2181 Europe/Andorra 1993-12-23 +3041638 Abarsetar de la Coma Abarsetar de la Coma 42.62793 1.48624 L LCTY AD 07 0 2111 Europe/Andorra 2007-03-04 +3041639 Abarsetar de Ferreroles Abarsetar de Ferreroles 42.6 1.55 L LCTY AD 00 0 2298 Europe/Andorra 1993-12-23 +3041640 Abarsetar d'Arcalís Abarsetar d'Arcalis 42.62657 1.50148 L LCTY AD 07 0 1979 Europe/Andorra 2007-03-04 +3041641 Clots de l’ Abarsetar Clots de l' Abarsetar 42.63333 1.55 H RVN AD 00 0 2053 Europe/Andorra 1993-12-23 +3041642 Abarsetar Abarsetar 42.55 1.65 L LCTY AD 00 0 2432 Europe/Andorra 1993-12-23 +3041643 Pla de l’ Abarsa Pla de l' Abarsa 42.43333 1.51667 T UPLD AD 00 0 2031 Europe/Andorra 1993-12-23 +3041644 Costa de l’ Abalançc Costa de l' Abalancc 42.53333 1.53333 T SLP AD 00 0 1521 Europe/Andorra 1993-12-23 +3109332 Riu d’ Ós Riu d' Os Rio Saturia,Rio Seturia,Rio de Os,Riu d' Os,Riu d’ Ós,Río Saturia,Río Seturia,Río de Os 42.46667 1.5 H STM AD 00 0 1383 Europe/Andorra 2011-11-06 +3338529 Parròquia d'Escaldes-Engordany Parroquia d'Escaldes-Engordany Escaldes-Engordany,Parroquia d'Escaldes-Engordany,Parròquia d'Escaldes-Engordany 42.5 1.56667 A ADM1 AD 08 16391 1776 Europe/Andorra 2008-03-17 +6463133 Eurotel Eurotel 42.51286 1.53552 S HTL AD 07 0 1139 Europe/Andorra 2011-04-02 +6463689 Panorama Hotel Panorama Hotel 42.5069 1.5361 S HTL AD 07 0 1350 Europe/Andorra 2007-04-13 +6463694 Roc Blanc Hotel Roc Blanc Hotel 42.50927 1.53862 S HTL AD 07 0 1139 Europe/Andorra 2011-04-02 +6464858 Ahotels Prisma Ahotels Prisma 42.5087 1.5364 S HTL AD 07 0 1139 Europe/Andorra 2007-04-13 +6465286 Andorra Park Hotel Andorra Park Hotel 42.5092 1.5244 S HTL AD 07 0 1097 Europe/Andorra 2007-04-13 +6473225 Coma Coma 42.559 1.533 S HTL AD 07 0 1514 Europe/Andorra 2007-04-17 +6473433 Magic La Massana Magic La Massana 42.546 1.518 S HTL AD 07 0 1397 Europe/Andorra 2007-04-17 +6473450 Art Art 42.5062 1.5216 S HTL AD 07 0 1073 Europe/Andorra 2007-04-17 +6473528 Andorra Center Andorra Center 42.5074 1.52 S HTL AD 07 0 1073 Europe/Andorra 2007-04-17 +6473529 Hotel Cervol Hotel Cervol 42.50262 1.51288 S HTL AD 07 0 1011 Europe/Andorra 2011-04-02 +6473530 Novotel Andorra Novotel Andorra 42.50762 1.52734 S HTL AD 07 0 1205 Europe/Andorra 2011-04-03 +6473617 Roc del Sola Roc del Sola 42.505 1.514 S HTL AD 07 0 1011 Europe/Andorra 2007-04-17 +6473823 L'Angel Blanc L'Angel Blanc 42.577 1.667 S HTL AD 07 0 2159 Europe/Andorra 2007-04-17 +6473970 Refugi dels Isards Refugi dels Isards 42.50616 1.5289 S HTL AD 07 0 1205 Europe/Andorra 2007-04-17 +6474116 Panorama Panorama 42.507 1.535 S HTL AD 07 0 1350 Europe/Andorra 2007-04-17 +6474117 Font d'Argent Font d'Argent 42.542 1.732 S HTL AD 0 2100 Europe/Paris 2009-09-07 +6474170 Reial Pirineus Reial Pirineus 42.5405 1.7313 S HTL AD 0 2187 Europe/Paris 2009-06-28 +6474171 Hotansa Himalaya Hotansa Himalaya 42.5405 1.7313 S HTL AD 0 2187 Europe/Paris 2009-09-07 +6474212 F and G La Cabana F and G La Cabana 42.551 1.533 S HTL AD 07 0 1340 Europe/Andorra 2007-04-17 +6474230 Pic Maia Pic Maia 42.5075 1.5218 S HTL AD 07 0 1073 Europe/Andorra 2007-04-17 +6474307 Marco Polo Marco Polo 42.5411 1.5191 S HTL AD 07 0 1343 Europe/Andorra 2007-04-17 +6474384 Confort Pas de la Casa Confort Pas de la Casa 42.5413 1.7326 S HTL AD 0 2187 Europe/Paris 2009-09-07 +6474447 Magic Pas Magic Pas 42.54303 1.73188 S HTL AD 0 2100 Europe/Paris 2011-04-02 +6474512 Font del Marge Font del Marge 42.5043 1.5146 S HTL AD 07 0 1011 Europe/Andorra 2007-04-17 +6474514 Sant Jordi Sant Jordi 42.5043 1.5146 S HTL AD 07 0 1011 Europe/Andorra 2007-04-17 +6474580 AnyósPark AnyosPark 42.53417 1.52528 S HTL AD 04 0 1491 Europe/Andorra 2011-04-02 +6474582 Alaska Alaska 42.61877 1.53922 S HTL AD 07 0 1704 Europe/Andorra 2007-04-17 +6474659 President President 42.502 1.512 S HTL AD 07 0 1011 Europe/Andorra 2007-04-17 +6474661 Himalaia Soldeu Himalaia Soldeu 42.57647 1.66873 S HTL AD 07 0 2159 Europe/Andorra 2011-04-02 +6474662 Piolets Piolets 42.5769 1.66776 S HTL AD 07 0 2159 Europe/Andorra 2007-04-17 +6475094 Servissim Servissim 42.566 1.596 S HTL AD 07 0 1677 Europe/Andorra 2007-04-17 +6475095 Artic Artic 42.5054 1.5183 S HTL AD 07 0 1073 Europe/Andorra 2007-04-17 +6475301 Magic Ski Magic Ski 42.54557 1.51746 S HTL AD 07 0 1397 Europe/Andorra 2007-04-17 +6475379 Sporting Sporting 42.5075 1.5218 S HTL AD 07 0 1073 Europe/Andorra 2007-04-17 +6483664 Hotel Apsis Florida Hotel Apsis Florida 42.50811 1.52255 S HTL AD 07 0 1073 Europe/Andorra 2007-04-15 +6483820 Hotel Apsis Art Hotel Hotel Apsis Art Hotel 42.5 1.51667 S HTL AD 07 0 1410 Europe/Andorra 2007-04-15 +6491562 Hotel Delfos Hotel Delfos 42.50682 1.5344 S HTL AD 07 0 1350 Europe/Andorra 2011-04-02 +6491674 Hotel Fénix Hotel Fenix 42.5086 1.5394 S HTL AD 07 0 1139 Europe/Andorra 2007-04-15 +6491682 Hotel Comtes d'Urgell Hotel Comtes d'Urgell 42.51028 1.54099 S HTL AD 07 0 1139 Europe/Andorra 2011-04-02 +6492312 Ahotels Princep Ahotels Princep 42.5073 1.5316 S HTL AD 07 0 1205 Europe/Andorra 2007-04-15 +6493558 Club Dorada el Tarter Club Dorada el Tarter 42.5793 1.6414 S HTL AD 07 0 1727 Europe/Andorra 2007-04-14 +6493930 Residence Deusol Residence Deusol 42.6195 1.5389 S HTL AD 07 0 1704 Europe/Andorra 2007-04-14 +6493995 HUSA Centric HUSA Centric 42.5087 1.5283 S HTL AD 07 0 1041 Europe/Andorra 2007-04-14 +6494290 HUSA Xalet Besoli HUSA Xalet Besoli 42.5718 1.4843 S HTL AD 07 0 1655 Europe/Andorra 2007-04-14 +6494345 HUSA Imperial HUSA Imperial 42.472 1.4923 S HTL AD 06 0 1164 Europe/Andorra 2010-01-12 +6494491 Hotel Marco Polo Hotel Marco Polo 42.5423 1.5174 S HTL AD 07 0 1397 Europe/Andorra 2007-04-14 +6494790 Husa Xalet Verdu Husa Xalet Verdu 42.571 1.4715 S HTL AD 07 0 1673 Europe/Andorra 2007-04-14 +6494958 Apsis Arthotel Apsis Arthotel 42.5072 1.5261 S HTL AD 07 0 1205 Europe/Andorra 2007-04-14 +6495028 Hotel Himalaia Pas Hotel Himalaia Pas 42.5403 1.7311 S HTL AD 0 2187 Europe/Paris 2009-07-01 +6495053 Hotel Font Hotel Font 42.5436 1.5117 S HTL AD 07 0 1257 Europe/Andorra 2007-04-14 +6495582 Hotel Austria Hotel Austria 42.5788 1.6686 S HTL AD 07 0 2159 Europe/Andorra 2007-04-14 +6495704 Hotel Magic Canillo Hotel Magic Canillo 42.5638 1.5965 S HTL AD 07 0 1677 Europe/Andorra 2007-04-14 +6495769 Hotel F&G La Cabana Hotel F&G La Cabana 42.5538 1.5319 S HTL AD 07 0 1340 Europe/Andorra 2007-04-14 +6495790 Hotel Princesa Parc Hotel Princesa Parc 42.574 1.4824 S HTL AD 07 0 1508 Europe/Andorra 2007-04-14 +6495826 Hotel Magic La Massana Hotel Magic La Massana 42.5448 1.5163 S HTL AD 07 0 1257 Europe/Andorra 2007-04-14 +6497139 AHotels Confort Patagonia AHotels Confort Patagonia 42.5627 1.4952 S HTL AD 07 0 1430 Europe/Andorra 2007-04-14 +6497391 Hotel Magic Andorra Hotel Magic Andorra 42.5091 1.5297 S HTL AD 07 0 1041 Europe/Andorra 2007-04-14 +6497888 Ahotels Piolets Park & Spa Ahotels Piolets Park & Spa 42.5772 1.6652 S HTL AD 07 0 1925 Europe/Andorra 2007-04-14 +6498453 Hotel Carlton Plaza Hotel Carlton Plaza 42.508 1.5254 S HTL AD 07 0 1205 Europe/Andorra 2007-04-14 +6498890 Hotel Plaza Hotel Plaza 42.5062 1.5296 S HTL AD 07 0 1205 Europe/Andorra 2007-04-14 +6499190 Hotel Ski Plaza Hotel Ski Plaza 42.5657 1.5973 S HTL AD 07 0 1677 Europe/Andorra 2007-04-14 +6500087 Hesperia Andorra la Vella Hesperia Andorra la Vella 42.5089 1.5289 S HTL AD 07 0 1041 Europe/Andorra 2007-04-14 +6501396 Ahotels El Serrat Ahotels El Serrat 42.61652 1.53833 S HTL AD 07 0 1793 Europe/Andorra 2009-06-25 +6502212 Hotel Euro Esqui Hotel Euro Esqui 42.5794 1.6585 S HTL AD 07 0 1925 Europe/Andorra 2007-04-14 +6504216 Abba Xalet Suites Abba Xalet Suites 42.5331 1.516 S HTL AD 07 0 1211 Europe/Andorra 2007-04-14 +6505101 Hotel Valira HOTEL VALIRA 42.5 1.5333 S HTL AD 07 0 1574 Europe/Andorra 2007-04-13 +6508304 Mercure Andorra 4 MERCURE ANDORRA 4 42.5 1.5166 S HTL AD 07 0 1230 Europe/Andorra 2007-04-13 +6520395 Ahotels Confort Patagonia AHOTELS CONFORT PATAGONIA 42.5124 1.5389 S HTL AD 07 0 1139 Europe/Andorra 2007-04-15 +6521569 Ahotels El Serrat AHOTELS EL SERRAT 42.5575 1.5325 S HTL AD 07 0 1340 Europe/Andorra 2007-04-15 +6522685 Salvia D Or Hotel SALVIA D OR HOTEL 42.5 1.5166 S HTL AD 07 0 1230 Europe/Andorra 2007-04-14 +6525900 Roc De Caldes ROC DE CALDES 42.51065 1.54706 S HTL AD 07 0 1227 Europe/Andorra 2011-04-03 +6529214 Metropolis METROPOLIS 42.5166 1.55 S HTL AD 07 0 1498 Europe/Andorra 2007-04-14 +6529355 Diplomatic DIPLOMATIC 42.50521 1.52715 S HTL AD 07 0 1205 Europe/Andorra 2011-04-02 +6529413 Eureka EUREKA 42.50873 1.53989 S HTL AD 07 0 1139 Europe/Andorra 2011-04-02 +6529930 Cassany CASSANY 42.50798 1.5248 S HTL AD 07 0 1073 Europe/Andorra 2011-04-02 +6942550 Andorra Palace ANDORRA PALACE 42.50837 1.52706 S HTL AD 07 0 1041 Europe/Andorra 2009-06-24 +6942551 Annapurna ANNAPURNA 42.55768 1.53255 S HTL AD 07 0 1340 Europe/Andorra 2009-06-24 +6942562 Bringue BRINGUE 42.55768 1.53255 S HTL AD 07 0 1340 Europe/Andorra 2009-06-25 +6942564 Co Princeps CO PRINCEPS 42.46815 1.49329 S HTL AD 06 0 1164 Europe/Andorra 2010-01-12 +6942568 Crowne Plaza Andorra CROWNE PLAZA ANDORRA 42.50574 1.52002 S HTL AD 07 0 1073 Europe/Andorra 2009-06-25 +6942569 Diana Parc Diana Parc 42.5444 1.5115 S HTL AD 07 0 1257 Europe/Andorra 2009-06-25 +6942578 Encamp Encamp 42.53321 1.57914 S HTL AD 0 1571 Europe/Andorra 2009-06-25 +6942579 Diana parc Diana parc 42.61886 1.53939 S HTL AD 07 0 1704 Europe/Andorra 2009-06-25 +6942582 Font d'argent Canillo Font d'argent Canillo 42.57086 1.60782 S HTL AD 0 1655 Europe/Andorra 2011-04-03 +6942589 GRAU ROIG GRAU ROIG 42.5327 1.70116 S HTL AD 0 2357 Europe/Andorra 2009-06-25 +6942604 Husa Patagonia Husa Patagonia 42.57139 1.48566 S HTL AD 07 0 1655 Europe/Andorra 2009-06-26 +6942646 Ibis Andorra Ibis Andorra 42.51252 1.55059 S HTL AD 07 0 1498 Europe/Andorra 2011-04-03 +6942647 Lake placid Lake placid 42.54119 1.73333 S HTL AD 0 2187 Europe/Paris 2009-06-28 +6942648 Les closes Les closes 42.5087 1.53993 S HTL AD 07 0 1139 Europe/Andorra 2009-06-28 +6942649 L Isard L Isard 42.50775 1.52288 S HTL AD 07 0 1073 Europe/Andorra 2009-06-28 +6942650 Paris Paris 42.528 1.56927 S HTL AD 0 1418 Europe/Andorra 2009-06-28 +6942651 Pere D Urg Pere D Urg 42.5347 1.58012 S HTL AD 0 1309 Europe/Andorra 2009-06-28 +6942667 Prat de les mines Prat de les mines 42.59406 1.52684 S HTL AD 07 0 1695 Europe/Andorra 2009-06-28 +6942674 Rialb Rialb 42.61886 1.53939 S HTL AD 07 0 1704 Europe/Andorra 2009-06-28 +6942675 Rutllan Rutllan 42.54738 1.51345 S HTL AD 04 0 1257 Europe/Andorra 2009-06-28 +6942676 Sant Eloi Sant Eloi 42.45793 1.48717 S HTL AD 0 1159 Europe/Madrid 2011-04-02 +6942677 Shusski Shusski 42.5338 1.58577 S HTL AD 0 1490 Europe/Andorra 2009-06-28 +6942678 Solana Solana 42.58099 1.5193 S HTL AD 0 1722 Europe/Andorra 2009-06-28 +6942680 Somriu Comapedrosa Somriu Comapedrosa 42.58099 1.5193 S HTL AD 0 1722 Europe/Andorra 2009-06-28 +6942681 Somriu Galanthus Somriu Galanthus 42.5769 1.66776 S HTL AD 07 0 2159 Europe/Andorra 2009-06-28 +6942682 Les Terres Les Terres 42.57916 1.63023 S HTL AD 0 1722 Europe/Andorra 2011-04-02 +6942683 Somriu Segle Xx SOMRIU SEGLE XX 42.58118 1.63827 S HTL AD 0 1727 Europe/Andorra 2009-09-08 +6942684 Somriu Solana Del Ransol SOMRIU SOLANA DEL RANSOL 42.58002 1.64432 S HTL AD 07 0 1737 Europe/Andorra 2009-06-28 +6942685 Somriu Tivoli SOMRIU TIVOLI 42.5076 1.53223 S HTL AD 07 0 1205 Europe/Andorra 2009-06-28 +6942686 Somriu Vall Ski Somriu Vall Ski 42.57723 1.66752 S HTL AD 07 0 2159 Europe/Andorra 2009-06-28 +6942696 Sport Sport 42.57688 1.66688 S HTL AD 07 0 2159 Europe/Andorra 2009-06-29 +6942697 Sport Hermitage SPORT HERMITAGE 42.57727 1.6672 S HTL AD 07 0 2159 Europe/Andorra 2009-06-29 +6942698 Sport Village Sport Village 42.57688 1.66688 S HTL AD 07 0 2159 Europe/Andorra 2009-06-29 +6942740 APARTAMENTS TURISTICS GLAÇ APARTAMENTS TURISTICS GLAC 42.58 1.64623 S HTL AD 07 0 1737 Europe/Andorra 2009-06-30 +6942759 Aparthotel Cosmos Aparthotel Cosmos 42.51 1.541 S HTL AD 07 0 1139 Europe/Andorra 2009-06-30 +6942761 Carlemany Carlemany 42.509 1.538 S HTL AD 07 0 1139 Europe/Andorra 2009-06-30 +6942762 Cims Andorra Cims Andorra 42.5085 1.5307 S HTL AD 07 0 1041 Europe/Andorra 2009-06-30 +6942764 Folch Folch 42.471 1.493 S HTL AD 06 0 1164 Europe/Andorra 2010-01-12 +6942766 Hotel La Solana Hotel La Solana 42.533 1.593 S HTL AD 07 0 1756 Europe/Andorra 2009-09-07 +6942767 Phoebus Phoebus 42.54103 1.72985 S HTL AD 0 2187 Europe/Paris 2009-06-30 +6942768 Pol Pol 42.465 1.491 S HTL AD 06 0 1045 Europe/Andorra 2009-06-30 +6942770 Subira Subira 42.632 1.5 S HTL AD 0 1979 Europe/Andorra 2009-06-30 +6942771 Vip Plus Vip Plus 42.535 1.588 S HTL AD 0 1490 Europe/Andorra 2009-06-30 +6942793 Acta Arthotel Acta Arthotel 42.50728 1.52609 S HTL AD 07 0 1205 Europe/Andorra 2009-07-01 +6942794 Ahotels Patagonia Austral Ahotels Patagonia Austral 42.57246 1.48436 S HTL AD 07 0 1655 Europe/Andorra 2009-07-01 +6942796 Del Tarter Del Tarter 42.58035 1.64893 S HTL AD 07 0 1737 Europe/Andorra 2009-07-01 +6942797 Hotel Llop Gris Hotel Llop Gris 42.57804 1.64845 S HTL AD 07 0 1737 Europe/Andorra 2009-07-01 +6948955 Apartamentos Xixerella APARTAMENTOS XIXERELLA 42.55309 1.48746 S HTL AD 04 0 1520 Europe/Andorra 2009-09-07 +6948956 Apartaments Gla APARTAMENTS GLA 42.56 1.67396 S HTL AD 0 1963 Europe/Andorra 2009-09-07 +6948957 Boston Boston 42.6083 1.5394 S HTL AD 07 0 1821 Europe/Andorra 2009-09-07 +6948958 Coma Bella COMA BELLA 42.46487 1.49115 S HTL AD 06 0 1045 Europe/Andorra 2009-09-07 +6948959 Confort Soldeu CONFORT SOLDEU 42.5769 1.66776 S HTL AD 07 0 2159 Europe/Andorra 2009-09-07 +6948960 Coray CORAY 42.535 1.584 S HTL AD 0 1490 Europe/Andorra 2009-09-07 +6948963 Del Clos Del Clos 42.6187 1.5392 S HTL AD 07 0 1704 Europe/Andorra 2009-09-07 +6948965 El Xalet EL XALET 42.58035 1.64892 S HTL AD 07 0 1737 Europe/Andorra 2009-09-07 +6948966 Els Llacs ELS LLACS 42.56012 1.68173 S HTL AD 0 2094 Europe/Andorra 2009-09-07 +6948967 Els Meners ELS MENERS 42.566 1.596 S HTL AD 07 0 1677 Europe/Andorra 2009-09-07 +6948968 Espel Espel 42.509 1.542 S HTL AD 07 0 1227 Europe/Andorra 2009-09-07 +6948969 Euro Ski Euro Ski 42.6187 1.5392 S HTL AD 07 0 1704 Europe/Andorra 2009-09-07 +6948970 Guillen Guillen 42.536 1.583 S HTL AD 0 1309 Europe/Andorra 2009-09-07 +6948971 Hotansa Austria HOTANSA AUSTRIA 42.56012 1.68173 S HTL AD 0 2094 Europe/Andorra 2009-09-07 +6948972 Iglu IGLU 42.53263 1.70035 S HTL AD 0 2357 Europe/Andorra 2009-09-07 +6948973 Kandahar KANDAHAR 42.5413 1.7325 S HTL AD 0 2187 Europe/Paris 2009-09-07 +6948974 L Obaga Blanca L OBAGA BLANCA 42.5617 1.60352 S HTL AD 0 1969 Europe/Andorra 2009-09-07 +6948975 Montecarlo MONTECARLO 42.528 1.569 S HTL AD 0 1418 Europe/Andorra 2009-09-07 +6948976 Naudi Naudi 42.6187 1.5392 S HTL AD 07 0 1704 Europe/Andorra 2009-09-07 +6948977 Nordic NORDIC 42.58035 1.64892 S HTL AD 07 0 1737 Europe/Andorra 2009-09-07 +6948991 Hotel Oros Hotel Oros 42.54564 1.73176 S HTL AD 0 2100 Europe/Paris 2011-04-03 +6948993 Palome Palome 42.56148 1.49741 S HTL AD 07 0 1430 Europe/Andorra 2009-09-08 +6948995 Paradis Blanc PARADIS BLANC 42.54152 1.73378 S HTL AD 0 2385 Europe/Paris 2009-09-08 +6948996 Rutllan Xalet De Muntanya RUTLLAN XALET DE MUNTANYA 42.5479 1.51319 S HTL AD 04 0 1257 Europe/Andorra 2009-09-08 +6948997 Sant Bernat Apartments SANT BERNAT APARTMENTS 42.56609 1.5967 S HTL AD 07 0 1677 Europe/Andorra 2009-09-08 +6948998 Solana de ransol Solana de ransol 42.57831 1.6352 S HTL AD 0 1727 Europe/Andorra 2009-09-08 +6948999 Soldeu Maistre Soldeu Maistre 42.5769 1.66776 S HTL AD 07 0 2159 Europe/Andorra 2009-09-08 +6949002 St Gothard ST GOTHARD 42.5723 1.484 S HTL AD 07 0 1655 Europe/Andorra 2009-09-08 +6949004 Univers Univers 42.53647 1.58195 S HTL AD 0 1309 Europe/Andorra 2009-09-08 +6949005 Velvet Velvet 42.7467 1.7081 S HTL AD 0 1563 Europe/Paris 2009-09-08 +6949010 Xalet Montana Xalet Montana 42.57701 1.66627 S HTL AD 07 0 1925 Europe/Andorra 2009-09-08 +7114070 andorra magica andorra magica 42.50727 1.52202 S HTL AD 07 0 1073 Europe/Andorra 2009-12-02 +7284857 Apartamentos L Angel Blanc Apartamentos L Angel Blanc 42.577 1.667 S HTL AD 07 0 2159 Europe/Andorra 2010-04-01 +7284858 Apartamentos Giberga Apartamentos Giberga 42.552 1.51081 S HTL AD 0 1400 Europe/Andorra 2010-04-01 +7284859 Aparthotel l'Alba Aparthotel l'Alba 42.5787 1.6532 S HTL AD 02 0 1767 Europe/Andorra 2010-04-01 +7284866 Magic Canillo Apartments Magic Canillo Apartments 42.5669 1.60041 S HTL AD 02 0 1655 Europe/Andorra 2010-04-01 +7284867 Apartaments Sant Romà Apartaments Sant Roma 42.5736 1.48311 S HTL AD 0 1508 Europe/Andorra 2010-04-01 +7284869 Saporo Saporo 42.5432 1.73327 S HTL AD 03 0 2100 Europe/Paris 2010-04-01 +7284872 Aparthotel Casa Vella Aparthotel Casa Vella 42.5537 1.53215 S HTL AD 0 1340 Europe/Andorra 2010-04-01 +7284874 Caldea Centre Termolùdic d' Andorra Caldea Centre Termoludic d' Andorra 42.5117 1.5367 S HTL AD 07 0 1139 Europe/Andorra 2010-04-01 +7284875 Comabella Hotel Comabella Hotel 42.5 1.5166 S HTL AD 07 0 1230 Europe/Andorra 2010-04-01 +7284915 Hotel Galanthus Hotel Galanthus 42.5829 1.66268 S HTL AD 02 0 1925 Europe/Andorra 2010-04-02 +7284920 Hotel Cims Pas Hotel Cims Pas 42.5428 1.73479 S HTL AD 03 0 2230 Europe/Paris 2010-04-02 +7284921 Hotel Cims Pas de La Casa Hotel Cims Pas de La Casa 42.5428 1.73479 S HTL AD 03 0 2230 Europe/Paris 2010-04-02 +7284925 Hotel del Clos Hotel del Clos 42.5786 1.65121 S HTL AD 02 0 1767 Europe/Andorra 2010-04-02 +7284926 Hotel Erts Hotel Erts 42.5454 1.51909 S HTL AD 07 0 1397 Europe/Andorra 2010-04-02 +7284927 Hotel Font De Ferro Hotel Font De Ferro 42.5902 1.52436 S HTL AD 0 1525 Europe/Andorra 2010-04-02 +7284952 Magic Ski La Massana Hotel Magic Ski La Massana Hotel 42.5457 1.51838 S HTL AD 07 0 1397 Europe/Andorra 2010-04-04 +7284953 Hotel Metropolis Hotel Metropolis 42.5102 1.54086 S HTL AD 07 0 1139 Europe/Andorra 2010-04-04 +7284954 Hotel Palarine Hotel Palarine 42.5763 1.5187 S HTL AD 0 1722 Europe/Andorra 2010-04-04 +7284955 Hotel Paris Londres Hotel Paris Londres 42.5087 1.54083 S HTL AD 07 0 1139 Europe/Andorra 2010-04-04 +7284956 Hotel Parma Hotel Parma 42.5432 1.73297 S HTL AD 03 0 2100 Europe/Paris 2010-04-04 +7284957 Residència Daina Residencia Daina 42.5615 1.49775 S HTL AD 0 1430 Europe/Andorra 2010-04-04 +7284958 Hotel Roc del Castell Hotel Roc del Castell 42.566 1.596 S HTL AD 07 0 1677 Europe/Andorra 2010-04-04 +7284959 Hotel Siracusa Hotel Siracusa 42.509 1.54305 S HTL AD 07 0 1227 Europe/Andorra 2010-04-04 +7284960 Somriu Hotel Refugi dels Isards Somriu Hotel Refugi dels Isards 42.5433 1.73494 S HTL AD 03 0 2230 Europe/Paris 2010-04-04 +7284961 Sport Hotel Hermitage & Spa Sport Hotel Hermitage & Spa 42.5763 1.66991 S HTL AD 07 0 2159 Europe/Andorra 2010-04-04 +7284962 Hotel Tristaina Hotel Tristaina 42.6189 1.53714 S HTL AD 0 1704 Europe/Andorra 2010-04-04 +7287697 Hotel Montane Hotel Montane 42.5454 1.51909 S HTL AD 07 0 1397 Europe/Andorra 2010-04-06 +7287698 Hotel Pitiusa Hotel Pitiusa 42.5089 1.53258 S HTL AD 07 0 1041 Europe/Andorra 2010-04-06 +7287699 Hotel Príncep Hotel Princep 42.5087 1.54083 S HTL AD 07 0 1139 Europe/Andorra 2010-04-06 +7287700 Hotel I Termes Carlemany Hotel I Termes Carlemany 42.5092 1.54409 S HTL AD 07 0 1227 Europe/Andorra 2010-04-06 +7287701 Hotel Viena Hotel Viena 42.5069 1.52004 S HTL AD 07 0 1073 Europe/Andorra 2010-04-06 +7302102 La Margineda La Margineda 42.484 1.49242 P PPL AD 07 0 1353 Europe/Andorra 2010-05-26 +7730819 Andorra la Vella Heliport Andorra la Vella Heliport ALV 42.5005 1.51712 S AIRH AD 0 1073 Europe/Andorra 2011-03-17 +7733010 Grau Roig Grau Roig 42.53251 1.69923 P PPL AD 0 2204 Europe/Andorra 2011-04-07 +251130 Wādī Siqattah Wadi Siqattah Wadi Siqatta,Wadi Siqattah,Wādī Siqatta,Wādī Siqattah 25.6225 56.2225 H WAD AE 00 0 99 Asia/Dubai 2011-11-06 +286280 Suhaylah Suhaylah Suhaylah,Suheila 24.80388 56.19449 P PPL AE 02 0 238 Asia/Dubai 2011-11-06 +288716 Wādī al Bīḩ Wadi al Bih Wadi al Bih,Wādī al Bīḩ 25.77361 56.04389 H WAD AE 05 0 49 Asia/Dubai 2011-11-06 +290399 Zuyūd Zuyud Zuyud,Zuyūd 25.2 56.21667 L TRB AE 04 0 223 Asia/Dubai 2011-11-06 +290400 Z̧uwayhir Zuwayhir Dhawaihir,Duwaihir,Zuwayhir,Z̧uwayhir 23.28333 53.2 P PPL AE AE 01 0 170 Asia/Dubai 2011-11-06 +290401 Z̧uwayhir Zuwayhir Dhuwaiher,Zuwayhir,Zuweihir,Z̧uwayhir 23.13916 53.6934 P PPL AE 01 0 104 Asia/Dubai 2011-11-06 +290402 Zuwayghir Zuwayghir Zuwaighar,Zuwayghir 24.08333 55.26667 H WLL AE AE 01 0 167 Asia/Dubai 2011-11-06 +290403 Wādī Zuqaybah Wadi Zuqaybah Wadi Zuqaybah,Wādī Zuqaybah 25.40753 56.12592 H WAD AE 04 0 383 Asia/Dubai 2011-11-06 +290404 Ţawī Z̧ulaymah Tawi Zulaymah Dhalaima,Dulaima,Tawi Dhalaima,Tawi Dhelaimah,Tawi Dulaymah,Tawi Zeleimah,Tawi Zulaymah,Ţawī Dhalaima,Ţawī Dulaymah,Ţawī Z̧ulaymah 24.67083 55.53083 H WLLQ AE AE 01 0 208 Asia/Dubai 2011-11-06 +290405 Z̧ulaymah Zulaymah Dulaymah,Zulaymah,Z̧ulaymah 24.65 55.53333 T TRGD AE AE 03 0 230 Asia/Dubai 2011-11-06 +290406 Ruqq az Zukum Ruqq az Zukum Rak al Lakum,Rak az Zakum,Rig az Zakum,Ruqq az Zaqqum,Ruqq az Zaqqūm,Ruqq az Zukum 24.8 53.7 H SHOL AE AE 01 0 -9999 Asia/Dubai 2011-11-06 +290407 Zubyah Zubyah Zabia,Zubyah 24.96667 55.06667 T SAND AE AE 03 0 20 Asia/Dubai 2011-11-06 +290408 Jabal al ‘Azab Jabal al `Azab Jabal Azab,Jabal Zubb al `Azab,Jabal Zubb al ‘Azab,Jabal al `Azab,Jabal al ‘Azab 25.16139 55.83861 T DUNE AE 06 0 275 Asia/Dubai 2011-11-06 +290409 Zubārah Zubarah Zubara,Zubarah,Zubāra,Zubārah 25.40487 56.35971 P PPL AE 04 0 -9999 Asia/Dubai 2011-11-06 +290410 Zirkūh Zirkuh Az Zarqa',Az Zarqā’,Jazirat Zarka,Jazirat Zirku,Jaztal Zarakkuh,Jaztal Zarakkūh,Jazīrat Zarkā,Jazīrat Zīrkū,Jezirat Zirko,Jezīrat Zirko,Zarakkawh,Zarakkuh,Zarqa,Zirko Island,Zirkuh,Zirkūh 24.88417 53.07222 T ISL AE AE 01 0 161 Asia/Dubai 2011-11-06 +290411 Zirā‘ah Zira`ah Zira`ah,Zirā‘ah 24.06667 55.53333 T SAND AE 01 0 182 Asia/Dubai 2011-11-06 +290412 Zirā‘ Zira` Zira`,Zirā‘ 23.76822 54.20993 H WLL AE 01 0 116 Asia/Dubai 2011-11-06 +290413 Sabkhat Zinād Sabkhat Zinad Sabkhat Zinad,Sabkhat Zinād 24.48293 55.22135 H SBKH AE 01 0 145 Asia/Dubai 2011-11-06 +290414 Zinād Zinad Zinad,Zinād 24.5 55.23333 T SAND AE 01 0 151 Asia/Dubai 2011-11-06 +290415 Zimmat Ḩalamah Zimmat Halamah Zimmat Halamah,Zimmat Ḩalamah 24.13333 55.48333 T DUNE AE 01 0 187 Asia/Dubai 2011-11-06 +290416 Zimmat ‘Ankah Zimmat `Ankah Zimmat `Ankah,Zimmat ‘Ankah 24.16667 55.33333 T DUNE AE 01 0 173 Asia/Dubai 2011-11-06 +290417 Wādī Zikt Wadi Zikt Wadi Zikt,Wādī Zikt 25.52536 56.31864 H WAD AE 04 0 140 Asia/Dubai 2011-11-06 +290418 Jabal Zikt Jabal Zikt Jabal Zikt 25.51435 56.31373 T HLL AE 04 0 285 Asia/Dubai 2011-11-06 +290419 Zikt Zikt Zikt 25.5118 56.32328 P PPL AE 04 0 41 Asia/Dubai 2011-11-06 +290420 Ziffah Ziffah Ziffah 25.02385 56.28954 V CULT AE 04 0 99 Asia/Dubai 2011-11-06 +290421 Zidm Zidm Zidm 25.48333 56.15 S RUIN AE 04 0 507 Asia/Dubai 2011-11-06 +290422 Zibara Zibara Zibara,Zibarah,Zibārah 24.61889 54.63417 T DUNE AE 01 0 11 Asia/Dubai 2011-11-06 +290423 Zi‘āb Zi`ab Za`ab,Za‘āb,Zi`ab,Zi‘āb 25.03333 56.36667 L TRB AE 06 0 -9999 Asia/Dubai 2011-11-06 +290424 Zayqāt Zayqat Zaiqat,Zayqat,Zayqāt 23.36667 52.15 S OILW AE AE 01 0 52 Asia/Dubai 2011-11-06 +290425 Zayqāt Zayqat Zayqat,Zayqāt 23.35 52.15 S CMPQ AE 01 0 53 Asia/Dubai 2011-11-06 +290426 Mīnā’ Zāyid Mina' Zayid Mina Zayed,Mina' Zayid,Mīnā’ Zāyid,Port Zayed,mynaʾ zayd,ميناء زايد 24.52518 54.38651 L PRT AE 01 0 -9999 Asia/Dubai 2011-11-06 +290427 Ramlat Zayd Ramlat Zayd Ramlat Zaid,Ramlat Zayd 24.21667 55.2 T DUNE AE AE 01 0 150 Asia/Dubai 2011-11-06 +290428 Bi’r Zayd Bi'r Zayd Bada` Zaid,Bada‘ Zaid,Bi'r Zayd,Bir Zaid,Bi’r Zayd 24.2 55.35 H WLL AE 01 0 168 Asia/Dubai 2011-11-06 +290429 Bid‘ Zayd Bid` Zayd Bada' Zaid,Bada’ Zaid,Bid` Zayd,Bid‘ Zayd 24.21667 55.11667 H WLL AE 01 0 118 Asia/Dubai 2011-11-06 +290430 Khawr Zawrah Khawr Zawrah Khawr Zawrah,Khawr Zora,Khawr az Zawra,Khawr az Zawrā 25.44417 55.47944 H INLT AE AE 02 0 -9999 Asia/Dubai 2011-11-06 +290431 Jazīrat Zawrah Jazirat Zawrah Al-Zura,Al-Zūrā,Jazirat Zawrah,Jazīrat Zawrah,Zora Island 25.43778 55.46472 T ISL AE AE 00 0 8 Asia/Dubai 2011-11-06 +290432 Zawr Zawr Zawr 25.5275 55.59667 L LCTY AE 07 0 19 Asia/Dubai 2011-11-06 +290433 Z̧awāhir Zawahir Dhawahir,Dhawāhir,Dhuwahir,Zawahir,Z̧awāhir 24.33333 55.58333 L TRB AE AE 01 0 208 Asia/Dubai 2011-11-06 +290434 Zārūb Zarub Zarub,Zarūb,Zārūb 25.01806 56.21 V CULT AE AE 06 0 406 Asia/Dubai 2011-11-06 +290435 Zarqā’ Zarqa' Zarqa',Zarqā’ 25.34622 55.87143 L LCTY AE 07 0 136 Asia/Dubai 2011-11-06 +290436 Zarārah Zararah Zararah,Zarrara,Zarrarah,Zarta,Zarārah 22.66667 54.13333 L OILF AE AE 01 0 145 Asia/Dubai 2011-11-06 +290437 Zarārah Zararah Zararah,Zarārah 22.87043 53.83424 T DPR AE 01 0 51 Asia/Dubai 2011-11-06 +290438 Zarāf Zaraf Zaraf,Zarāf 23.79064 54.21261 H WLL AE 01 0 84 Asia/Dubai 2011-11-06 +290439 Qarn Zaqīq Qarn Zaqiq Qarn Bu Naidar,Qarn Zaqiq,Qarn Zaqīq,Qarn al Khabta 24.31463 52.59967 T HLL AE 01 0 129 Asia/Dubai 2011-11-06 +290440 Jabal az̧ Z̧annah Jabal az Zannah Az Zannah,Az̧ Z̧annah,Djebel Dhanna,Jabal Danna,Jabal Dhannah,Jabal Dhanni,Jabal az Zannah,Jabal az̧ Z̧annah 24.1709 52.59488 T HLL AE 01 0 111 Asia/Dubai 2011-11-06 +290441 Dawḩat az̧ Z̧annah Dawhat az Zannah Dawhat az Zannah,Dawḩat az̧ Z̧annah 24.15252 52.71794 H BGHT AE 01 0 -9999 Asia/Dubai 2011-11-06 +290442 Z̧anḩah Zanhah Ghob,Zanhah,Z̧anḩah 25.5659 56.20217 P PPL AE 04 0 93 Asia/Dubai 2011-11-06 +290443 Ţawī Za‘lah Tawi Za`lah Tawi Za`lah,Ţawī Za‘lah 24.34848 55.43925 H WLLQ AE 01 0 178 Asia/Dubai 2011-11-06 +290444 Sayḩ Za‘lah Sayh Za`lah Sayh Za`lah,Sayḩ Za‘lah 24.33804 55.4268 T TRGD AE 01 0 179 Asia/Dubai 2011-11-06 +290445 Sayḩ Za‘lah Sayh Za`lah Sayh Za`lah,Sayḩ Za‘lah 24.2894 55.41804 T TRGD AE 01 0 175 Asia/Dubai 2011-11-06 +290446 Sayḩ Za‘lah Sayh Za`lah Sayh Za`lah,Sayḩ Za‘lah 24.28333 55.41667 T TRGD AE 01 0 163 Asia/Dubai 2011-11-06 +290447 Zākhir Zakhir Zakhir,Zākhir 24.11667 55.68333 S HSE AE 01 0 246 Asia/Dubai 2011-11-06 +290448 Ţawī Zā’id Tawi Za'id Tawi Za'id,Ţawī Zā’id 25.59556 55.88444 H WLL AE 07 0 35 Asia/Dubai 2011-11-06 +290449 Z̧ahūriyīn Zahuriyin Zahuriyin,Z̧ahūriyīn 26.05 56.13333 L TRB AE 05 0 680 Asia/Dubai 2011-11-06 +290450 Zaḩūm Zahum Zahum,Zaḩūm,Zihum 25.25 56.06667 L TRB AE AE 00 0 285 Asia/Dubai 2011-11-06 +290451 Zahrānī Zahrani Zahrani,Zahrānī 23.21667 54.18333 H WLL AE 01 0 116 Asia/Dubai 2011-11-06 +290452 Bū Ţabr Bu Tabr Bu Tabr,Bū Ţabr,Dahar,Dhahar,Zahr,Z̧ahr 24.35944 52.60583 S FRM AE AE 01 0 -9999 Asia/Dubai 2011-11-06 +290453 Wādī Z̧aḩah Wadi Zahah Wadi Zahah,Wādī Z̧aḩah 25.57036 56.20654 H WAD AE 04 0 76 Asia/Dubai 2011-11-06 +290454 Z̧afīr Zafir Dafir,Dhafir,Dhafīr,Zafir,Z̧afīr,Ḑāfir 23.12732 53.75439 P PPL AE 01 0 198 Asia/Dubai 2011-11-06 +290455 Z̧afīr Zafir Zafir,Z̧afīr 23.12027 53.75554 T DPR AE 01 0 82 Asia/Dubai 2011-11-06 +290456 Qarn Zabut Qarn Zabut Qarn Zabut 23.99048 54.07328 T HLL AE 01 0 20 Asia/Dubai 2011-11-06 +290457 Za‘bīl Za`bil Za`bil,Za‘bīl 25.22402 55.30452 S PAL AE 03 0 33 Asia/Dubai 2011-11-06 +290458 Ţawī Za‘ābīyah Tawi Za`abiyah Tawi Za`abiyah,Ţawī Za‘ābīyah 25.24917 55.88472 H WLL AE 06 0 128 Asia/Dubai 2011-11-06 +290459 Za‘āb Za`ab Za`ab,Za‘āb 25.68751 55.84732 L TRB AE 07 0 16 Asia/Dubai 2011-11-06 +290460 Ţawī Yudayyah Tawi Yudayyah Bir Yidayah,Tawi Yudayyah,Yidaiya,Ţawī Yudayyah 24.88904 55.78333 H WLL AE 06 0 203 Asia/Dubai 2011-11-06 +290461 Jabal Yīs Jabal Yis Jabal Yis,Jabal Yīs 25.35781 56.1109 T MT AE 04 0 683 Asia/Dubai 2011-11-06 +290462 Yinas Yinas Yinas 25.73158 56.13405 P PPL AE 05 0 1079 Asia/Dubai 2011-11-06 +290463 Yilak Yilak Yilak 23.06607 53.67436 T DPR AE 01 0 75 Asia/Dubai 2011-11-06 +290464 Yilaiyis Yilaiyis Yilaiyis 23.86184 55.43317 T DUNE AE 01 0 152 Asia/Dubai 2011-11-06 +290465 Wādī Yifan Wadi Yifan Wadi Yifan,Wādī Yifan 25.06066 56.30444 H WAD AE 04 0 38 Asia/Dubai 2011-11-06 +290466 Jabal Yibir Jabal Yibir Jabal Yibir 25.66752 56.13572 T MT AE 05 0 1527 1485 Asia/Dubai 2011-02-09 +290467 Yāsāt Şaghīrah Yasat Saghirah Yasat Saghirah,Yāsāt Şaghīrah 24.15912 52.0007 T ISL AE 01 0 6 Asia/Dubai 2011-11-06 +290468 Al Yāsāt as Suflá Al Yasat as Sufla Al Yasat as Sufla,Al Yāsāt as Suflá,Yasat Safli,Yāsāt Saflī 24.18675 51.9948 T ISL AE 01 0 -9999 Asia/Dubai 2011-11-06 +290469 Al Yāsāt al ‘Ulyā Al Yasat al `Ulya Al Yasat al `Ulya,Al Yāsāt al ‘Ulyā,Yasat `Ali,Yāsāt ‘Alī 24.23662 52.01234 T ISL AE 01 0 10 Asia/Dubai 2011-11-06 +290470 Yarīrah Yarirah Yarirah,Yarīrah 22.8707 54.22656 T DPR AE 01 0 94 Asia/Dubai 2011-11-06 +290471 Wādī Yamān Wadi Yaman Wadi Yaman,Wādī Yamān 25.38499 56.32647 H WAD AE 06 0 53 Asia/Dubai 2011-11-06 +290472 Ţawī Yāl Tawi Yal Tawi Yal,Ţawī Yāl 25.42336 56.10511 H WLL AE 04 0 302 Asia/Dubai 2011-11-06 +290473 Yākhūn Yakhun Yakhun,Yākhūn 24.88795 55.72161 T DUNE AE 06 0 210 Asia/Dubai 2011-11-06 +290474 Ya‘rid Ya`rid Ya`rid,Yairad,Ya‘rid,Yerad 24.80324 55.03569 T SAND AE 01 0 28 Asia/Dubai 2011-11-06 +290475 Wādī Yaif Wadi Yaif Wadi Yaif,Wādī Yaif 24.93722 56.1025 H WAD AE 05 0 295 Asia/Dubai 2011-11-06 +290476 Yaif Yaif Yaif 24.94 56.09722 V CULT AE 05 0 530 Asia/Dubai 2011-11-06 +290477 Yahli Yahli Yahli 23.9879 54.70761 H WLL AE 01 0 106 Asia/Dubai 2011-11-06 +290478 Ţawī Yaḩfar Tawi Yahfar Tawi Yahfar,Ţawī Yaḩfar 25.02556 55.83361 H WLL AE 06 0 172 Asia/Dubai 2011-11-06 +290479 Sayḩ Yāfūkh Sayh Yafukh Sayh Yafukh,Sayḩ Yāfūkh 23.6458 55.49207 T TRGD AE 01 0 167 Asia/Dubai 2011-11-06 +290480 Yafnah Yafnah Yafnah,Yifnah 25.73424 56.09919 V CULT AE 05 0 766 Asia/Dubai 2011-11-06 +290481 Jazīrat Yabr Jazirat Yabr Jazirat Yabr,Jazīrat Yabr 24.31856 52.71939 T ISL AE 01 0 -9999 Asia/Dubai 2011-11-06 +290482 Ţawī Yabbah Tawi Yabbah Tawi Yabbah,Ţawī Yabbah 25.35306 56.05111 H WLL AE 04 0 266 Asia/Dubai 2011-11-06 +290483 Ya‘alla Ya`alla Ya`alla,Ya‘alla 23.90646 54.99539 T DUNE AE 01 0 135 Asia/Dubai 2011-11-06 +290484 Wādī Ya’a Wadi Ya'a Wadi Ya'a,Wādī Ya’a 25.09611 56.26028 H WAD AE 04 0 224 Asia/Dubai 2011-11-06 +290485 Jabal Wutayd Jabal Wutayd Jabal Witeid,Jabal Wutaid,Jabal Wutayd 23.93615 52.29663 T HLL AE 01 0 40 Asia/Dubai 2011-11-06 +290486 Ţawī Wushāḩ Tawi Wushah Tawi Wishah,Tawi Wushah,Tāwī Wishah,Wusha,Ţawī Wushāḩ 25.22834 55.91456 H WLL AE 06 0 143 Asia/Dubai 2011-11-06 +290487 Wādī Wurayyah Wadi Wurayyah Wadi Waraiya,Wadi Wurayyah,Wādī Waraiya,Wādī Wurayyah 25.38343 56.26224 H WAD AE 04 0 415 Asia/Dubai 2011-11-06 +290488 Wuqnah Wuqnah Wuqnah 23.0326 53.67397 T DPR AE 01 0 86 Asia/Dubai 2011-11-06 +290489 Wuḩaydah Wuhaydah Wuhaydah,Wuḩaydah 23.13333 53.93333 L OAS AE 01 0 98 Asia/Dubai 2011-11-06 +290490 Wuḩaydah Wuhaydah Wuhaida,Wuhaydah,Wuḩaydah 23.11764 53.77261 L OAS AE 01 0 194 Asia/Dubai 2011-11-06 +290491 Wudibsā Wudibsa Wudibsa,Wudibsā 23.73726 52.25189 T SAND AE 01 0 32 Asia/Dubai 2011-11-06 +290492 Wādī Wiqā’ Wadi Wiqa' Wadi Wiqa',Wadi al Amlah,Wādī Wiqā’,Wādī al Amlaḩ 25.19143 56.04543 H WAD AE 05 0 210 Asia/Dubai 2011-11-06 +290493 Ţawī Widd Tawi Widd Tawi Wid,Tawi Widd,Ţawī Wid,Ţawī Widd 25.63296 56.01934 H WLL AE 05 0 108 Asia/Dubai 2011-11-06 +290494 Webb Rock Webb Rock Webb Rock 24.08437 52.2437 T RK AE 01 0 -9999 Asia/Dubai 2011-11-06 +290495 Wādī Wayqah Wadi Wayqah Wadi Wayqah,Wādī Wayqah 25.32211 56.12861 H WAD AE 04 0 403 Asia/Dubai 2011-11-06 +290496 Watigh Watigh Watigh 23.68728 55.07948 T DUNE AE 01 0 139 Asia/Dubai 2011-11-06 +290497 Watauq Watauq Watauq 24.30306 54.91357 H WLL AE 01 0 70 Asia/Dubai 2011-11-06 +290498 Raml Wāsiţ Raml Wasit Raml Wasit,Raml Wāsiţ,Wasit,Wāsit 25.3425 55.47167 T SAND AE AE 06 0 21 Asia/Dubai 2011-11-06 +290499 Wāsiţ Wasit Wasit,Wāsiţ 25.72194 55.87806 H WLL AE 05 0 32 Asia/Dubai 2011-11-06 +290500 Wāsiţ Wasit Wasit,Wāsiţ 25.60698 56.2548 P PPL AE 04 0 9 Asia/Dubai 2011-11-06 +290501 Wāsiţ Wasit Wasit,Wāsiţ 23.0036 53.44942 T DPR AE 01 0 176 Asia/Dubai 2011-11-06 +290502 Wasaţ Wasat Wasat,Wasaţ 22.80611 53.31093 H WLL AE 01 0 70 Asia/Dubai 2011-11-06 +290503 Warīsān Warisan Warisan,Warīsān 25.16744 55.40708 P PPL AE 03 0 20 Asia/Dubai 2011-11-06 +290504 Ţawī Waraqah Tawi Waraqah Tawi Waraqah,Ţawī Waraqah 24.77782 56.14991 H WLL AE 03 0 341 Asia/Dubai 2011-11-06 +290505 Khaţm Waraq Khatm Waraq Khatm Waraq,Khaţm Waraq 24.36667 55.45 T DUNE AE 01 0 158 Asia/Dubai 2011-11-06 +290506 Warāq Waraq Waraq,Warāq 22.97996 54.18115 T DPR AE 01 0 98 Asia/Dubai 2011-11-06 +290507 Wādī Wamm Wadi Wamm Wadi Wamm,Wādī Wamm 25.60512 56.22705 H WAD AE 04 0 42 Asia/Dubai 2011-11-06 +290508 Jabal Wamm Jabal Wamm Jabal Wamm 25.6021 56.19906 T MT AE 04 0 490 Asia/Dubai 2011-11-06 +290509 Wamm Wamm Wamm 25.60031 56.22838 P PPL AE 04 0 42 Asia/Dubai 2011-11-06 +290510 Walters Shoal Walters Shoal Walters Shoal 24.39524 52.47387 H RF AE 01 0 -9999 Asia/Dubai 2011-11-06 +290511 Sayḩ al Wakrah Sayh al Wakrah Sayh al Wakrah,Sayḩ al Wakrah 24.59461 54.96476 T TRGD AE 01 0 57 Asia/Dubai 2011-11-06 +290512 Wahala Wahala Wahala,Wahlah,Waḩlah 24.90897 56.30316 P PPL AE 02 0 71 Asia/Muscat 2011-11-06 +290513 Wādī Wahīyah Wadi Wahiyah Wadi Wahiya,Wadi Wahiyah,Wādī Wahiya,Wādī Wahīyah 24.8183 56.15931 H WAD AE 02 0 282 Asia/Dubai 2011-11-06 +290514 Jabal Waḩīd Jabal Wahid Jabal Wahid,Jabal Waḩīd,The Hummock 24.31115 52.61141 T HLL AE 01 0 45 Asia/Dubai 2011-11-06 +290515 Wāḩid Wahid Wahid,Wāḩid 24.82444 56.08111 V CULT AE 02 0 339 Asia/Dubai 2011-11-06 +290516 Waharmā Waharma Waharma,Waharmā 22.75519 53.44766 T DPR AE 01 0 66 Asia/Dubai 2011-11-06 +290517 Wafd Wafd Qutuf,Quţūf,Waafit,Wafd,Wafid,Wefid 23.10262 53.71159 P PPL AE 01 0 84 Asia/Dubai 2011-11-06 +290518 Wad Wid Wad Wid Wad Wid 25.62515 56.01396 P PPL AE 05 0 17 Asia/Dubai 2011-11-06 +290519 Wādī Shī Wadi Shi Wadi Shi,Wādī Shī 25.35 56.31667 P PPL AE 06 0 77 Asia/Dubai 2011-11-06 +290520 Ḩabl Wādī Şafā Habl Wadi Safa Habl Wadi Safa,Wadi Safa,Wādī Şafā,Ḩabl Wādī Şafā 25.06092 55.27055 T DUNE AE 03 0 33 Asia/Dubai 2011-11-06 +290521 Wadhīl Wadhil Wadhil,Wadhīl,Wedheil,Wudhayl 23.0474 54.13332 P PPL AE 01 0 99 Asia/Dubai 2011-11-06 +290522 Wādī Wa‘bayn Wadi Wa`bayn Wadi Wa`bayn,Wādī Wa‘bayn 25.57261 56.12374 H WAD AE 04 0 400 Asia/Dubai 2011-11-06 +290523 Wa‘bayn Wa`bayn Wa'abain,Wa`bayn,Wa‘bayn,Wa’abain 25.57046 56.13536 P PPL AE 04 0 357 Asia/Dubai 2011-11-06 +290524 ‘Uzlah `Uzlah `Uzalah,`Uzlah,‘Uzalah,‘Uzlah 22.99545 54.16649 T DPR AE 01 0 91 Asia/Dubai 2011-11-06 +290525 Wādī al ‘Uyaynah Wadi al `Uyaynah Wadi Ayeina,Wadi al `Uyaynah,Wādī Ayeina,Wādī al ‘Uyaynah 25.4742 56.18514 H WAD AE 04 0 176 Asia/Dubai 2011-11-06 +290526 Ghaffāt al ‘Uwayyirah Ghaffat al `Uwayyirah Ghaffat al `Uwayyirah,Ghaffāt al ‘Uwayyirah 24.46667 55.31667 T DUNE AE 01 0 152 Asia/Dubai 2011-11-06 +290527 Jabal al ‘Uwayyin Jabal al `Uwayyin Jabal al `Uwayyin,Jabal al ‘Uwayyin 25.36083 56.32395 T MT AE 06 0 583 Asia/Dubai 2011-11-06 +290528 Ţawī ‘Uwayyah Tawi `Uwayyah Tawi `Uwayyah,Ţawī ‘Uwayyah 25.58472 55.76028 H WLL AE 07 0 26 Asia/Dubai 2011-11-06 +290529 ‘Uwayyah `Uwayyah `Uwayyah,‘Uwayyah 25.11278 55.30367 L LCTY AE 03 0 24 Asia/Dubai 2011-11-06 +290530 Qarn ‘Uwayşim Qarn `Uwaysim Qarn `Uwaysim,Qarn ‘Uwayşim 23.86667 53.43333 T HLL AE 01 0 70 Asia/Dubai 2011-11-06 +290531 ‘Uwayşim `Uwaysim `Uwaisim,`Uwaysim,‘Uwaisim,‘Uwayşim 23.88333 53.38333 H WLL AE 01 0 66 Asia/Dubai 2011-11-06 +290532 Sabkhat ‘Uwayrah Sabkhat `Uwayrah Sabkhat `Uwayrah,Sabkhat ‘Uwayrah 23.95006 55.3068 H SBKH AE 01 0 131 Asia/Dubai 2011-11-06 +290533 Niqyān ‘Uwayrah Niqyan `Uwayrah Niqyan `Uwayrah,Niqyān ‘Uwayrah 23.96497 55.28962 T DUNE AE 01 0 181 Asia/Dubai 2011-11-06 +290534 Ţawī al ‘Uwaynīyah Tawi al `Uwayniyah Tawi al `Uwayniyah,Ţawī al ‘Uwaynīyah 25.31667 55.76667 H WLL AE 06 0 86 Asia/Dubai 2011-11-06 +290535 ‘Uwayjir `Uwayjir `Uwayjir,‘Uwayjir 24.71667 55.16667 T HLL AE 03 0 87 Asia/Dubai 2011-11-06 +290536 ‘Uwayj al ‘Abīd `Uwayj al `Abid `Uwayj al `Abid,‘Uwayj al ‘Abīd 24.11667 55.06667 T DUNE AE 01 0 119 Asia/Dubai 2011-11-06 +290537 ‘Uwayj al ‘Abīd `Uwayj al `Abid `Uwayj al `Abid,‘Uwayj al ‘Abīd 24.13333 55.06667 T DPR AE 01 0 125 Asia/Dubai 2011-11-06 +290538 Jabal ‘Uwaybil Jabal `Uwaybil Jabal `Uwaybil,Jabal ‘Uwaybil 25.44021 55.96991 T DUNE AE 05 0 189 Asia/Dubai 2011-11-06 +290539 Jabal al ‘Uţayfah Jabal al `Utayfah Jabal al `Utayfah,Jabal al ‘Utayfah,Jabal al ‘Uţayfah 25.51024 56.02862 T HLL AE 04 0 278 Asia/Dubai 2011-11-06 +290540 ‘Ushsh `Ushsh 'Ishsh,Al Isha,Jazirat `Ish,Jazīrat ‘Ish,Ushsh,`Ashsh,`Ish,`Ushsh,‘Ashsh,‘Ish,‘Ushsh,’Ishsh 24.30488 52.87712 T ISL AE 01 0 -9999 Asia/Dubai 2011-11-06 +290541 Wādī Ushayl Wadi Ushayl Wadi Ushail,Wadi Ushayl,Wādī Ushail,Wādī Ushayl 24.90515 56.08586 H WAD AE 05 0 287 Asia/Dubai 2011-11-06 +290542 Wādī ‘Usaylah Wadi `Usaylah Wadi `Usaylah,Wādī ‘Usaylah 25.69178 56.03764 H WAD AE 05 0 48 Asia/Dubai 2011-11-06 +290543 Sabkhat al ‘Urūq Sabkhat al `Uruq Sabkhat al `Uruq,Sabkhat al ‘Urūq 23.90811 54.18872 H SBKH AE 01 0 40 Asia/Dubai 2011-11-06 +290544 ‘Urqūb Sibā’ `Urqub Siba' Sbaa,Siba`,Sibā‘,`Urqub Siba',‘Urqūb Sibā’ 25.27824 55.47043 L LCTY AE 03 0 24 Asia/Dubai 2011-11-06 +290545 ‘Urqūb Juwayzah `Urqub Juwayzah `Urqub Juwayzah,‘Urqūb Juwayzah 24.90586 55.4608 T SCRP AE 03 0 107 Asia/Dubai 2011-11-06 +290546 ‘Urqūb Juwayza `Urqub Juwayza `Urqub Juwayza,‘Urqūb Juwayza 24.93333 55.46667 P PPL AE 03 0 102 Asia/Dubai 2011-11-06 +290547 ‘Uraykah `Uraykah `Uraykah,‘Uraykah 24.36667 55.45 T TRGD AE 01 0 158 Asia/Dubai 2011-11-06 +290548 ‘Uraykah `Uraykah 'Ureika,`Uraykah,‘Uraykah,’Ureika 24.33333 55.46667 T HLL AE 01 0 199 Asia/Dubai 2011-11-06 +290549 Wādī ‘Urayf Wadi `Urayf Wadi `Urayf,Wādī ‘Urayf 25.49385 56.06209 H WAD AE 04 0 147 Asia/Dubai 2011-11-06 +290550 ‘Uraybī `Uraybi Araibi,`Uraybi,‘Uraybī 25.78945 55.97665 P PPLX AE 05 0 20 Asia/Dubai 2011-11-06 +290551 ‘Uqayyiq `Uqayyiq `Uqayyiq,‘Uqayyiq 24.53333 54.75 H WLL AE 01 0 33 Asia/Dubai 2011-11-06 +290552 ‘Uqayyiq `Uqayyiq `Uqayyiq,‘Uqayyiq 24.52079 54.66317 T DUNE AE 01 0 7 Asia/Dubai 2011-11-06 +290553 Ţawī ‘Uqayr Tawi `Uqayr Tawi `Uqayr,Ţawī ‘Uqayr 23.78033 55.4708 H WLL AE 01 0 146 Asia/Dubai 2011-11-06 +290554 ‘Uqayr `Uqayr `Uqayr,‘Uqayr 25.28302 56.36435 P PPL AE 06 0 23 Asia/Dubai 2011-11-06 +290555 ‘Uqaydāt `Uqaydat Al `Uqaydat,Al ‘Uqaydāt,`Uqaydat,‘Uqaydāt 24.78556 55.78972 V TREE AE 06 0 275 Asia/Dubai 2011-11-06 +290556 Jabal ‘Uqaybāt Jabal `Uqaybat Jabal `Uqaybat,Jabal ‘Uqaybāt 25.1275 56.31278 T HLL AE 04 0 155 Asia/Dubai 2011-11-06 +290557 United Arab Emirates United Arab Emirates Ab'adnanya Arabskia Emiraty,Al Imarat al `Arabiyah al Muttahidah,Al Imārāt al ‘Arabīyah al Muttaḩidah,Aontas na nEimiriochtai Arabacha,Aontas na nÉimíríochtaí Arabacha,Apvienotie Arabu Emirati,Apvienotie Arābu Emirāti,Araabia UEhendemiraadid,Araabia Ühendemiraadid,Arab Federation of Gulf States,Arab Gulf Federation,Arabiar Emirerri Batuak,Arabiar Emirrerri Batuak,Arabiemiirikunnat,Birlashgan Arab Amirliglar,Birlesik Arap Emirlikleri,Birleşik Arap Emirlikleri,Cac Tieu Vuong quoc A-rap Thong nhat,Cac Tieu vuong quoc A rap Thong nhat,Các Tiểu Vương quốc A-rập Thống nhất,Các Tiểu vương quốc Ả rập Thống nhất,Dawlat Ittihad al Imarat al `Arabiyah,Dawlat Ittiḩād al Imārāt al ‘Arabīyah,De forente arabiske emirater,Dei sameinte arabiske emirata,Egyesuelt Arab Emiratus,Egyesuelt Arab Emirsegek,Egyesült Arab Emirátus,Egyesült Arab Emírségek,Emira Arab Ini,Emirados Arabes Unidos,Emirados Árabes Unidos,Emiraethau Arabaidd Unedig,Emiratele Arabe Unite,Emiratet Arabe te Bashkuara,Emiratet e Bashkuara Arabe,Emirati Arabi Uniti,Emirati Gharab Maqghuda,Emirati Għarab Maqgħuda,Emiratos Arabe Unite,Emiratos Arabes Unidos,Emiratos Arabes Unitos,Emiratos Árabes Unidos,Emiratos Árabes Unidos - الإمارات العربيّة المتّحدة,Emirats Arabes Unis,Emirats Arabis Units,Emirats Arabs Units,Emirats arabes units,Emirats arabos unis,Emirats Àrabs Units,Emiratus Arabi Uniti,Emirelezhiou Arab Unanet,Emirelezhioù Arab Unanet,Emiriah Arab Bersatu,Enomena Arabika Emirata,Falme za Kiarabu,Federation of Arab Emirates,Federation of Arabian Emirates,Federation of Arabian Gulf Emirates,Feriene Arabyske Emiraten,Foerenade Arabemiraten,Forenede Arabiske Emirater,Förenade Arabemiraten,Imaaraadka Carabta ee Midoobay,Jungtiniai Arabu Emyratai,Jungtiniai Arabų Emyratai,Lemiraens Pebaloel Larabaenik,Lemiräns Pebalöl Larabänik,Mirnisinen Erebi yen Yekbuyi,Muugano wa Falme za Nchi za Kiarabu,Mîrnişînên Erebî yên Yekbûyî,OAEH,Ob"edinjonnye Arabskie Ehmiraty,Obedineni Arabski Emirstva,Obedineti Arapski Emirati,Obuedinennye Arabskie Ehmiraty,Ovttastuvvan Arabaemirahtat,Ovttastuvvan Arábaemiráhtat,Pennternasedh Unys Arabek,Sameindu Emirrikini,Sameindu Emirríkini,Sameinudu arabisku furstadaemin,Sameinuðu arabísku furstadæmin,Spojene arabske emiraty,Spojené arabské emiráty,Trucial States,UAE,Ujedineni Arapski Emirati,Ujedinjeni Arapski Emirati,Uni Emirat Arab,Unio dels Emirats Arabs,Union of Arab Emirates,Unionita Araba Emirati,United Arab Emirates,Unió dels Emirats Àrabs,Unuigintaj Arabaj Emirlandoj,Unuigintaj Arabaj Emirlandos,Unuiĝintaj Arabaj Emirlandoj,Unuiĝintaj Arabaj Emirlandos,Vereenegt Arabesch Emirater,Vereenigte Araabsche Emiraten,Vereinegde Arabische Emirate,Vereinigte Arabische Emirate,Verenigde Arabiese Emirate,Verenigde Arabische Emiraten,Zdruzeni arabski emirati,Združeni arabski emirati,Zjednocene Arabske Emiraty,Zjednoczone Emiraty Arabskie,Zjednoćene Arabske Emiraty,a la bo lian he qiu zhang guo,aikkiya arapu amirakam,aikkiya arapu kuttatci,alab-emiliteu,arabetis gaertianebuli saamiroebi,arabu shou zhang guo lian bang,sanyukta arab rastram,sanyukta araba amirata,shrath xahrab xe mi rets,Èmirats arabes units,Èmirats arabos unis,Émirats Arabes Unis,Ηνωμένα Αραβικά Εμιράτα,Аб'яднаныя Арабскія Эміраты,Имороти Муттаҳидаи Араб,ОАЭ,Об'єднані Арабські Емірати,Обʼєднані Арабські Емірати,Обединени Арабски Емирства,Обединети Арапски Емирати,Объединенные Арабские Эмираты,Объединённые Арабские Эмираты,Уједињени Арапски Емирати,Միացյալ Արաբական Էմիրաթներ,איחוד האמירויות הערביות,איחוד נסיכויות ערב,ברית האמירויות הערביות,ئەرەب بىرلەشمە خەلىپىلىكى,الإمارات العربية المتحدة,الامارات العربية المتحدة,امارات متحده عربی,امارات متحدهٔ عربی,عمارات متحده ی عربی,متحده عرب امارات,متحدہ عرب امارات,ܐܡܝܪܘܬܐ ܥܪܒܝܬܐ ܚܕܝܬܐ,संयुक्त अरब अमीरात,সংযুক্ত আরব আমিরাত,ஐக்கிய அரபு அமீரகம்,ஐக்கிய அரபு கூட்டாட்சி,ഐക്യ അറബ് എമിരേറ്റുകള്‍‌,സംയുക്ത അറബ് രാഷ്ട്രം,สหรัฐอาหรับเอมิเรตส์,ສະຫະລັດອາຫລັບເອມິເລດ,ཡུ་ནའི་ཊེཊ་ཨ་ར བ་ཨེ་མི་རེཊསི,ཨ་རབ། ཨི་མི་རཊ྄། ཆིག་སྒྲིལ་རྒྱལ་ཁབ།,არაბეთის გაერთიანებული ემირატები,არაბეთის გაერთიანებული საამიროები,የተባበሩት አረብ ኤምሬትስ,អេមីរ៉ែទអារ៉ាប់រួម,アラブ首長国連邦,阿拉伯联合酋长国,아랍에미리트 24 54 A PCLI AE 00 4975593 12 Asia/Dubai 2011-11-06 +290558 Umm Şayd Umm Sayd Umm Sayd,Umm Şayd 22.94932 53.78481 T DPR AE 01 0 44 Asia/Dubai 2011-11-06 +290559 Umm Qays Umm Qays Umm Qays,Umm Qayz,Umm Qayz̧,Umm Qaz,Umm Qaz̧ 22.92996 53.41542 H WLL AE 01 0 65 Asia/Dubai 2011-11-06 +290560 Umm Qays Umm Qays Umm Qays,Umm Qayz,Umm Qayz̧ 22.92593 53.4138 T DPR AE 01 0 65 Asia/Dubai 2011-11-06 +290561 Umm Jaşşār Umm Jassar Umm Jassar,Umm Jaşşār,Umm Qasar,Umm Qassar,Umm Qaşār,Umm Qaşşār,`Umm Gassar,‘Umm Gaṣṣār 24.3914 52.77794 T ISL AE 01 0 -9999 Asia/Dubai 2011-11-06 +290562 Umm Minhad Umm Minhad Umm Minhad 24.99359 55.3636 T SAND AE 03 0 40 Asia/Dubai 2011-11-06 +290564 Fasht Umm Jannah Fasht Umm Jannah Fasht Umm Janna,Fasht Umm Jannah,Janna 24.56959 51.5546 H RF AE 01 0 -9999 Asia/Dubai 2011-11-06 +290565 Qarn Umm Ḩaşá Qarn Umm Hasa Qarn Umm Hasa,Qarn Umm Ḩaşá 25.11385 55.38284 T DUNE AE 03 0 49 Asia/Dubai 2011-11-06 +290566 Umm Ḩafāt Umm Hafat Umm Hafaf,Umm Hafat,Umm Ḩafāf,Umm Ḩafāt 23.84889 53.67889 H WLL AE AE 01 0 76 Asia/Dubai 2011-11-06 +290567 Umm Khafat Umm Khafat Umm Hafaf,Umm Hafat,Umm Kafat,Umm Khafat,Umm Ḩafāf,Umm Ḩafāt 23.85336 53.69666 T HLL AE 01 0 95 89 Asia/Dubai 2011-11-06 +290568 Umm Ḩābil Umm Habil Umm Habil,Umm Ḩābil 22.99242 54.08237 T DPR AE 01 0 213 Asia/Dubai 2011-11-06 +290569 Ţawī Umm Ghuwayr Tawi Umm Ghuwayr Tawi Umm Ghuwayr,Ţawī Umm Ghuwayr 24.25341 55.0425 H WLL AE 01 0 125 Asia/Dubai 2011-11-06 +290570 Umm Ghaythah Umm Ghaythah Umm Gaita,Umm Ghaythah 24.10556 55.67583 T DPR AE AE 01 0 244 Asia/Dubai 2011-11-06 +290571 Jazīrat Umm Yafīnah Jazirat Umm Yafinah Jazirat Umm Yafinah,Jazīrat Umm Yafīnah,Umm Fiyin,Umm Fīyīn,jzyrt am yfynt,جزيرة أم يفينة 24.48752 54.45009 T ISL AE 01 0 -9999 Asia/Dubai 2011-11-06 +290572 Umm Dhuwaylah Umm Dhuwaylah Umm Dhuwaylah 24.45801 54.7294 H WLL AE 01 0 26 Asia/Dubai 2011-11-06 +290573 Umm Dhuwaylah Umm Dhuwaylah Umm Dhuwaylah 24.4692 54.723 T SAND AE 01 0 36 Asia/Dubai 2011-11-06 +290574 Umm Dasīs Umm Dasis Umm Dasis,Umm Dasīs,Umm Daysis,Umm Daysīs 23.81981 53.53876 L GVL AE 01 0 109 Asia/Dubai 2011-11-06 +290575 Wādī Umm ad Daqqayn Wadi Umm ad Daqqayn Wadi Umm Daqqayn,Wadi Umm ad Daqqayn,Wādī Umm Daqqayn,Wādī Umm ad Daqqayn 24.80556 56.20722 H WAD AE AE 00 0 271 Asia/Dubai 2011-11-06 +290576 Kharaj Umm Biyāt Kharaj Umm Biyat Kharaj Umm Bayat,Kharaj Umm Bayāt,Kharaj Umm Biyat,Kharaj Umm Biyāt 25.15 55.4 H WLL AE AE 03 0 7 Asia/Dubai 2011-11-06 +290577 Ţawī Umm Baraz Tawi Umm Baraz Tawi Umm Baraz,Ţawī Umm Baraz 22.94415 54.96468 H WLL AE 01 0 137 Asia/Dubai 2011-11-06 +290578 Sabkhat Umm Baraz Sabkhat Umm Baraz Sabkhat Umm Baraz 22.93458 55.03856 H SBKH AE 01 0 99 Asia/Dubai 2011-11-06 +290579 Umm Baraz Umm Baraz Umm Baraz 23.05 54.95 H WLL AE 01 0 125 Asia/Dubai 2011-11-06 +290580 Umm az Zumūl Umm az Zumul Umm Zamul,Umm Zamūl,Umm al Zamul,Umm az Zumul,Umm az Zumūl,Umm az-Zamul 22.70559 55.21205 H WLL AE 01 0 121 Asia/Dubai 2011-11-06 +290581 Umm Suqaym Umm Suqaym Umm Suqaym,Umm as Suqaym 25.15015 55.20587 P PPLX AE 03 0 26 Asia/Dubai 2011-11-06 +290582 Ḩaql Umm ash Shayf Haql Umm ash Shayf Haql Umm ash Shayf,Umm Shaif,Umm al-Shayf,Umm al-Sheif,Umm ash Sha'if,Umm ash Shā’if,Ḩaql Umm ash Shayf 25.2 53.2 L OILF AE AE 01 0 -9999 Asia/Dubai 2011-11-06 +290583 Umm ar Raml Umm ar Raml Umm ar Raml 25.19658 55.41034 L LCTY AE 03 0 22 Asia/Dubai 2011-11-06 +290584 Umm ar Raml Umm ar Raml Umm ar Raml 25.23333 55.38333 T DUNE AE 03 0 29 Asia/Dubai 2011-11-06 +290585 Wādī Umm an Nughūl Wadi Umm an Nughul Wadi Umm an Nughul,Wādī Umm an Nughūl 25.34985 55.84553 H WAD AE 07 0 111 Asia/Dubai 2011-11-06 +290586 Ţawī Umm an Nughūl Tawi Umm an Nughul Tawi Umm an Nughul,Ţawī Umm an Nughūl 25.36333 55.87019 H WLL AE 07 0 92 Asia/Dubai 2011-11-06 +290587 Umm an Nār Umm an Nar Jazirat Umm an Nar,Jazīrat Umm an Nār,Umm an Nar,Umm an Nār,`Umm al-Nar,am alnar,أم النار,‘Umm al-Nār 24.44248 54.50948 T ISL AE 01 0 -9999 Asia/Dubai 2011-11-06 +290588 Umm ‘Amīm Umm `Amim Jazirat Umm `min,Jazīrat Umm ‘mīn,Umm `Amim,Umm ‘Amīm 24.24128 53.39448 T ISL AE 01 0 -9999 Asia/Dubai 2011-11-06 +290589 Umm al Qurayn Umm al Qurayn Umm Grain,Umm al Qurayn,`Umm Qrein,‘Umm Qrein 23.1 53.71667 P PPL AE AE 01 0 181 Asia/Dubai 2011-11-06 +290590 Umm al Qurayn Umm al Qurayn Umm al Qurayn 23.09087 53.72477 L OAS AE 01 0 101 Asia/Dubai 2011-11-06 +290591 Umm al Qiţa‘ Umm al Qita` Umm al Qita`,Umm al Qiţa‘ 23.05522 53.53183 L OAS AE 01 0 127 Asia/Dubai 2011-11-06 +290592 Umm al Qird Umm al Qird Umm al Fa'iyah,Umm al Fā’iyah,Umm al Qird 24.20527 54.79192 T SAND AE 01 0 66 Asia/Dubai 2011-11-06 +290593 Khawr Umm al Qaywayn Khawr Umm al Qaywayn Khawr Umm al Qaywayn 25.56 55.57972 H BAY AE 07 0 -9999 Asia/Dubai 2011-11-06 +290594 Umm al Qaywayn Umm al Qaywayn Um al Quweim,Umm al Qaiwain,Umm al Qawain,Umm al Qaywayn,Yumul al Quwain,am alqywyn,أم القيوين 25.56473 55.55517 P PPLA AE 07 44411 8 Asia/Dubai 2011-11-06 +290595 Umm al Qaywayn Umm al Qaywayn Oumm al Qaiwain,Oumm al Qaïwaïn,Skeikhdom of Umm al Qaiwain,Umm Al Quwain,Umm al Qawain,Umm al Qaywayn,Umm al Qiwain,am alqywyn,أم القيوين 25.5 55.75 A ADM1 AE 07 56253 65 Asia/Dubai 2011-11-05 +290596 Kharīmat Umm al Muwayghir Kharimat Umm al Muwayghir Kharimat Umm al Muwayghir,Kharīmat Umm al Muwayghir 24.10497 54.80762 T DPR AE 01 0 74 Asia/Dubai 2011-11-06 +290597 Umm al Kurkum Umm al Kurkum Umm Kirkum,Umm Kurkum,Umm al Kurkum 24.39273 52.76497 T ISL AE 01 0 -9999 Asia/Dubai 2011-11-06 +290598 Umm al Ḩişn Umm al Hisn Umm al Hisn,Umm al Ḩişn 23.01691 53.41646 S FT AE 01 0 118 Asia/Dubai 2011-11-06 +290599 Umm al Ḩişn Umm al Hisn Umm al Hisn,Umm al Ḩişn 23.01994 53.44238 T DPR AE 01 0 89 Asia/Dubai 2011-11-06 +290600 Umm al Hiryān Umm al Hiryan Umm al Hiryan,Umm al Hiryān 24.31722 55.79722 H WLL AE 01 0 280 Asia/Dubai 2011-11-06 +290601 Umm al Ḩaţab Umm al Hatab Jazirat Umm al Hatab,Jazīrat Umm al Ḩaţab,Umm al Halab Island,Umm al Hatab,Umm al Ḩaţab,Umm el Halab 24.21623 51.86389 T ISL AE 01 0 -9999 Asia/Dubai 2011-11-06 +290602 Umm al Ghurūl Umm al Ghurul Umm al Ghurul,Umm al Ghurūl 23.84161 53.21056 L GVL AE 01 0 97 Asia/Dubai 2011-11-06 +290603 Umm al Ghirbān Umm al Ghirban Umm al Gharban,Umm al Gharbān,Umm al Ghirban,Umm al Ghirbān 23.03841 53.55597 T DPR AE 01 0 71 Asia/Dubai 2011-11-06 +290604 Wādī Umm al Ghāt Wadi Umm al Ghat Wadi Umm al Ghat,Wādī Umm al Ghāt 24.87975 56.2778 H WAD AE 05 0 89 Asia/Dubai 2011-11-06 +290605 Jabal Umm al Furfār Jabal Umm al Furfar Jabal Umm al Farfar,Jabal Umm al Farfār,Jabal Umm al Furfar,Jabal Umm al Furfār 25.12448 56.22754 T MT AE 04 0 735 Asia/Dubai 2011-11-06 +290606 Umm al Birak Umm al Birak Umm al Barak,Umm al Barāk,Umm al Birak,Umm al-Berak 24.56699 54.58394 T ISL AE 01 0 -9999 Asia/Dubai 2011-11-06 +290607 Umm al Banādīq Umm al Banadiq Umm al Banadig,Umm al Banadiq,Umm al Banādīq 24.08705 55.27527 H WLL AE 01 0 151 Asia/Dubai 2011-11-06 +290608 Umm al Ashţān Umm al Ashtan Umm al Ashtan,Umm al Ashţān 23.58333 52.48333 H WLL AE 01 0 75 Asia/Dubai 2011-11-06 +290609 Umm al Ashţān Umm al Ashtan Umm al Ashtan,Umm al Ashţān,Umm al Lishtan,Umm al Lishtān 23.76667 52.66667 T SAND AE AE 01 0 79 Asia/Dubai 2011-11-06 +290610 Umm al Ashţān Umm al Ashtan Umm al Ashtan,Umm al Ashţān,Umm al Ishtan,Umm al Ishţān 23.65248 52.45047 S CMPQ AE 01 0 64 Asia/Dubai 2011-11-06 +290611 Umm ‘Alaqah Umm `Alaqah Um `Alaqa,Um ‘Alaqa,Umm `Alaqah,Umm ‘Alaqah 24.0024 53.39048 T HLL AE 01 0 23 Asia/Dubai 2011-11-06 +290612 Ruqq Umm al ‘Anbar Ruqq Umm al `Anbar Ruqq Um el Umber,Ruqq Umm al `Anbar,Ruqq Umm al ‘Anbar,Umbar 24.60999 51.8836 H SHOL AE 01 0 -9999 Asia/Dubai 2011-11-06 +290613 Sabkhat Umm al ‘Alqah Sabkhat Umm al `Alqah Sabkhat Umm al Alqa,Sabkhat Umm al `Alqah,Sabkhat Umm al ‘Alqah 23.63234 54.85535 H SBKH AE 01 0 115 Asia/Dubai 2011-11-06 +290614 Umm al ‘Alqah Umm al `Alqah Umm al Alqa,Umm al `Alqah,Umm al ‘Alqah 23.68333 54.83333 H WLL AE 01 0 105 Asia/Dubai 2011-11-06 +290615 Umm al Abyaḑ Umm al Abyad Umm al Abyad,Umm al Abyaḑ 25.09157 55.2481 H WLLS AE 03 0 26 Asia/Dubai 2011-11-06 +290616 Umm ad Dalkh Umm ad Dalkh Umm Addalkh,Umm ad Dalkh,Umm al Dalkh 24.53655 54.14598 L OILF AE 01 0 -9999 Asia/Dubai 2011-11-06 +290617 Ghuyūţ ‘Ulayyah Ghuyut `Ulayyah Ghuyut `Ulayyah,Ghuyūţ ‘Ulayyah 23.85 54.73333 T DPR AE 01 0 96 Asia/Dubai 2011-11-06 +290618 ‘Ūd Umm Khālid `Ud Umm Khalid `Ud Umm Khaldi,`Ud Umm Khalid,‘Ūd Umm Khaldī,‘Ūd Umm Khālid 25.1375 55.39861 V TREE AE 03 0 35 Asia/Dubai 2011-11-06 +290619 Ra’s al ‘Udayd Ra's al `Udayd Al Odaid,Al `Udayd,Al ‘Udayd,Ra's al `Udayd,Ra’s al ‘Udayd 24.61667 51.43333 T PT AE 01 0 -9999 Asia/Dubai 2011-11-06 +290620 Khawr al ‘Udayd Khawr al `Udayd Khawr al Wutayd,Khawr al Wuţayd,Khawr al `Udayd,Khawr al `Uwayd,Khawr al ‘Udayd,Khawr al ‘Uwayd,Khor al Odaid,Khor al Odeid,Khor al Ubeid,Khor al Wutaid,Khor al `Udaid,Khor al `Udeid,Khor al ‘Udaid,Khor al ‘Udeid 24.6 51.4 H INLT AE AE 06 0 -9999 Asia/Dubai 2011-11-06 +290622 ‘Ūd al Maţīnah `Ud al Matinah Aud al Matina,Awad al Matinah,Matina,Matinah,Matīna,Maţīnah,`Ud al Matinah,‘Ūd al Maţīnah 25.25583 55.44611 H WLLS AE 03 0 24 Asia/Dubai 2011-11-06 +290623 ‘Ūd al Maţīnah `Ud al Matinah `Ud al Matinah,‘Ūd al Maţīnah 25.23815 55.4741 L LCTY AE 03 0 39 Asia/Dubai 2011-11-06 +290624 ‘Ūd al Bayḑā’ `Ud al Bayda' Ud al Beida,`Ud al Bayda',‘Ūd al Bayḑā’ 25.01625 55.45533 P PPL AE 03 0 95 Asia/Dubai 2011-11-06 +290625 ‘Ūd al Atham `Ud al Atham `Ud al Atham,‘Ūd al Atham 25.15 55.71667 V TREE AE 06 0 124 Asia/Dubai 2011-11-06 +290626 ‘Ubaydil `Ubaydil `Ibeidil,`Ubaydhil,`Ubaydil,‘Ibeidil,‘Ubaydhil,‘Ubaydil 24.51667 51.33333 H WLL AE 01 0 -9999 Asia/Dubai 2011-11-06 +290627 Wādī Ţuwayyah Wadi Tuwayyah Wadi Tuwayyah,Wādī Ţuwayyah 24.25722 55.68778 H WAD AE 01 0 267 Asia/Dubai 2011-11-06 +290628 Sayḩ Ţuwayyah Sayh Tuwayyah Sayh Tuwayyah,Sayḩ Ţuwayyah 24.39139 55.8275 T PLN AE 00 0 327 Asia/Dubai 2011-11-06 +290629 Sayḩ Tuwaysah Sayh Tuwaysah Sayh Tuways,Sayh Tuwaysah,Sayḩ Tuways,Sayḩ Tuwaysah 24.29278 55.505 T DPR AE AE 01 0 195 Asia/Dubai 2011-11-06 +290630 Ţawī Ţuwayli‘ Tawi Tuwayli` Tawi Tawaila,Tawi Tuwayli`,Tawi Tuwayyilah,Ţawī Tawaila,Ţawī Ţuwayli‘,Ţawī Ţuwayyilah 24.97679 55.7508 H WLL AE 06 0 171 Asia/Dubai 2011-11-06 +290631 Kharīmat Ţuwaylah Kharimat Tuwaylah Kharimat Tawaila,Kharimat Tuwaylah,Kharmat Tuwaylah,Kharmat Ţuwaylah,Kharīmat Ţuwaylah 24.1361 54.82632 T TRGD AE 01 0 92 Asia/Dubai 2011-11-06 +290632 Tuwayhil Tuwayhil Tuwayhil 23.4594 53.29148 H WLL AE 01 0 160 Asia/Dubai 2011-11-06 +290633 Jabal Tu‘ūs Jabal Tu`us Jabal Tu`us,Jabal Tus,Jabal Tu‘ūs 25.29958 56.11017 T HLL AE 04 0 550 Asia/Dubai 2011-11-06 +290634 Ţurayf Turayf Turayf,Ţurayf 23.0742 53.80161 T DPR AE 01 0 70 Asia/Dubai 2011-11-06 +290635 Ţunayq Tunayq Tanaij,Tanaiq,Tunaij,Tunayq,Ţunayq 25.86476 56.04169 L TRB AE 05 0 435 Asia/Dubai 2011-11-06 +290636 Tunayq Tunayq Tanaij,Tanaiq,Tunaij,Tunayq 25.26139 55.94944 L TRB AE 06 0 156 Asia/Dubai 2011-11-06 +290637 ‘Aqabat Tūmaytayn `Aqabat Tumaytayn `Aqabat Tumaytayn,‘Aqabat Tūmaytayn 25.47656 56.35033 T PASS AE 04 0 17 Asia/Dubai 2011-11-06 +290638 Ţawī Ţubūl Tawi Tubul Tawi Tubul,Ţawī Ţubūl 24.22687 55.03957 H WLL AE 01 0 133 Asia/Dubai 2011-11-06 +290639 Jabal Ţubayqah Jabal Tubayqah Jabal Tubayqah,Jabal Ţubayqah 24.07825 56.00668 T HLL AE 01 0 429 Asia/Dubai 2011-11-06 +290640 Trucial Coast Trucial Coast Al Sahil,Al Sāḩil,Arab Coast,Pirate Coast,Sahil `Oman,Sahil `Uman,Sahil as Sulh al Bahri,Shamal,Shamāl,Sāhil ‘Omān,Sāhil ‘Umān,Sāḩil aş Şulḩ al Baḩrī,Trucial Coast,Trucial Oman,Trucial `Uman,Trucial ‘Uman 24 53 L RGN AE AE 00 0 37 Asia/Dubai 2011-11-06 +290641 Tina Tina Tina 23.81243 55.37423 T DUNE AE 01 0 182 Asia/Dubai 2011-11-06 +290642 Sabkhat Thuwaymah Sabkhat Thuwaymah Sabkhat Thuwaymah 24.0275 55.66806 L SALT AE 01 0 227 Asia/Dubai 2011-11-06 +290643 ‘Urqūb Thurayyā `Urqub Thurayya `Urqub Thurayya,‘Urqūb Thurayyā 24.9 55.46667 T DUNE AE 03 0 139 Asia/Dubai 2011-11-06 +290644 Ţawī ath Thuqbah Tawi ath Thuqbah Tawi Thuqbah,Tawi ath Thuqbah,Ţawī Thuqbah,Ţawī ath Thuqbah 25.34611 55.84722 H WLL AE AE 07 0 111 Asia/Dubai 2011-11-06 +290645 Ţawī Thuqaybah Tawi Thuqaybah Tawi Thuqaybah,Ţawī Thuqaybah 24.94829 55.81388 H WLL AE 06 0 190 Asia/Dubai 2011-11-06 +290646 Ţawī Thuqaybah Tawi Thuqaybah Tawi Thuqaybah,Ţawī Thuqaybah 23.55 55.28333 H WLL AE 01 0 181 Asia/Dubai 2011-11-06 +290647 Sabkhat Thuqaybah Sabkhat Thuqaybah Sabkhat Thuqaybah 23.58997 55.19693 H SBKH AE 01 0 114 Asia/Dubai 2011-11-06 +290648 Khawr Thumayrīyah Khawr Thumayriyah Khawr Thumayriyah,Khawr Thumayrīyah,Themairiyyah 24.15274 53.0014 H CHNM AE 01 0 -9999 Asia/Dubai 2011-11-06 +290649 Thumayrīyah Thumayriyah Themairiyya,Themeiriyyah,Thimairiyah,Thumayriyah,Thumayrīyah 24.15033 53.0169 T ISL AE 01 0 -9999 Asia/Dubai 2011-11-06 +290650 Thubaybah Thubaybah Thubaybah 23.68333 54.61667 H WLL AE 01 0 117 Asia/Dubai 2011-11-06 +290651 Wādī Thayb Wadi Thayb Wadi Thayb,Wadi Theeb,Wādī Thayb 25.24914 56.35124 H WAD AE 04 0 96 Asia/Dubai 2011-11-06 +290652 Jabal Thayb Jabal Thayb Jabal Thaib,Jabal Thayb 25.25854 56.31202 T MT AE 04 0 386 Asia/Dubai 2011-11-06 +290653 Thawrīyah Thawriyah Thawriyah,Thawrīyah 23.02531 53.9109 T DPR AE 01 0 68 Asia/Dubai 2011-11-06 +290654 Thawrīyah Thawriyah Thawriyah,Thawrīyah 22.99797 53.76585 T DPR AE 01 0 60 Asia/Dubai 2011-11-06 +290655 Khabb ath Thawr Khabb ath Thawr Khabb ath Thawr 24.2597 54.64343 T SAND AE 01 0 17 Asia/Dubai 2011-11-06 +290656 Wādī Thawbān Wadi Thawban Wadi Thauban,Wadi Thawban,Wādī Thauban,Wādī Thawbān 25.28582 56.04058 H WAD AE 04 0 225 Asia/Dubai 2011-11-06 +290657 Jabal Thawbān Jabal Thawban Jabal Thawban,Jabal Thawbān 25.32944 56.10306 T MT AE 04 0 726 Asia/Dubai 2011-11-06 +290658 Tharwānīyah Tharwaniyah Tharwaniyah,Tharwaniyya,Tharwaniyyah,Tharwāniyya,Tharwāniyyah,Tharwānīyah 23.11088 54.01572 P PPL AE 01 0 191 Asia/Dubai 2011-11-06 +290659 Thara’awn Thara'awn Thara'awn,Thara’awn 22.91004 54.32293 T DPR AE 01 0 162 Asia/Dubai 2011-11-06 +290660 Jabal Thānī Jabal Thani Jabal Thanais,Jabal Thani,Jabal Thānī 25.02249 55.78912 T HLL AE 06 0 267 Asia/Dubai 2011-11-06 +290661 Thamūd Thamud Thamud,Thamūd 24.78333 55.28333 T TRGD AE 03 0 88 Asia/Dubai 2011-11-06 +290662 Barqat Thāmir Barqat Thamir Barqat Thamir,Barqat Thāmir 23.79619 52.66627 T DUNE AE 01 0 74 Asia/Dubai 2011-11-06 +290663 Bid‘at Thallāb Bid`at Thallab Bid`at Thallab,Bid`ath Thalab,Bid‘at Thallāb,Bid‘ath Thalāb 23.83333 53.3 H WLL AE 01 0 89 Asia/Dubai 2011-11-06 +290664 Ţayyibah Tayyibah Taiyibah,Tayibah,Tayiban,Tayyibah,Ţayyibah 25.41228 56.17075 P PPL AE 04 0 430 Asia/Dubai 2011-11-06 +290665 Ţawī Ţayy Tawi Tayy Tawi Tai,Tawi Tayy,Ţawī Ţayy,Ţāwī Tai 25.23333 55.55 H WLL AE 03 0 42 Asia/Dubai 2011-11-06 +290666 Ţawī Ţayrī Tawi Tayri Tawi Tayri,Ţawī Ţayrī 25.45472 55.60611 H WLL AE 07 0 16 Asia/Dubai 2011-11-06 +290667 Ḩadd aţ Ţayr Hadd at Tayr Hadd at Tayr,Ḩadd aţ Ţayr 24.3713 51.83258 H RF AE 01 0 -9999 Asia/Dubai 2011-11-06 +290668 Nadd aţ Ţarūsh Nadd at Tarush Nadd Tawsha,Nadd Tawshah,Nadd at Tarush,Nadd aţ Ţarūsh,Nadd Ţawshah,Nadd Ţawshā 25.14929 55.37296 T DUNE AE 03 0 22 Asia/Dubai 2011-11-06 +290669 Wādī Ţawīyayn Wadi Tawiyayn Wadi Tawiyayn,Wādī Ţawīyayn 25.5575 56.07694 H WAD AE 04 0 185 Asia/Dubai 2011-11-06 +290670 Ţawīyayn Tawiyayn Tawiyain,Tawiyayn,Tawyayn,Tuwiyain,Ţawīyayn 25.55778 56.07667 H WLL AE AE 04 0 185 Asia/Dubai 2011-11-06 +290671 Ţawī Bin ‘Asīl Tawi Bin `Asil Tawi Bin `Asil,Ţawī Bin ‘Asīl 24.20368 54.6095 L LCTY AE 01 0 31 Asia/Dubai 2011-11-06 +290672 Ţawī Bid‘ Sa‘īd Tawi Bid` Sa`id Tawi Bid` Sa`id,Ţawī Bid‘ Sa‘īd 24.45084 54.74048 T SAND AE 01 0 33 Asia/Dubai 2011-11-06 +290673 Wādī Tawāh Wadi Tawah Wadi Tawah,Wādī Tawāh 24.98978 56.1243 H WAD AE 05 0 295 Asia/Dubai 2011-11-06 +290674 Jabal Tawāh Jabal Tawah Jabal Tawah,Jabal Tawāh 24.99639 56.12398 T MT AE 05 0 306 Asia/Dubai 2011-11-06 +290675 Ţawī Tasharawīyah Tawi Tasharawiyah Tawi Tasharawiyah,Ţawī Tasharawīyah 25.28942 55.89526 H WLL AE 06 0 105 Asia/Dubai 2011-11-06 +290676 Ţarūqah Taruqah Taruqah,Ţarūqah 23.02725 53.88404 T DPR AE 01 0 69 Asia/Dubai 2011-11-06 +290677 Ţarūfah Tarufah Tarufa,Tarufah,Ţarūfah 23.08936 53.83218 L OAS AE 01 0 86 Asia/Dubai 2011-11-06 +290678 Ţawī Tarish Tawi Tarish Tawi Tarish,Ţawī Tarish 23.58333 54.61667 H WLL AE 01 0 140 Asia/Dubai 2011-11-06 +290679 Ţarīqat Ja‘d Tariqat Ja`d Tariqat Ja`d,Ţarīqat Ja‘d 25.52852 56.15144 P PPL AE 04 0 357 Asia/Dubai 2011-11-06 +290680 Ţarīf Kalbā Tarif Kalba Tarif Kalba,Ţarīf Kalbā 25.0695 56.33115 P PPL AE 06 0 30 Asia/Dubai 2011-11-06 +290681 Ţarīf Tarif Al-Tarif,Al-Tarīf,At Tarif,At Turayf,Aţ Ţarīf,Aţ Ţurayf,Taraif,Tarif,Ţarīf 24.05399 53.76347 P PPL AE 01 0 24 Asia/Dubai 2011-11-06 +290682 Ţarīf Tarif Tarif,Ţarīf 24.03333 53.76667 T HLL AE 01 0 13 Asia/Dubai 2011-11-06 +290683 Qurayn aţ Ţarib Qurayn at Tarib Qurayn at Tarib,Qurayn aţ Ţarib 25.09414 55.81301 T HLL AE 06 0 216 Asia/Dubai 2011-11-06 +290684 Sayḩ Ţarfā’ Sayh Tarfa' Sayh Tarfa',Sayḩ Ţarfā’ 23.21358 55.18286 T DPR AE 01 0 154 Asia/Dubai 2011-11-06 +290685 Mushāsh Ţarfā’ Mushash Tarfa' Mushash Tarfa',Mushāsh Ţarfā’ 24.04622 51.69787 H WLL AE 01 0 34 Asia/Dubai 2011-11-06 +290686 Qarn at Tarb Qarn at Tarb Qarn al Tarab,Qarn at Tarb 24.45094 55.67408 T HLL AE 01 0 306 Asia/Dubai 2011-11-06 +290687 Ţaraq Taraq Taraq,Tereg,Ţaraq 23.11656 53.60697 P PPL AE 01 0 181 Asia/Dubai 2011-11-06 +290688 Ţarāhīf Tarahif Tarahif,Ţarāhīf 22.91769 53.33204 T DPR AE 01 0 179 Asia/Dubai 2011-11-06 +290689 Wādī aţ Ţaraf Wadi at Taraf Wadi at Taraf,Wādī aţ Ţaraf 25.41486 56.32874 H WAD AE 04 0 69 Asia/Dubai 2011-11-06 +290690 Wādī Tarabat Wadi Tarabat Wadi Tarabat,Wādī Tarabat 24.10167 55.71444 H WAD AE 01 0 235 Asia/Dubai 2011-11-06 +290691 Tall Fāḩah Tall Fahah Tall Fahah,Tall Fāḩah 23.95216 52.35299 L LCTY AE 01 0 14 Asia/Dubai 2011-11-06 +290692 Ḩadd aţ Ţallah Hadd at Tallah Hadd al Tahlei,Hadd at Tahli,Hadd at Tallah,Hadd at Thalei,Ḩadd at Tahlī,Ḩadd aţ Ţallah 24.66667 54.55 H SHOL AE AE 01 0 -9999 Asia/Dubai 2011-11-06 +290693 Dawḩat Tallah Dawhat Tallah Dawhat Tallah,Dawhat Tullah,Dawḩat Tallah,Dawḩat Tullah 24.42605 51.3286 H BGHT AE 01 0 1 Asia/Dubai 2011-11-06 +290694 Dawḩat Ţallāb Dawhat Tallab Dawhat Talab,Dawhat Tallab,Dawhat an Nakhlah,Dawḩat an Nakhlah,Dawḩat Ţalab,Dawḩat Ţallāb,Dohat Tallab,Dohat Tullab,Dohat Tullāb,Dohat an Nakhala,Dohat Ṭallāb,Duhat an Nakhalah 24.2708 51.64849 H BAY AE 01 0 -9999 Asia/Dubai 2011-11-06 +290695 Sydney Hill Sydney Hill Sydney Hill 24.33333 52.6 T HLL AE 01 0 124 Asia/Dubai 2011-11-06 +290696 Naqā Suwayţah Naqa Suwaytah Naqa Suwaytah,Naqā Suwayţah 24.34939 55.59034 T DUNE AE 01 0 247 Asia/Dubai 2011-11-06 +290697 Ţawī Suwayḩān Tawi Suwayhan Tawi Suwayhan,Ţawī Suwayḩān 24.43584 55.25248 H WLL AE 01 0 123 Asia/Dubai 2011-11-06 +290698 Sayḩ Suwayḩān Sayh Suwayhan Sayh Suwayhan,Sayḩ Suwayḩān 24.44981 55.28275 H WAD AE 01 0 158 Asia/Dubai 2011-11-06 +290699 Ramlat Suwayḩān Ramlat Suwayhan Ramlat Suwaihan,Ramlat Suwayhan,Ramlat Suwayḩān 24.46087 55.26387 T DUNE AE 01 0 149 Asia/Dubai 2011-11-06 +290700 Ra’s Suwayfah Ra's Suwayfah Ra's Suwayfah,Ra’s Suwayfah 25.59594 56.35239 T PT AE 04 0 -9999 Asia/Dubai 2011-11-06 +290701 Farīq Suwayfah Fariq Suwayfah Fariq Suwayfah,Farīq Suwayfah 25.59256 56.34525 S CMP AE 04 0 60 Asia/Dubai 2011-11-06 +290702 Suwayfah Suwayfah Suwayfah 25.59043 56.36261 L LCTY AE 04 0 -9999 Asia/Dubai 2011-11-06 +290703 Suwaydān Suwaydan Suwaydan,Suwaydān 25.12436 55.7975 L AREA AE 06 0 138 Asia/Dubai 2011-11-06 +290704 Wādī Suwaydā’ Wadi Suwayda' Wadi Suwayda',Wādī Suwaydā’ 24.45696 55.54523 T TRGD AE 01 0 261 Asia/Dubai 2011-11-06 +290705 Ţawī Suwaydā’ Tawi Suwayda' Tawi Suwayda',Ţawī Suwaydā’ 25.14194 55.29972 H WLL AE 03 0 24 Asia/Dubai 2011-11-06 +290706 Suwaydā’ Suwayda' Suwaida,Suwayda',Suwaydā’ 25.11667 55.3 L LCTY AE 03 0 6 Asia/Dubai 2011-11-06 +290707 Sut Sut Sut 23.71667 54.53333 H WLL AE 01 0 133 Asia/Dubai 2011-11-06 +290708 Surayţ Surayt Serait,Surayt,Surayţ 23.12132 53.95075 L OAS AE 01 0 94 Asia/Dubai 2011-11-06 +290709 Wādī Sūr Wadi Sur Wadi Sur,Wādī Sūr 25.08333 56.36667 H WAD AE 06 0 -9999 Asia/Dubai 2011-11-06 +290710 Şūr Sur Sur,Şūr 25.09406 56.34827 P PPL AE 06 0 23 Asia/Dubai 2011-11-06 +290711 Suqayyah Suqayyah Suqayyah 24.57218 55.55891 L LCTY AE 01 0 253 Asia/Dubai 2011-11-06 +290712 Sunayyim Sunayyim Sunayyim 23.96236 55.40653 T DUNE AE 01 0 145 Asia/Dubai 2011-11-06 +290713 Baḩr Sunayţ Bahr Sunayt Bahr Sunayt,Baḩr Sunayţ 25.61667 56.25 H WAD AE 00 0 7 Asia/Dubai 2011-11-06 +290714 Sumbrair Sumbrair Sumbrair,Sumbrayir,Şumbrayir 25.60082 56.2844 P PPL AE 04 0 21 Asia/Dubai 2011-11-06 +290715 Ra’s Sumayrah Ra's Sumayrah Ra's Sumayrah,Ras Semaira,Ras Sumaira,Ra’s Sumayrah,Rās Semaira 24.32243 51.44653 T PT AE 01 0 -9999 Asia/Dubai 2011-11-06 +290716 Imshāsh as Sumayrah Imshash as Sumayrah Imshash Semaira,Imshash al-Semeirah,Imshash as Sumayrah,Imshāsh Semaira,Imshāsh al-Semeirah,Imshāsh as Sumayrah,Tawi Sumayrah,Ţawī Sumayrah 24.27873 51.42068 H WLL AE 01 0 51 Asia/Dubai 2011-11-06 +290717 Dawḩat as Sumayrah Dawhat as Sumayrah Al Sumaira,Dawhat as Sumayrah,Dawḩat as Sumayrah 24.31884 51.54839 H BAY AE 01 0 -9999 Asia/Dubai 2011-11-06 +290718 Sayḩ as Sumayḩ Sayh as Sumayh Sayh as Sumayh,Sayḩ as Sumayḩ,Sih al-Semeih,Sih as Semeih,Sih as Sumayh,Sumayh,Sumayḩ,Sīḥ al-Semeiḥ,Sīḩ as Sumayḩ 24.7278 54.78697 T TRGD AE 01 0 16 Asia/Dubai 2011-11-06 +290719 Birkat Sumayḩ Birkat Sumayh Birkat Sumaih,Birkat Sumayh,Birkat Sumayḩ,Samaih,Semaih,Smeih 24.72276 54.77993 H WLL AE 01 0 18 Asia/Dubai 2011-11-06 +290720 Ţawī Sulţān Sālim Tawi Sultan Salim Tawi Sultan Salim,Ţawī Sulţān Sālim 25.02181 55.8195 H WLL AE 06 0 170 Asia/Dubai 2011-11-06 +290721 Jazīrat aş Şīlīyā Jazirat as Siliya Jazirat Sulayyah,Jazirat as Siliya,Jazīrat aş Şīlīyā,Jazīrat Şulayyah 24.18286 52.8921 T ISL AE 01 0 -9999 Asia/Dubai 2011-11-06 +290722 Ţawī Sulaymāt Tawi Sulaymat Al-Seleimat,Al-Seleimāt,Tawi Sulaymat,Tawi Suleimat,Tāwī Suleimat,Ţawī Sulaymāt 24.23064 55.59382 H WLL AE 01 0 251 Asia/Dubai 2011-11-06 +290723 Sayḩ Sulaymāt Sayh Sulaymat Sayh Sulaymat,Sayḩ Sulaymāt 24.19639 55.56278 T TRGD AE 01 0 224 Asia/Dubai 2011-11-06 +290724 Sayḩ Sulaymān Sayh Sulayman Sayh Sulayman,Sayḩ Sulaymān 24.67704 55.47051 T TRGD AE 03 0 149 Asia/Dubai 2011-11-06 +290725 Ḩadabat Sukhub Hadabat Sukhub Hadabat Sakhub,Hadabat Sukhub,Ḩadabat Sakhub,Ḩadabat Sukhub 24.82094 55.53095 T DUNE AE 03 0 157 Asia/Dubai 2011-11-06 +290726 Ţawī Suhaylah Tawi Suhaylah Tawi Saheila,Tawi Suhaylah,Tawi Suheila,Tāwī Saheila,Tāwī Suheila,Ţawī Suhaylah 25.36667 55.95 H WLL AE 07 0 184 Asia/Dubai 2011-11-06 +290727 Suḩaybah Suhaybah Suhaybah,Suḩaybah 24.93877 56.15754 P PPL AE 05 0 351 Asia/Dubai 2011-11-06 +290728 Wādī Suftah Wadi Suftah Wadi Suftah,Wādī Suftah 25.46364 56.11519 H WAD AE 05 0 297 Asia/Dubai 2011-11-06 +290729 Şufayrī Sufayri Sufayri,Şufayrī 24.81168 56.12646 P PPL AE 02 0 309 Asia/Dubai 2011-11-06 +290730 Sayḩ Şubrah Sayh Subrah Sayh Subrah,Sayḩ Şubrah 24.05023 55.49348 T TRGD AE 01 0 196 Asia/Dubai 2011-11-06 +290731 ‘Aqabat as Subaykhah `Aqabat as Subaykhah `Aqabat as Subaykhah,‘Aqabat as Subaykhah 25.5763 56.33881 T PASS AE 04 0 35 Asia/Dubai 2011-11-06 +290732 Subaykhah Subaykhah Subaykhah 25.5695 56.33907 L LCTY AE 04 0 256 Asia/Dubai 2011-11-06 +290733 Subayḩīyah Subayhiyah Subayhiyah,Subayḩīyah 25.40028 56.36417 V CULT AE 06 0 -9999 Asia/Dubai 2011-11-06 +290734 Stutter Shoal Stutter Shoal Stutter Shoal 24.23777 52.42787 H SHOL AE 01 0 -9999 Asia/Dubai 2011-11-06 +290735 Stokes Bluff Stokes Bluff Stokes Bluff 24.3 52.63333 T CLF AE 01 0 6 Asia/Dubai 2011-11-06 +290736 Mount Stewart Mount Stewart Mount Stewart 24.33288 52.59674 T HLL AE 01 0 60 Asia/Dubai 2011-11-06 +290737 South Yāsāt Channel South Yasat Channel South Yasat Channel,South Yāsāt Channel 24.13797 51.98182 H CHNM AE 01 0 -9999 Asia/Dubai 2011-11-06 +290738 South Faraydat South Faraydat Faraijdat,Fereijid,South Faraydat,South Furayjidat,South Furayjidāt 24.38333 51.71667 T ISL AE 01 0 -9999 Asia/Dubai 2011-11-06 +290740 Ţawī Sirrah Tawi Sirrah Tawi Sirra,Tawi Sirrah,Tāwī Sirra,Ţawī Sirrah 25.45114 55.61266 H WLL AE 07 0 31 Asia/Dubai 2011-11-06 +290741 Şīr Bū Nu‘ayr Sir Bu Nu`ayr Jazirat Siri Bu Naybar,Jazīrat Sīrī Bū Naybar,Jezirat Sir Bu Na`air,Jezirat Sir Bu Na‘air,Sir Abu Nu`air,Sir Abu Nu`ayr,Sir Abu Nu‘air,Sir Bu Nu`air,Sir Bu Nu`ayr,Sir bu Na`air Island,Sīr bu Na‘air Island,Şīr Abū Nu‘ayr,Şīr Bū Nu‘ayr,Ṣīr Bū Nu‘air 25.23305 54.2181 T ISL AE 01 0 15 Asia/Dubai 2011-11-06 +290742 Şīr Banī Yās Sir Bani Yas Al Yas,Al Yās,Jezirat Yas,Jezīrat Yas,Sir Bani Yas,Sir Banias,Sir Beni Yas,Yas Island,Şīr Banī Yās 24.32589 52.60128 T ISL AE 01 0 124 Asia/Dubai 2011-11-06 +290743 Sīrat al Khawr Sirat al Khawr Sirat al Khawr,Sīrat al Khawr 25.35326 56.37784 T ISL AE 04 0 -9999 Asia/Dubai 2011-11-06 +290744 Suwayfat aş Şīr Suwayfat as Sir Suwayfat as Sir,Suwayfat aş Şīr 25.5188 56.36949 T PT AE 04 0 -9999 Asia/Dubai 2011-11-06 +290746 Wādī Sinnah Wadi Sinnah Wadi Sinnah,Wādī Sinnah 25.50796 56.19523 H WAD AE 04 0 124 Asia/Dubai 2011-11-06 +290747 Sinnah Sinnah Sinnah 25.50868 56.16772 P PPL AE 04 0 198 Asia/Dubai 2011-11-06 +290748 Sinādil Sinadil Sinadil,Sinādil 24.81095 56.02511 P PPL AE 02 0 424 Asia/Dubai 2011-11-06 +290749 Nada Sima Nada Sima Nada Sima 24.18333 55.36667 T DUNE AE 01 0 198 Asia/Dubai 2011-11-06 +290750 Ra’s as Silmīyah Ra's as Silmiyah Ra's as Silmiyah,Ra’s as Silmīyah 24.25278 54.52889 T DUNE AE 01 0 8 Asia/Dubai 2011-11-06 +290751 Silmīyah Silmiyah Silmiya,Silmiyah,Silmīya,Silmīyah 24.2 54.35 T HLL AE AE 01 0 6 Asia/Dubai 2011-11-06 +290752 Silmīyah Silmiyah Al-Silaimiyyah,Silmiyah,Silmīyah 24.22404 54.46374 T DUNE AE 01 0 13 Asia/Dubai 2011-11-06 +290753 Sayḩ Silm Sayh Silm Sayh Silm,Sayḩ Silm 24.41779 55.31025 T TRGD AE 01 0 158 Asia/Dubai 2011-11-06 +290754 Jabal Silḩū Bilḩū Jabal Silhu Bilhu Jabal Silhu Bilhu,Jabal Silḩū Bilḩū 25.15146 56.06771 T MT AE 05 0 607 Asia/Dubai 2011-11-06 +290755 Ra’s as Sila‘ Ra's as Sila` Ra's as Sil`,Ra's as Sila`,Ra’s as Sila‘,Ra’s as Sil‘ 24.05 51.78333 T PT AE 01 0 1 Asia/Dubai 2011-11-06 +290756 Dawḩat as Sila‘ Dawhat as Sila` Dawhat as Sila`,Dawḩat as Sila‘ 23.96667 51.93333 H INLT AE 01 0 -9999 Asia/Dubai 2011-11-06 +290757 Wādī Sījī Wadi Siji Wadi Nakh,Wadi Siji,Wadi as Siji,Wādī Nakh,Wādī Sījī,Wādī as Sījī 25.2736 56.03543 H WAD AE 00 0 225 Asia/Dubai 2011-11-06 +290758 Jabal Sījī Jabal Siji Jabal Siji,Jabal Sījī 25.2436 56.12194 T MT AE 04 0 664 Asia/Dubai 2011-11-06 +290759 Tawi Siji Tawi Siji Siji,Sījī,Tawi Siji,Tawi as Siji,Ţawī as Sījī 25.24764 56.07719 P PPL AE 04 0 324 Asia/Dubai 2011-11-06 +290760 Wadi Saha Wadi Saha Wadi Saha,Wadi Siha',Wādī Şihā’ 25.3828 56.29541 H WAD AE 00 0 320 Asia/Dubai 2011-11-06 +290761 Jabal Şihā’ Jabal Siha' Jabal Siha',Jabal Şihā’ 25.33931 56.276 T MT AE 00 0 788 Asia/Dubai 2011-11-06 +290762 Wādī Sifūnī Wadi Sifuni Wadi Sifuni,Wādī Sifūnī 25.19333 56.01389 H WAD AE 05 0 189 Asia/Dubai 2011-11-06 +290763 Sayḩ as Sidrah Sayh as Sidrah Sayh Sadrah,Sayh as Sidrah,Sayḩ Sadrah,Sayḩ as Sidrah,Sidra,Sih as Sidrah,Sīḩ as Sidrah 24.81824 54.9264 T TRGD AE 01 0 31 Asia/Dubai 2011-11-06 +290764 Wādī Sidr Wadi Sidr Wadi Sidr,Wādī Sidr 25.42182 56.09854 H WAD AE 04 0 290 Asia/Dubai 2011-11-06 +290765 Jabal Sidr Jabal Sidr Jabal Sidr 25.36833 56.34 T HLL AE 06 0 11 Asia/Dubai 2011-11-06 +290766 Wādī Sadakh Wadi Sadakh Wadi Sadakh,Wadi Sidakh,Wādī Sadakh,Wādī Sidakh 25.56929 56.06399 H WAD AE 04 0 132 Asia/Dubai 2011-11-06 +290767 Sībat al Ashkharāt Sibat al Ashkharat Sibat al Ashkharat,Sībat al Ashkharāt 25.61667 56.26667 S CMTY AE 04 0 19 Asia/Dubai 2011-11-06 +290768 Wādī Shuway Wadi Shuway Wadi Shuway,Wadi Shuwayy,Wādī Shuway,Wādī Shuwayy 25.23142 56.20244 H WAD AE 04 0 233 Asia/Dubai 2011-11-06 +290769 Wādī Shuways Wadi Shuways Wadi Shuways,Wādī Shuways 25.18957 56.33323 H WAD AE 04 0 347 Asia/Dubai 2011-11-06 +290770 Jabal Shuways Jabal Shuways Jabal Shuways 25.17617 56.3459 T HLL AE 04 0 171 Asia/Dubai 2011-11-06 +290771 Al Quwayz Al Quwayz Al Quwayz,Chuwais,Kuways,Shuways 25.78102 55.9787 P PPLX AE 05 0 24 Asia/Dubai 2011-11-06 +290772 Jazīrat Shuwayhāt Jazirat Shuwayhat Jazirat Mashat,Jazirat Showayhat,Jazirat Shuwayhat,Jazīrat Mashat,Jazīrat Showayhāt,Jazīrat Shuwayhāt,Shuwaihat,Shuwaihāt,Shuweihat,Shuweihāt 24.11391 52.43972 T ISL AE 01 0 -9999 Asia/Dubai 2011-11-06 +290773 Bid‘ Shuwaybir Bid` Shuwaybir Bid` Shuwaybir,Bida` Shuwaibah,Bidau' Shuaibar,Bidau' Suaibar,Bidau’ Shuaibar,Bidau’ Suaibar,Bida‘ Shuwaibah,Bid‘ Shuwaybir,Budu` Shuaibar,Budu` Shuwaibir,Budu` Shuwaybir,Budu‘ Shuwaibir,Budū‘ Shuaibar,Budū‘ Shuwaybir,Shawaibir 24.0958 54.58919 H WLL AE 01 0 46 Asia/Dubai 2011-11-06 +290774 Shū Triyyah Shu Triyyah Shu Triyyah,Shū Triyyah 24.24938 54.29978 T ISL AE 01 0 -9999 Asia/Dubai 2011-11-06 +290775 Shuray‘ah Shuray`ah Shuray`ah,Shuray‘ah 24.3 53.61667 T ISL AE 01 0 -9999 Asia/Dubai 2011-11-06 +290776 Shunayyin Shunayyin Shunayyin 24.05604 54.46374 T SAND AE 01 0 39 Asia/Dubai 2011-11-06 +290777 Shunayyin Shunayyin Shunayyin 24.10632 54.39287 L LCTY AE 01 0 16 Asia/Dubai 2011-11-06 +290778 Shunayyin Shunayyin Shinaiyin,Shunaiyin,Shunayyin 24.21667 54.41667 T HLL AE AE 01 0 3 Asia/Dubai 2011-11-06 +290779 Buday‘ Shumrūkh Buday` Shumrukh Buday` Shumrukh,Buday‘ Shumrūkh,Shumrukh,Shumrūkh 24.77232 55.7849 H WLL AE 01 0 302 Asia/Dubai 2011-11-06 +290780 Sayḩ Shumayrīkh Sayh Shumayrikh Sayh Shumayrikh,Sayḩ Shumayrīkh 24.71557 55.4203 T TRGD AE 03 0 145 Asia/Dubai 2011-11-06 +290781 Shumaylīyah Shumayliyah Ash Shumailiya,Ash Shumailīya,Ash Shumayliyah,Ash Shumaylīyah,Shamailiya,Shamailiyah,Shamailīyah,Shamayliyah,Shamaylīyah,Shumailiyah,Shumayliyah,Shumaylīyah 25.33333 56.33333 L AREA AE AE 06 0 426 Asia/Dubai 2011-11-06 +290782 Jabal Shughayr Jabal Shughayr Jabal Shughayr 25.4 56.33333 T HLL AE 04 0 55 Asia/Dubai 2011-11-06 +290783 Ţawī Shubayşī Tawi Shubaysi Tawi Shubaysi,Ţawī Shubayşī 24.16278 55.05729 H WLL AE 01 0 120 Asia/Dubai 2011-11-06 +290784 Nadd ash Shibā Nadd ash Shiba Nad Shibeih,Nadd Shubayh,Nadd Shubayḩ,Nadd ash Shiba,Nadd ash Shibā 25.14583 55.33417 P PPL AE AE 03 0 23 Asia/Dubai 2011-11-06 +290785 Shu‘ayb ‘Ūd Shu`ayb `Ud Shu`ayb `Ud,Shu‘ayb ‘Ūd 24.74968 55.79034 V TREE AE 00 0 253 Asia/Dubai 2011-11-06 +290786 Shu‘ayb Şaghīr Shu`ayb Saghir Shu`ayb Saghir,Shu‘ayb Şaghīr 24.74944 55.82028 V TREE AE 01 0 311 Asia/Dubai 2011-11-06 +290787 Sayḩ Shu‘ayb Sayh Shu`ayb Sayh Shu`ayb,Sayh ash Shu`ayb,Sayḩ Shu‘ayb,Sayḩ ash Shu‘ayb,Shu`aib,Shu‘aib,Sih Shu`aib,Sīḩ Shu‘aib 24.89786 54.96311 T TRGD AE 00 0 17 Asia/Dubai 2011-11-06 +290788 Raml ash Shu‘ayb Raml ash Shu`ayb Raml ash Shu`ayb,Raml ash Shu‘ayb 24.8757 55.0429 T SAND AE 03 0 30 Asia/Dubai 2011-11-06 +290789 Shīshah Shishah Shisha,Shishah,Shīshah 24.33635 54.94465 T HLL AE 01 0 65 Asia/Dubai 2011-11-06 +290790 Wādī Shīşah Wadi Shisah Wadi Shisa,Wadi Shisah,Wādī Shīşah 25.84028 56.1 H WAD AE AE 05 0 321 Asia/Dubai 2011-11-06 +290791 Ramlat Shīşah Ramlat Shisah Ramlat Shisah,Ramlat Shīşah 25.38835 56.02995 T DUNE AE 04 0 304 Asia/Dubai 2011-11-06 +290792 Wādī Shīs Wadi Shis Wadi Shis,Wādī Shīs 25.29348 56.24396 H WAD AE 06 0 408 Asia/Dubai 2011-11-06 +290793 Shīs Shis Shis,Shīs 25.29138 56.24549 P PPL AE 06 0 365 Asia/Dubai 2011-11-06 +290794 Wādī Shimāl Wadi Shimal Wadi Shimal,Wādī Shimāl 25.50089 56.18876 H WAD AE 04 0 158 Asia/Dubai 2011-11-06 +290795 Shimāl Shimal Shimal,Shimil,Shimāl 25.8178 56.01088 P PPL AE 05 0 19 Asia/Dubai 2011-11-06 +290796 Khaţmat ash Shiklah Khatmat ash Shiklah Khaim ash Shikla,Khatm al-Shiklah,Khatmat ash Shiklah,Khaţmat ash Shiklah,Khaṭm al-Shiklah 24.21583 55.95306 T SPUR AE AE 01 0 392 Asia/Dubai 2011-11-06 +290797 Shidq al Kalb Shidq al Kalb Shidq al Kalb,Shudeg al-Kalb,Shudq al Kalb 23.13385 53.73315 L OAS AE 01 0 93 Asia/Dubai 2011-11-06 +290798 Wādī Shibḩāt Wadi Shibhat Wadi Shibhat,Wādī Shibḩāt 24.45849 55.7685 T TRGD AE 01 0 321 Asia/Dubai 2011-11-06 +290799 Shabahanat al Majann Shabahanat al Majann Ash Shibhanah,Shabahanat al Majann,Shibhanat al Mijann,Shibhānat al Mijann 24.01997 51.735 T PLAT AE 01 0 48 Asia/Dubai 2011-11-06 +290800 Shibānāt Shibanat Shibanat,Shibānāt 24.91667 55.66667 L TRB AE 00 0 190 Asia/Dubai 2011-11-06 +290801 Shi‘b al Ghāf Shi`b al Ghaf Shi`b al Ghaf,Shib al Gat,Shi‘b al Ghāf 24.05278 55.71972 P PPL AE 01 0 237 Asia/Dubai 2011-11-06 +290802 Shibāk Shibak Shibak,Shibāk 24.59856 55.52346 L LCTY AE 01 0 208 Asia/Dubai 2011-11-06 +290803 Jabal Shi‘āb ash Shaybah Jabal Shi`ab ash Shaybah Jabal Sha`ab ash Shaybah,Jabal Sha‘āb ash Shaybah,Jabal Shi`ab ash Shaybah,Jabal Shi‘āb ash Shaybah 25.40026 56.30431 T MT AE 04 0 410 Asia/Dubai 2011-11-06 +290804 Wādī Shī Wadi Shi Wadi Shi,Wādī Shī 25.34983 56.35746 H WAD AE 06 0 40 Asia/Dubai 2011-11-06 +290805 Shaykh ad Dimāth Shaykh ad Dimath Shaikh al Dimath,Shaykh ad Dimath,Shaykh ad Dimāth 24.01056 53.09528 L LCTY AE AE 01 0 29 Asia/Dubai 2011-11-06 +290806 Shaydad Bin Khanfūr Shaydad Bin Khanfur Shaydad Bin Khanfur,Shaydad Bin Khanfūr 24.6932 55.44164 T SAND AE 03 0 141 Asia/Dubai 2011-11-06 +290807 ‘Urūq ash Shaybah `Uruq ash Shaybah Uruq ash Shaibah,Uruq ash Sheibah,`Uruq ash Shaybah,‘Urūq ash Shaybah 22.35 54.91667 T DUNE AE 01 0 161 Asia/Dubai 2011-11-06 +290808 Sayḩ Shawyī Sayh Shawyi Sayh Shawyi,Sayḩ Shawyī 25.65293 56.01207 T PLN AE 05 0 17 Asia/Dubai 2011-11-06 +290809 Wādī Shawkah Wadi Shawkah Wadi Shaukha,Wadi Shawkah,Wādī Shawkah 25.26761 55.8668 H WAD AE 06 0 110 Asia/Dubai 2011-11-06 +290810 Ţawī Shawkah Tawi Shawkah Tawi Shawkah,Ţawī Shawkah 25.03056 56.10694 H WLL AE 05 0 699 Asia/Dubai 2011-11-06 +290811 Jabal Shawkah Jabal Shawkah Jabal Shauka,Jabal Shawkah 25.10014 56.04331 T HLL AE 05 0 442 Asia/Dubai 2011-11-06 +290812 Shawkah Shawkah Shauka,Shawkah,Shokah 25.1 56.03333 P PPL AE AE 05 0 283 Asia/Dubai 2011-11-06 +290813 Wādī Shawiyayn Wadi Shawiyayn Wadi Shawiyayn,Wādī Shawiyayn 25.27208 56.06068 H WAD AE 04 0 247 Asia/Dubai 2011-11-06 +290814 Shawīyah Shawiyah Shawiyah,Shawīyah 25.26792 56.08149 P PPL AE 04 0 304 Asia/Dubai 2011-11-06 +290815 Ţawī Shāţ Tawi Shat Tawi Shat,Ţawī Shāţ 24.48333 55.2 H WLLQ AE 01 0 139 Asia/Dubai 2011-11-06 +290816 Shāt Shat Shat,Shāt 24.48614 55.19806 T SAND AE 01 0 117 Asia/Dubai 2011-11-06 +290817 Sharqīyīn Sharqiyin Sharqiyan,Sharqiyin,Sharqīyīn 25.25 56.16667 L TRB AE AE 00 0 522 Asia/Dubai 2011-11-06 +290818 Ţawī Sharqān Tawi Sharqan Tawi Sharqan,Ţawī Sharqān 25.38333 55.4 H WLL AE 06 0 1 Asia/Dubai 2011-11-06 +290819 Jabal Sharmah Jabal Sharmah Jabal Sharmah 25.28406 56.12845 T MT AE 04 0 594 Asia/Dubai 2011-11-06 +290820 Sharm Sharm Sharam,Sharm 25.47078 56.35319 P PPL AE 04 0 14 Asia/Dubai 2011-11-06 +290821 Jabal Sharīyah Jabal Shariyah Jabal Shariyah,Jabal Sharīyah 25.29063 56.14987 T MT AE 04 0 415 Asia/Dubai 2011-11-06 +290822 Sharīyah Shariyah Shariyah,Sharīyah 25.1 56.03333 P PPL AE 05 0 283 Asia/Dubai 2011-11-06 +290823 Sharīyah Shariyah Shariyah,Sharīyah 24.81512 56.0986 P PPL AE 02 0 319 Asia/Dubai 2011-11-06 +290824 Khawr ash Shāriqah Khawr ash Shariqah Khawr ash Shariqah,Khawr ash Shāriqah,Khor Sharja,Khor Sharjah,Khor Shārja 25.33111 55.38222 H INLT AE AE 06 0 9 Asia/Dubai 2011-11-06 +290825 Sayḩ Sharbū Sayh Sharbu Sayh Sharbu,Sayḩ Sharbū 24.81667 55.41667 T TRGD AE 03 0 125 Asia/Dubai 2011-11-06 +290826 Raml Sharbū Raml Sharbu Raml Sharbu,Raml Sharbū 24.83333 55.41667 T SAND AE 03 0 130 Asia/Dubai 2011-11-06 +290827 Sharaf Tamī Sharaf Tami Sharaf Tami,Sharaf Tamī 23.62836 55.33692 T DUNE AE 01 0 207 Asia/Dubai 2011-11-06 +290828 Sharaf Sawqar Sharaf Sawqar Sharaf Sawqar 24.33333 55.7 L LCTY AE 01 0 275 Asia/Dubai 2011-11-06 +290829 Sharaf Mundassah Sharaf Mundassah Sharaf Mundassah 24.58472 55.73722 V TREE AE 01 0 308 Asia/Dubai 2011-11-06 +290830 Sharaf Jabārah Sharaf Jabarah Sharaf Jabara,Sharaf Jabarah,Sharaf Jabārah 24.62804 55.77334 L LCTY AE 01 0 337 Asia/Dubai 2011-11-06 +290831 Sharaf Ḩawrah Sharaf Hawrah Sharaf Hawrah,Sharaf Ḩawrah 24.54521 55.71675 T SAND AE 01 0 318 Asia/Dubai 2011-11-06 +290832 Sharaf Ḑabbah Sharaf Dabbah Sharaf Dabbah,Sharaf Ḑabbah 24.55321 55.65638 L LCTY AE 01 0 288 Asia/Dubai 2011-11-06 +290833 Sharaf Bin ‘Ubayd Sharaf Bin `Ubayd Sharaf Bin `Ubayd,Sharaf Bin ‘Ubayd 24.91667 55.4 L LCTY AE 03 0 100 Asia/Dubai 2011-11-06 +290834 Sharaf al ‘Afār Sharaf al `Afar Sharaf al `Afar,Sharaf al ‘Afār 24.9516 55.44056 L LCTY AE 03 0 85 Asia/Dubai 2011-11-06 +290835 Wādī Sharabāt Wadi Sharabat Wadi Sharabat,Wādī Sharabāt 24.88063 56.21317 H WAD AE 05 0 142 Asia/Dubai 2011-11-06 +290836 Jabal Sharab Jabal Sharab Jabal Sharab 25.0138 56.0337 T MT AE 05 0 664 Asia/Dubai 2011-11-06 +290837 Jabal Sha‘rā’ Jabal Sha`ra' Jabal Sha`arah,Jabal Sha`ra',Jabal Sha‘arah,Jabal Sha‘rā’ 24.06667 56.26667 T MT AE 01 0 995 Asia/Dubai 2011-11-06 +290838 Wādī Shaqq Wadi Shaqq Wadi Shaq,Wadi Shaqq,Wādī Shaqq 25.84389 56.02139 H WAD AE AE 05 0 26 Asia/Dubai 2011-11-06 +290839 Ţawī Shaqq Tawi Shaqq Tawi Shaqq,Ţawī Shaqq 24.38244 55.60894 H WLL AE 01 0 232 Asia/Dubai 2011-11-06 +290840 Ramlat Shanţūt Bin ‘Umān Ramlat Shantut Bin `Uman Ramlat Shantut Bin `Uman,Ramlat Shanţūt Bin ‘Umān 24.26667 55.4 T DUNE AE 01 0 195 Asia/Dubai 2011-11-06 +290841 Shanţūt Ibn ‘Umān Shantut Ibn `Uman Shantut Bin `Uman,Shantut Ibn `Uman,Shanţūt Bin ‘Umān,Shanţūt Ibn ‘Umān 24.25432 55.42166 T TRGD AE 01 0 183 Asia/Dubai 2011-11-06 +290842 Shanţūţ Shantut Shantut,Shanţūţ 23.38142 55.30225 T DUNE AE 01 0 154 Asia/Dubai 2011-11-06 +290843 Shantuba Shantuba Shantuba 24.54867 55.73806 L LCTY AE 01 0 322 Asia/Dubai 2011-11-06 +290844 Ra’s Shandaghah Ra's Shandaghah Ra's Shandaghah,Ra’s Shandaghah 25.26667 55.28333 T PT AE 03 0 -9999 Asia/Dubai 2011-11-06 +290845 Shandaghah Shandaghah Shandaghah 25.25833 55.28333 P PPLX AE 03 0 9 Asia/Dubai 2011-11-06 +290846 ‘Araj Shamsī `Araj Shamsi `Araj Shamsi,‘Araj Shamsī 24.18944 54.70361 T DPR AE 01 0 51 Asia/Dubai 2011-11-06 +290847 Shammāmīyah Shammamiyah Shammamiyah,Shammāmīyah 23.06374 53.68898 T DPR AE 01 0 76 Asia/Dubai 2011-11-06 +290848 Shāmis Shamis Shamis,Shams,Shāmis 23.93333 53.7 L GASF AE AE 01 0 21 Asia/Dubai 2011-11-06 +290849 Shāmis Shamis Shamis,Shāmis 23.93854 53.69593 S FCL AE 01 0 41 Asia/Dubai 2011-11-06 +290851 Wādī ash Shāmah Wadi ash Shamah Wadi ash Shamah,Wādī ash Shāmah 25.41592 56.33835 H WAD AE 00 0 36 Asia/Dubai 2011-11-06 +290852 Wādī ash Sha‘m Wadi ash Sha`m Wadi ash Sha`m,Wādī ash Sha‘m 26.03111 56.0975 H WAD AE 05 0 143 Asia/Dubai 2011-11-06 +290853 Wādī ash Shāl Wadi ash Shal Wadi ash Shal,Wādī ash Shāl 25.38365 55.95383 H WAD AE 07 0 155 Asia/Dubai 2011-11-06 +290854 Wādī Shakhkh Wadi Shakhkh Wadi Shakh,Wadi Shakhkh,Wādī Shakh,Wādī Shakhkh 25.58769 56.14287 H WAD AE 04 0 228 Asia/Dubai 2011-11-06 +290855 Haḑbat Shakhbūţ Hadbat Shakhbut Hadbat Shakhbut,Haḑbat Shakhbūţ 24.29583 54.65722 T HLL AE 01 0 27 Asia/Dubai 2011-11-06 +290856 Shaitham Shaitham Shaitham,Shaithan,Shaithān 24.29326 54.85926 H WLL AE 01 0 71 Asia/Dubai 2011-11-06 +290857 Sayḩ Sha‘īl Sayh Sha`il Sayh Sha`il,Sayḩ Sha‘īl 24.68333 55.45 T TRGD AE 03 0 160 Asia/Dubai 2011-11-06 +290858 Qarn Shā’i‘ Qarn Sha'i` Qarn Sha'i`,Qarn Shā’i‘ 23.83933 53.28344 T HLL AE 01 0 91 Asia/Dubai 2011-11-06 +290859 Ţawī Shāhīn Tawi Shahin Tawi Shahin,Ţawī Shāhīn 25.61667 55.88333 H WLL AE 05 0 93 Asia/Dubai 2011-11-06 +290860 Shahawāt Shahawat Sahawat,Shahawat,Shahawāt 25.96667 56.08333 P PPL AE AE 05 0 18 Asia/Dubai 2011-11-06 +290861 Shahā’irah Shaha'irah Shaha'irah,Shahā’irah 25.38333 56.13333 L TRB AE 05 0 501 Asia/Dubai 2011-11-06 +290862 Wādī Shāh Wadi Shah Wadi Shah,Wādī Shāh 25.82949 56.10949 H WAD AE 05 0 202 Asia/Dubai 2011-11-06 +290863 Shāh Shah Shah,Shāh 23.13561 53.91652 P PPL AE 01 0 170 Asia/Dubai 2011-11-06 +290864 Shāh Shah Shah,Shāh 22.85 53.91667 L OILF AE 01 0 170 Asia/Dubai 2011-11-06 +290865 Shāh Shah Shah,Shāh 23.13333 53.91667 T DPR AE 01 0 158 Asia/Dubai 2011-11-06 +290866 Shāh Shah Shah,Shāh 25.89861 56.12833 P PPL AE 05 0 715 Asia/Dubai 2011-11-06 +290867 Shabqatayn Shabqatayn Shabqatayn 23.91665 55.20997 T DUNE AE 01 0 178 Asia/Dubai 2011-11-06 +290868 Sha‘bīyah Sha`biyah Sha`biya,Sha`biyah,Sha‘biya,Sha‘bīyah 24.28333 54.48333 T HLL AE 01 0 12 Asia/Dubai 2011-11-06 +290869 Shabakah Shabakah Shabakah 25.03333 56 P PPL AE 05 0 322 Asia/Dubai 2011-11-06 +290870 Wādī Shabak Wadi Shabak Wadi Shabak,Wādī Shabak 25.15157 55.45444 T TRGD AE 03 0 22 Asia/Dubai 2011-11-06 +290871 Bid‘ Shabaan Bid` Shabaan Bid` Shabaan,Bid‘ Shabaan 23.35 54.36667 H WLL AE 01 0 133 Asia/Dubai 2011-11-06 +290872 Sha‘athān Sha`athan Sha`athan,Sha‘athān 24.27375 54.91292 T SAND AE 01 0 73 Asia/Dubai 2011-11-06 +290873 Wādī Sha‘arah Wadi Sha`arah Wadi Sha`arah,Wadi Sha`areh,Wādī Sha‘arah,Wādī Sha‘areh 25.06667 56.36667 H WAD AE 06 0 -9999 Asia/Dubai 2011-11-06 +290874 Sayyidah Sayyidah Sayyidah 24.6884 55.70747 V TREE AE 01 0 281 Asia/Dubai 2011-11-06 +290875 Ramlat Sayyid Ramlat Sayyid Ramlat Saiyin,Ramlat Sayyid,Ramle Sayyid 24.39496 55.60754 T DUNE AE 01 0 304 Asia/Dubai 2011-11-06 +290876 Wādī Sayraq Wadi Sayraq Wadi Sayraq,Wādī Sayraq 25.56185 56.05472 H WAD AE 04 0 127 Asia/Dubai 2011-11-06 +290877 Sayḩ Maḩārī Sayh Mahari Sayh Mahari,Sayḩ Maḩārī 25.38333 55.73333 T DUNE AE 06 0 51 Asia/Dubai 2011-11-06 +290878 Sayḩ aş Şaqlah Sayh as Saqlah Sayh as Saqlah,Sayḩ aş Şaqlah 24.88398 56.16847 P PPL AE 05 0 195 Asia/Dubai 2011-11-06 +290879 Sayḩ al Ḩalamah Sayh al Halamah Sayh al Halamah,Sayh al Halmah,Sayḩ al Ḩalamah,Sayḩ al Ḩalmah 24.25409 54.6919 T DPR AE 01 0 22 Asia/Dubai 2011-11-06 +290880 Sayḩ Sayh Sayh,Sayḩ 25.93333 56.06667 P PPL AE 05 0 196 Asia/Dubai 2011-11-06 +290881 Ţawī Sayfilman Tawi Sayfilman Tawi Sayfilman,Ţawī Sayfilman 23.6 54.6 H WLL AE 01 0 113 Asia/Dubai 2011-11-06 +290882 Ţawī Sayf Tawi Sayf Tawi Sayf,Ţawī Sayf 25.33472 55.81056 H WLL AE 06 0 79 Asia/Dubai 2011-11-06 +290883 Bid‘ Sayf Bid` Sayf Bid` Sayf,Bid‘ Sayf 25.06667 55.58333 H WLL AE 03 0 107 Asia/Dubai 2011-11-06 +290884 Bid‘ Sayf Bid` Sayf Bid` Sayf,Bid‘ Sayf 23.9195 54.93082 T DPR AE 01 0 105 Asia/Dubai 2011-11-06 +290885 Barqat Sayf Barqat Sayf Barqat Sayf,Burga Seif,Burqat Sayf 24.29874 52.58478 T HLL AE 01 0 34 Asia/Dubai 2011-11-06 +290886 Barqat Sayf Barqat Sayf Barqat Sayf 24.03307 53.27185 T HLL AE 01 0 14 Asia/Dubai 2011-11-06 +290887 Wādī Saybitalmā Wadi Saybitalma Wadi Saybitalma,Wādī Saybitalmā 25.23589 56.13664 H WAD AE 05 0 437 Asia/Dubai 2011-11-06 +290888 Naqā Sawţah Naqa Sawtah Naqa Sawtah,Naqā Sawţah 24.26611 55.55694 T DUNE AE 01 0 197 Asia/Dubai 2011-11-06 +290889 Jabal Sawdā’ Jabal Sawda' Jaba Sawda',Jaba Sawdā’,Jabal Sawda',Jabal Sawdā’ 25.20083 56.33993 T HLL AE 04 0 377 Asia/Dubai 2011-11-06 +290890 Ra’s Abyaḑ Qaţā Ra's Abyad Qata Ra's Abyad Qata,Ra's Sawami`,Ra’s Abyaḑ Qaţā,Ra’s Şawāmi‘ 24.14785 53.20015 T PT AE 01 0 -9999 Asia/Dubai 2011-11-06 +290891 Jabal Sāţif Jabal Satif Jabal Satif,Jabal Sāţif 25.49887 56.04789 T MT AE 04 0 374 Asia/Dubai 2011-11-06 +290892 Saţḩ ar Rāzbūt Sath ar Razbut Saath al Raazboot,Satah,Sath ar Razbut,Saţḩ ar Rāzbūt 24.83333 53.16667 L OILF AE AE 01 0 -9999 Asia/Dubai 2011-11-06 +290893 Sarūq Zāhir Saruq Zahir Saruq Zahir,Sarūq Zāhir 24.21007 54.69939 H SBKH AE 01 0 32 Asia/Dubai 2011-11-06 +290894 Sarūq al Jasam Saruq al Jasam Saruq al Jasam,Sarūq al Jasam 24.55 55.43333 T DUNE AE 01 0 181 Asia/Dubai 2011-11-06 +290895 Sārūq Saruq Saruq,Sārūq 23.04905 53.73279 T DPR AE 01 0 75 Asia/Dubai 2011-11-06 +290896 Sarūj Saruj Saruj,Sarūj 25.26636 56.30934 P PPL AE 00 0 386 Asia/Dubai 2011-11-06 +290897 Sarūb Sarub Sarub,Sarūb 23.07561 53.69655 T DPR AE 01 0 164 Asia/Dubai 2011-11-06 +290898 Sayḩ Şarm Sayf Sayh Sarm Sayf Sayh Sarm Sayf,Sayḩ Şarm Sayf 23.68333 55.48333 T DPR AE 01 0 183 Asia/Dubai 2011-11-06 +290899 Ţawī Şarmā’ Tawi Sarma' Tawi Saramin,Tawi Sarma',Tawi Sarmah,Ţawī Şaramin,Ţawī Şarmah,Ţawī Şarmā’ 24.98018 55.88064 H WLL AE 06 0 203 Asia/Dubai 2011-11-06 +290900 Wuqnat Sarīj Wuqnat Sarij Wuqnat Sarij,Wuqnat Sarīj 22.97483 53.77287 T DPR AE 01 0 55 Asia/Dubai 2011-11-06 +290901 Sarāmī Sarami Sarami,Sarāmī 24.1 54.51667 T HLL AE 01 0 33 Asia/Dubai 2011-11-06 +290902 Ţawī Şaram Tawi Saram Sarm,Tawi Saram,Şarm,Ţawī Şaram 25.4925 56.02583 H WLL AE AE 05 0 114 Asia/Dubai 2011-11-06 +290903 Ra’s Sarab Ra's Sarab Ra's Sarab,Ras as-Sareb,Ra’s Sarab,Rās as-Sareb 24.26252 51.78124 T PT AE 01 0 17 Asia/Dubai 2011-11-06 +290904 Şaqwān Saqwan Saqwan,Şaqwān 23.76608 53.49031 L GVL AE 01 0 105 Asia/Dubai 2011-11-06 +290905 Mīnā’ Şaqr Mina' Saqr Mina Saqr Harbour,Mina' Saqr,Mīnā’ Şaqr,Port Saqr 25.79167 55.95333 H HBR AE 05 0 -9999 Asia/Dubai 2011-11-06 +290906 Wādī Saqamqam Wadi Saqamqam Wadi Saqamqam,Wādī Saqamqam 25.16667 56.33333 H WAD AE 04 0 160 Asia/Dubai 2011-11-06 +290907 Sabkhat Saqamqam Sabkhat Saqamqam Sabkhat Saqamqam 25.15839 56.35618 H SBKH AE 04 0 16 Asia/Dubai 2011-11-06 +290908 Jabal Saqamqam Jabal Saqamqam Jabal Sakamkam,Jabal Saqamqam 25.18982 56.31074 T RDGE AE 04 0 145 Asia/Dubai 2011-11-06 +290909 Saqamqam Saqamqam As Saqamqam,Sakamkam,Saqamqam 25.17467 56.33039 P PPL AE 04 0 160 Asia/Dubai 2011-11-06 +290910 Saqal Saqal Saqal 25.27976 56.1859 V GRVP AE 05 0 386 Asia/Dubai 2011-11-06 +290911 Dawḩat Şāniyah Dawhat Saniyah Dawhat Saniyah,Dawḩat Şāniyah 24.15343 51.77192 H COVE AE 01 0 1 Asia/Dubai 2011-11-06 +290912 Khabrat Sanad Khabrat Sanad Khabrat Sanad 24.08333 51.7 H WLL AE 01 0 7 Asia/Dubai 2011-11-06 +290913 Sanad Sanad Sanad 24.1 51.7 L LCTY AE 01 0 14 Asia/Dubai 2011-11-06 +290914 Wādī Sanābil Wadi Sanabil Wadi Sanabil,Wādī Sanābil 24.66808 55.55881 T TRGD AE 00 0 221 Asia/Dubai 2011-11-06 +290915 Samnān Samnan Samnan,Samnān 25.3 55.45 L LCTY AE 00 0 13 Asia/Dubai 2011-11-06 +290916 Ţawī Samḩān Tawi Samhan Tawi Samhan,Tawi Semhan,Tawi Simhan,Ţawī Samḩān 24.82866 55.44335 H WLL AE 03 0 122 Asia/Dubai 2011-11-06 +290917 Raml Samḩān Raml Samhan Raml Samhan,Raml Samḩān 24.83333 55.46667 T SAND AE 03 0 129 Asia/Dubai 2011-11-06 +290918 Samḩān Samhan Al Irma,Samhan,Samḩān,Semhan 24.83333 55.46667 T HLL AE AE 03 0 129 Asia/Dubai 2011-11-06 +290919 Ţawī Samḩā’ Tawi Samha' Tawi Samha',Ţawī Samḩā’ 25.56444 55.82694 H WLL AE 07 0 46 Asia/Dubai 2011-11-06 +290920 Samarat Samarat Samarat 25.68907 56.13698 P PPL AE 01 0 1211 Asia/Dubai 2011-11-06 +290921 Sayh Samarah Sayh Samarah Sayh Samarah 24.21929 55.43518 T TRGD AE 01 0 205 Asia/Dubai 2011-11-06 +290922 Wādī Samāḩ Wadi Samah Wadi Samah,Wādī Samāḩ 25.44621 55.98338 H WAD AE 05 0 125 Asia/Dubai 2011-11-06 +290923 Jabal Samāḩ Jabal Samah Jabal Samah,Jabal Samāḩ 25.12605 56.17094 T MT AE 00 0 954 Asia/Dubai 2011-11-06 +290924 Jabal Samāḩ Jabal Samah Jabal Samah,Jabal Samāḩ 25.4165 55.96082 T DUNE AE 05 0 204 Asia/Dubai 2011-11-06 +290925 Samāḩ Samah Samah,Samāḩ 24.91667 56.3 L TRB AE 00 0 108 Asia/Dubai 2011-11-06 +290926 Salwá Salwa Salwa,Salwah,Salwá,Sawa,Sawá 25.02031 55.14772 L LCTY AE 03 0 20 Asia/Dubai 2011-11-06 +290927 Sayḩ Salmá Sayh Salma Sayh Salma,Sayḩ Salmá 24.16132 55.4748 T TRGD AE 01 0 237 Asia/Dubai 2011-11-06 +290928 Raml as Salmá Raml as Salma Raml as Salma,Raml as Salmá 24.16667 55.48333 T DUNE AE 01 0 243 Asia/Dubai 2011-11-06 +290929 Sayḩ as Salm Sayh as Salm Sayh as Salam,Sayh as Salm,Sayḩ as Salam,Sayḩ as Salm 24.83631 55.29693 T TRGD AE 03 0 88 Asia/Dubai 2011-11-06 +290930 Raml as Salm Raml as Salm Raml as Salam,Raml as Salm 24.85099 55.25704 T DUNE AE 03 0 55 Asia/Dubai 2011-11-06 +290931 Wādī Sallah Wadi Sallah Wadi Sallah,Wādī Sallah 24.56329 55.64776 T TRGD AE 01 0 279 Asia/Dubai 2011-11-06 +290932 Sayḩ Sallah Sayh Sallah Sayh Sallah,Sayḩ Sallah 23.93198 55.47704 T TRGD AE 01 0 186 Asia/Dubai 2011-11-06 +290933 Sallah Sallah Sallah 24.57314 55.61947 L LCTY AE 01 0 250 Asia/Dubai 2011-11-06 +290934 Wādī Sall Wadi Sall Wadi Sal,Wadi Sall,Wādī Sal,Wādī Sall 25.84083 56.06722 H WAD AE AE 05 0 75 Asia/Dubai 2011-11-06 +290935 Jabal Sall Jabal Sall Jabal Sal,Jabal Sall 25.76028 56.08861 T MT AE AE 05 0 799 Asia/Dubai 2011-11-06 +290936 Sall Sall Sal,Sall 25.74903 56.09217 V CULT AE 05 0 563 Asia/Dubai 2011-11-06 +290937 Falaj as Salj Falaj as Salj Falaj as Salj 25.44825 55.98449 H STMI AE 05 0 125 Asia/Dubai 2011-11-06 +290938 Wādī Salīmah Wadi Salimah Wadi Salimah,Wadi Salum,Wādī Salīmah,Wādī Salūm 24.72335 55.66265 T TRGD AE 00 0 244 Asia/Dubai 2011-11-06 +290939 Shu‘bat Salīmah Shu`bat Salimah Shu`bat Salimah,Shu`bat Silima,Shu‘bat Salīmah,Shu‘bat Silima 24.0475 55.83278 H WAD AE 01 0 324 Asia/Dubai 2011-11-06 +290940 Baţn Salīmah Batn Salimah Batn Salima,Batn Salimah,Baţn Salima,Baţn Salīmah 24.91893 55.54126 T DPR AE 03 0 166 Asia/Dubai 2011-11-06 +290941 Salīmah Salimah Saleema,Salimah,Salīmah 22.9118 54.3397 T DPR AE 01 0 164 Asia/Dubai 2011-11-06 +290942 Ţawī Salīm Tawi Salim Tawi Salim,Ţawī Salīm 25.33896 55.82837 H WLL AE 07 0 79 Asia/Dubai 2011-11-06 +290943 Sayḩ Salīl Sayh Salil Madiq al-Salil,Maḍīq al-Salīl,Sayh Salil,Sayḩ Salīl,Sih Salil 23.13333 55.41667 T TRGD AE 00 0 120 Asia/Dubai 2011-11-06 +290944 Şāliḩīyah Salihiyah As Salihiyah,Aş Şāliḩīyah,Salihiyah,Şāliḩīyah 25.72161 55.99081 P PPL AE 05 0 21 Asia/Dubai 2011-11-06 +290945 Saleh Saleh Saleh,Salih,Şāliḩ 26.13333 55.75 L OILF AE 01 0 -9999 Asia/Dubai 2011-11-06 +290946 Jabal Salḩāl Jabal Salhal Jabal Salhal,Jabal Salḩāl 25.25969 56.18567 T MT AE 05 0 634 Asia/Dubai 2011-11-06 +290947 Salbūk Salbuk Salbuk,Salbūk 23.87316 53.76852 T DUNE AE 01 0 55 Asia/Dubai 2011-11-06 +290948 Salān Khalfān Salan Khalfan Salan Khalfan,Salān Khalfān 23.93776 53.52864 T DUNE AE 01 0 43 Asia/Dubai 2011-11-06 +290949 Sabkhat as Salamīyah Sabkhat as Salamiyah As Salamiyah Sabkhat,Sabkhat as Salamiyah,Sabkhat as Salamīyah 23.99347 53.76611 H SBKH AE 01 0 12 Asia/Dubai 2011-11-06 +290950 Salām Salam Salam,Salām 25.66583 55.8525 H WLL AE 07 0 66 Asia/Dubai 2011-11-06 +290951 Sabkhat Salal Sabkhat Salal Sabkhat Salal,Sabkhat Salil,Sabkhat Salīl 23.74706 55.12282 H SBKH AE 01 0 103 Asia/Dubai 2011-11-06 +290952 Salala Salala As Salahah,Aş Şalāḩah,Salahah,Salala,Şalāḩah 24.1955 53.53829 T ISL AE 01 0 -9999 Asia/Dubai 2011-11-06 +290953 Bid‘ Salaal Bid` Salaal Bid` Salaal,Bid‘ Salaal 23.9 54.7 H WLL AE 01 0 90 Asia/Dubai 2011-11-06 +290954 Sala Sala Sala 24.16667 55.4 T DUNE AE 01 0 198 Asia/Dubai 2011-11-06 +290955 Jabal Sakhbīrī Jabal Sakhbiri Jabal Sakhbiri,Jabal Sakhbīrī 25.10639 56.03417 T HLL AE 05 0 366 Asia/Dubai 2011-11-06 +290956 Sā’if Sa'if Sa'if,Sā’if 25.1842 56.24205 P PPL AE 04 0 415 Asia/Dubai 2011-11-06 +290957 Ţawī Sa‘īdī Tawi Sa`idi Tawi Sa`idi,Tawi Zaid,Tawi Zayd,Ţawī Sa‘īdī,Ţawī Zayd,Ţāwī Zaid 25.54241 55.89153 H WLL AE 05 0 26 Asia/Dubai 2011-11-06 +290958 Ţawī Sa‘īd Bin Huwaydān Tawi Sa`id Bin Huwaydan Tawi Sa`id Bin Huwaydan,Ţawī Sa‘īd Bin Huwaydān 24.97961 55.78755 H WLL AE 06 0 172 Asia/Dubai 2011-11-06 +290959 Bid‘ Sa‘īd Bid` Sa`id Bada Sa`id,Bada Sa‘īd,Bid` Sa`id,Bid‘ Sa‘īd 23.65747 52.49121 H WLL AE 01 0 68 Asia/Dubai 2011-11-06 +290960 Sā’ibah Sa'ibah Sa'iba,Sa'ibah,Sa’iba,Sā’ibah 22.95698 54.27151 T DPR AE 01 0 98 Asia/Dubai 2011-11-06 +290961 Ghaffāt Saḩmī Ghaffat Sahmi Ghaffat Sahmi,Ghaffāt Saḩmī 24.5 55.26667 T DUNE AE 01 0 123 Asia/Dubai 2011-11-06 +290962 Sayḩ Sahmah Sayh Sahmah Sayh Sahmah,Sayḩ Sahmah 23.15 55.25 T DPR AE 00 0 104 Asia/Dubai 2011-11-06 +290963 Ḩaql Sahl Haql Sahl Haql Sahl,Sahal,Sahel,Sahil,Ḩaql Sahl 23.70594 54.32028 L OILF AE 01 0 114 Asia/Dubai 2011-11-06 +290964 Wādī Şaḩanah Wadi Sahanah Wadi Sahanah,Wādī Şaḩanah 25.28025 56.32255 H WAD AE 00 0 63 Asia/Dubai 2011-11-06 +290965 Saḩanah Sahanah Sahanah,Saḩanah 25.28556 56.3084 P PPL AE 06 0 99 Asia/Dubai 2011-11-06 +290966 Saḩāb Sahab Sahab,Saḩāb 25.15848 56.08929 L LCTY AE 05 0 286 Asia/Dubai 2011-11-06 +290967 Ţawī Sāji‘ah Tawi Saji`ah Tawi Saghyah,Tawi Saja'a,Tawi Saja`ah,Tawi Saji`ah,Tāwī Saja’a,Ţawī Saghyah,Ţawī Sāja‘ah,Ţawī Sāji‘ah 25.30552 55.58034 H WLL AE 06 0 39 Asia/Dubai 2011-11-06 +290968 Saghyah Saghyah Saghyah,Sajaa 25.25 55.78333 L GASF AE AE 06 0 113 Asia/Dubai 2011-11-06 +290969 Sagh‘ayn Sagh`ayn Sagh'ain,Sagh`ayn,Sagh‘ayn,Sagh’ain 24.53333 51.11667 H WLL AE 01 0 3 Asia/Dubai 2011-11-06 +290970 Wādī aş Şafşaf Wadi as Safsaf Wadi as Safsaf,Wādī aş Şafşaf 25.33999 56.02183 H WAD AE 00 0 201 Asia/Dubai 2011-11-06 +290971 Ţawī Şafşaf Tawi Safsaf Tawi Safsaf,Ţawī Şafşaf 25.32833 56.01056 H WLL AE 02 0 219 Asia/Dubai 2011-11-06 +290972 Jabal Şafşaf Jabal Safsaf Jabal Safsaf,Jabal Şafşaf 25.33111 56.02306 T HLL AE 02 0 198 Asia/Dubai 2011-11-06 +290973 Wādī Şafad Wadi Safad Wadi Safad,Wādī Şafad 25.22915 56.35145 H WAD AE 04 0 12 Asia/Dubai 2011-11-06 +290974 Jabal Şafad Jabal Safad Jabal Safad,Jabal Şafad 25.23315 56.28695 T MT AE 04 0 640 Asia/Dubai 2011-11-06 +290975 Şafad Safad Safad,Sufad,Şafad 25.22165 56.3239 P PPL AE 04 0 71 Asia/Dubai 2011-11-06 +290976 Wādī Şafā Wadi Safa Wadi Safa,Wādī Şafā 25.06554 55.26203 T TRGD AE 03 0 30 Asia/Dubai 2011-11-06 +290977 Ra’s aş Şadr Ra's as Sadr Ra's as Sadr,Ra’s aş Şadr 24.6753 54.65663 T PT AE 01 0 -9999 Asia/Dubai 2011-11-06 +290978 Ra’s as Sa‘dīyāt Ra's as Sa`diyat Ra's as Sa`diyat,Ras al Sa`diya,Ras al Sa‘diya,Ra’s as Sa‘dīyāt 24.58542 54.47465 T PT AE 01 0 -9999 Asia/Dubai 2011-11-06 +290979 Khawr as Sa‘dīyāt Khawr as Sa`diyat Khawr Essadiyat,Khawr Essādiyāt,Khawr as Sa`diyat,Khawr as Sa‘dīyāt 24.62296 54.46416 H CHNM AE 01 0 -9999 Asia/Dubai 2011-11-06 +290980 Ţawī Sa‘dīyah Tawi Sa`diyah Tawi Sa`diyah,Ţawī Sa‘dīyah 24.87867 56.16899 H WLL AE 05 0 191 Asia/Dubai 2011-11-06 +290981 Sa‘dīyah Sa`diyah Sa`diyah,Sa‘dīyah 23.69426 54.10408 H WLL AE 01 0 97 Asia/Dubai 2011-11-06 +290982 Sa‘dīyah Sa`diyah Sa`diyah,Sa‘dīyah,Tawi Sa'adiya,Tāwī Sa’adiya 25.1 55.7 V TREE AE 06 0 156 Asia/Dubai 2011-11-06 +290983 Ţawī as Sādd Tawi as Sadd Sa`ad,Sa‘ad,Tawi Sa`d,Tawi as Sadd,Ţawī Sa‘d,Ţawī as Sādd 24.20806 55.50417 H WLLS AE AE 01 0 211 Asia/Dubai 2011-11-06 +290984 Raml as Sādd Raml as Sadd Raml Sa`d,Raml Sa‘d,Raml as Sadd,Raml as Sādd 24.2 55.48333 T DUNE AE AE 01 0 213 Asia/Dubai 2011-11-06 +290985 Jabal Sa‘d Jabal Sa`d Jabal Sa`d,Jabal Sa‘d 25.11355 56.11717 T MT AE 05 0 427 Asia/Dubai 2011-11-06 +290986 Sa‘d Sa`d Sa`d,Sa‘d 25.26667 56.28333 P PPL AE 06 0 213 Asia/Dubai 2011-11-06 +290987 Ramlat Şabr Ramlat Sabr Ramlat Sabar,Ramlat Sabr,Ramlat Şabr 24.03866 55.4161 T DUNE AE 01 0 202 Asia/Dubai 2011-11-06 +290988 Sabkhah Sabkhah Sabakha,Sabkhah 23.3 53.85 P PPL AE AE 01 0 136 Asia/Dubai 2011-11-06 +290989 Sabkhah Sabkhah Sabkha,Sabkhah,Sabukhah 23.12917 53.98181 P PPL AE 01 0 166 Asia/Dubai 2011-11-06 +290990 Sabkah Sabkah Sabka,Sabkah 25.29255 55.39472 H WLL AE 03 0 8 Asia/Dubai 2011-11-06 +290991 Ţawī Sabarad Tawi Sabarad Tawi Sabarad,Ţawī Sabarad 25.29389 55.89944 H WLL AE 06 0 144 Asia/Dubai 2011-11-06 +290992 Sabalah Sabalah Sabalah,Sablah 22.92596 53.45262 T DPR AE 01 0 61 Asia/Dubai 2011-11-06 +290993 Sabā’is Saba'is Saba'is,Sabā’is 24.83333 55.5 L TRB AE 03 0 169 Asia/Dubai 2011-11-06 +290994 Qarn Şa‘bah Qarn Sa`bah Qarn Sa`bah,Qarn Şa‘bah 24.46867 55.72733 T HLL AE 01 0 330 Asia/Dubai 2011-11-06 +290995 Sa‘abah Sa`abah Sa`abah,Sa`bah,Sa‘abah,Sa‘bah 24.99417 56.025 P PPLQ AE 05 0 306 Asia/Dubai 2011-11-06 +290996 Naqā Sa‘ādah Naqa Sa`adah Naqa Sa`adah,Naqā Sa‘ādah 23.42818 55.38215 T DUNE AE 01 0 195 Asia/Dubai 2011-11-06 +290997 Ţawī Ruwayyah Tawi Ruwayyah Tawi Mirdif,Tawi Ruwayyah,Ţawī Mirdif,Ţawī Ruwayyah 24.89283 55.66387 H WLL AE 03 0 209 Asia/Dubai 2011-11-06 +290998 Ruwayyah Ruwayyah Ruwayyah 24.8871 55.66016 L LCTY AE 03 0 205 Asia/Dubai 2011-11-06 +290999 Ra’s Ruwaysīyah Ra's Ruwaysiyah Ra's Harmiyah,Ra's Ru'aysiyah,Ra's Ruwaysiyah,Ra’s Harmīyah,Ra’s Ruwaysīyah,Ra’s Ru’aysīyah 24.12591 53.44243 T PT AE 01 0 -9999 Asia/Dubai 2011-11-06 +291000 Ruwaysīyah Ruwaysiyah Ru'aysiyah,Ruwaisiyya,Ruwaysiyah,Ruwaysīyah,Ruweisiya,Ru’aysīyah 24.11927 53.4354 L LCTY AE 01 0 1 Asia/Dubai 2011-11-06 +291001 Sayḩ Ruwayshid Sayh Ruwayshid Sayh Ruwayshid,Sayḩ Ruwayshid 25.3 55.66667 T TRGD AE 06 0 76 Asia/Dubai 2011-11-06 +291002 Khawr ar Ruways Khawr ar Ruways Khawr ar Ru'ays,Khawr ar Ruways,Khawr ar Ru’ays 24.13966 52.67385 H INLT AE 01 0 1 Asia/Dubai 2011-11-06 +291003 Ruwaymayah Ruwaymayah Ruwaymayah 24.80098 55.64042 L LCTY AE 03 0 230 Asia/Dubai 2011-11-06 +291004 Jabal Ruwayḑah Jabal Ruwaydah Jabal Ruwaydah,Jabal Ruwayḑah 25.50556 56.08844 T MT AE 04 0 493 Asia/Dubai 2011-11-06 +291005 Ruwayḑah Ruwaydah Riweidah,Riweiḍah,Ruwaidha,Ruwaydah,Ruwayḑah 23.1039 53.97789 L OAS AE 01 0 98 Asia/Dubai 2011-11-06 +291006 Ruwālā Ruwala Ruwala,Ruwalla,Ruwālā 23.2956 54.20134 H SPNG AE 01 0 158 Asia/Dubai 2011-11-06 +291007 Ruqayyib Ruqayyib Ruqayyib 23.93586 52.88188 H WLL AE 01 0 59 Asia/Dubai 2011-11-06 +291008 Ruqayyah Ruqayyah Ruqayyah 23.28333 54.65 H WLL AE 01 0 126 Asia/Dubai 2011-11-06 +291009 Ruqayyah Ruqayyah Ruqayyah 23.03532 53.60933 L OAS AE 01 0 159 Asia/Dubai 2011-11-06 +291010 Shaqqat ar Ruqayţuwah Shaqqat ar Ruqaytuwah Ruqaytuwwah,Ruqayţuwwah,Shaqqat ar Ruqaytuwah,Shaqqat ar Ruqaytuwwah,Shaqqat ar Ruqayţuwah,Shaqqat ar Ruqayţuwwah 23.38663 55.25216 T TRGD AE 01 0 121 Asia/Dubai 2011-11-06 +291011 Sabkhat ar Ruqayţuwah Sabkhat ar Ruqaytuwah Sabkhat Bu Satma,Sabkhat Bū Satma,Sabkhat ar Ruqaytuwah,Sabkhat ar Ruqaytuwwah,Sabkhat ar Ruqayţuwah,Sabkhat ar Ruqayţūwwah 23.44808 55.11346 H SBKH AE 01 0 110 Asia/Dubai 2011-11-06 +291012 ‘Irq Ruqayţuwah `Irq Ruqaytuwah `Irq Ruqaytuwah,`Irq Ruqaytuwwah,‘Irq Ruqayţuwah,‘Irq Ruqayţuwwah 23.38449 55.20788 T DUNE AE 01 0 187 Asia/Dubai 2011-11-06 +291013 Ţawī Ruqayshah Tawi Ruqayshah Tawi Ruqayshah,Ţawī Ruqayshah 24.98485 55.78776 H WLL AE 06 0 163 Asia/Dubai 2011-11-06 +291014 Ruq‘at Ya‘āribah Ruq`at Ya`aribah Raq`al al Jarba,Raq‘al al Jarba,Ruq`at Ya`aribah,Ruq‘at Ya‘āribah 23.89652 55.48556 T TRGD AE 01 0 145 Asia/Dubai 2011-11-06 +291015 Ruq‘at Tulūl Ruq`at Tulul Ruq`at Tulul,Ruq‘at Tulūl 22.95827 55.20907 T DPR AE 01 0 126 Asia/Dubai 2011-11-06 +291016 Ruq‘at Sunayyim Ruq`at Sunayyim Ruq`at Sunayyim,Ruq‘at Sunayyim 23.65155 55.29791 T TRGD AE 01 0 114 Asia/Dubai 2011-11-06 +291017 Ruq‘at Ruqayţuwah Ruq`at Ruqaytuwah Ruq`at Ruqatuwwah,Ruq`at Ruqaytuwah,Ruq`at Ruqaytuwwah,Ruq‘at Ruqayţuwah,Ruq‘at Ruqayţuwwah,Ruq‘at Ruqaţuwwah 23.40594 55.28253 T DPR AE 01 0 121 Asia/Dubai 2011-11-06 +291018 Ruq‘at Nuşb Ruq`at Nusb Ruq`at Nusb,Ruq`at Nusub,Ruq‘at Nuşb,Ruq‘at Nuşub 24.05 55.41667 T SAND AE 01 0 173 Asia/Dubai 2011-11-06 +291019 Ruq‘at Muşallī Ruq`at Musalli Ruq`at Musalli,Ruq‘at Muşallī 24.85889 55.57612 T DUNE AE 03 0 195 Asia/Dubai 2011-11-06 +291020 Ruq‘at Musajira Ruq`at Musajira Ruq`at Musajira,Ruq‘at Musajira 24.84075 55.65624 T DUNE AE 03 0 228 Asia/Dubai 2011-11-06 +291021 Muḩayşinah Muhaysinah Muhaysinah,Muḩayşinah,Ruq`ah Muhassanah,Ruq`at Muhassanah,Ruq‘ah Muḩaşşanah,Ruq‘at Muḩaşşanah 25.25528 55.39278 L LCTY AE AE 03 0 15 Asia/Dubai 2011-11-06 +291022 Ruq‘at Maghis Ruq`at Maghis Ruq`at Maghis,Ruq‘at Maghis 23.61802 55.4466 T TRGD AE 01 0 139 Asia/Dubai 2011-11-06 +291023 Ruq‘at Ḩumaydī Ruq`at Humaydi Hameidha,Humaydah,Ruq`at Humaydi,Ruq‘at Ḩumaydī,Ḩumayḑah 24.79964 55.70185 T DUNE AE 03 0 260 Asia/Dubai 2011-11-06 +291024 Ruq‘at Ḩulayw Ruq`at Hulayw Ruq`at Hulayw,Ruq‘at Ḩulayw 23.63585 55.36908 T TRGD AE 01 0 157 Asia/Dubai 2011-11-06 +291025 Rafadah Rafadah Rafadah,Ruq`at Bu Zafidah,Ruq‘at Bū Z̧afīdah 24.86014 55.65022 T DUNE AE 03 0 217 Asia/Dubai 2011-11-06 +291026 Ruq‘at al Mīr Ruq`at al Mir Ruq`at al Mir,Ruq‘at al Mīr 22.98574 55.19227 H SBKH AE 01 0 100 Asia/Dubai 2011-11-06 +291027 Ruq‘at al Ḩādh Ruq`at al Hadh Ruq`at al Hadh,Ruq‘at al Ḩādh 22.94468 55.1886 H SBKH AE 01 0 105 Asia/Dubai 2011-11-06 +291028 Ruq‘at al ‘Arād Ruq`at al `Arad Raq`at al-`Arad,Raq‘at al-‘Arād,Ruq`at al Ard,Ruq`at al `Arad,Ruq‘at al Ard,Ruq‘at al ‘Arād 23.86265 55.50198 T TRGD AE 01 0 191 Asia/Dubai 2011-11-06 +291029 Wādī Rumḩ Wadi Rumh Wadi Rumh,Wādī Rumḩ 25.04006 56.32907 H WAD AE 06 0 24 Asia/Dubai 2011-11-06 +291030 Ţawī Rumḩ Tawi Rumh Tawi Rumh,Ţawī Rumḩ 25.01667 56.35 H WLL AE 06 0 7 Asia/Dubai 2011-11-06 +291031 Jabal Rumḩ Jabal Rumh Jabal Rumh,Jabal Rumḩ 25.02953 56.2807 T MT AE 04 0 369 Asia/Dubai 2011-11-06 +291032 Rumaylī Rumayli Rumayli,Rumaylī 26.02472 56.11083 V CULT AE 05 0 565 Asia/Dubai 2011-11-06 +291033 Jabal ar Rumaylah Jabal ar Rumaylah Jabal ar Rumaylah 25.43333 56.35 T HLL AE 04 0 34 Asia/Dubai 2011-11-06 +291034 Jabal Umayliḩ Jabal Umaylih Jabal Rumaylah,Jabal Umaylah,Jabal Umaylih,Jabal Umayliḩ 25.0503 55.82244 T HLL AE 06 0 253 Asia/Dubai 2011-11-06 +291035 Rūl Ḑadnā Rul Dadna Rol Dadnah,Rol Ḍadnah,Rul Dadna,Rul Dadnah,Rul Dhadna,Rūl Ḑadnah,Rūl Ḑadnā 25.55481 56.34546 P PPL AE 04 0 26 Asia/Dubai 2011-11-06 +291036 Ţawī ar Rūl Tawi ar Rul Tawi ar Rul,Ţawī ar Rūl 25.57602 56.35214 H WLLQ AE 04 0 -9999 Asia/Dubai 2011-11-06 +291037 Rukbāt Rukbat Rukbat,Rukbāt 24.74428 54.65006 T SPIT AE 01 0 7 Asia/Dubai 2011-11-06 +291038 Ramlat ar Ruhayl Ramlat ar Ruhayl Ramlat ar Ruhayl 23.55 55.46667 T DUNE AE 00 0 188 Asia/Dubai 2011-11-06 +291039 Jabal Ruḩam Jabal Ruham Jabal Ruham,Jabal Ruḩam 25.13333 56.26667 T HLL AE 04 0 93 Asia/Dubai 2011-11-06 +291040 Rughaylāt Rughaylat Righeilat,Righeilāt,Rughaylat,Rughaylāt,Rugheilat 25.10552 56.3563 P PPL AE 04 0 23 Asia/Dubai 2011-11-06 +291041 ‘Ayn ar Rufayşah `Ayn ar Rufaysah `Ayn ar Rufaysah,‘Ayn ar Rufayşah 25.35 56.31667 H SPNG AE 06 0 77 Asia/Dubai 2011-11-06 +291042 Rufayşah Rufaysah Rufaysah,Rufayşah 25.16778 56.17722 V CULT AE 01 0 389 Asia/Dubai 2011-11-06 +291043 Bandar Rudaym Bandar Rudaym Bandar Rudaym 24.06323 53.69867 H COVE AE 01 0 -9999 Asia/Dubai 2011-11-06 +291044 Ţawī Rubayyah Tawi Rubayyah Tawi Rabaiya,Tawi Rubayyah,Tāwī Rabaiya,Ţawī Rubayyah 25.73333 56.05 H WLL AE AE 05 0 361 Asia/Dubai 2011-11-06 +291045 Rubay‘ah Rubay`ah Rubay`ah,Rubay‘ah 24.25 55.08333 T DPR AE 01 0 123 Asia/Dubai 2011-11-06 +291046 Wādī Riyāmah Wadi Riyamah Wadi Riyama,Wadi Riyamah,Wādī Riyāmah 25.55023 56.04815 H WAD AE 04 0 237 Asia/Dubai 2011-11-06 +291047 Riyāmah Riyamah Riyama,Riyamah,Riyāmah 25.54564 56.05836 P PPL AE 04 0 179 Asia/Dubai 2011-11-06 +291048 Jabal Riyādir Jabal Riyadir Jabal Riyadir,Jabal Riyādir 25.3 56.33333 T MT AE 06 0 42 Asia/Dubai 2011-11-06 +291049 Ţawī Riqānah Tawi Riqanah Riqana,Tawi Riqanah,Ţawī Riqānah 24.3418 55.69959 H WLL AE 01 0 310 Asia/Dubai 2011-11-06 +291050 ‘Uqlat ar Rimth `Uqlat ar Rimth `Uqlat ar Rimth,‘Uqlat ar Rimth 24.43333 51.11667 H WLL AE 01 0 6 Asia/Dubai 2011-11-06 +291051 Rimāḩ Rimah Al Ramah,Rimah,Rimāḩ 24.79667 55.61194 V TREE AE AE 03 0 224 Asia/Dubai 2011-11-06 +291052 Rimá Rima Rima,Rimá 25.16784 56.11795 P PPL AE 05 0 519 Asia/Dubai 2011-11-06 +291053 Riḩyāt Rihyat Rihyat,Riḩyāt 24.88151 55.44885 T SAND AE 03 0 152 Asia/Dubai 2011-11-06 +291054 Ţawī Rifā‘ Tawi Rifa` Tawi Rifa`,Ţawī Rifā‘ 24.96961 55.78658 H WLL AE 06 0 173 Asia/Dubai 2011-11-06 +291055 Ghalīlat Rāziqī Ghalilat Raziqi Ghalilat Raziqi,Ghalīlat Rāziqī 25.6 56.28333 H WADM AE 04 0 95 Asia/Dubai 2011-11-06 +291056 Wādī Rayj Wadi Rayj Wadi Rayj,Wādī Rayj 25.0183 55.2567 T TRGD AE 03 0 37 Asia/Dubai 2011-11-06 +291057 Wādī Raybīyah Wadi Raybiyah Wadi Raibiya,Wadi Raybiyah,Wādī Raibiya,Wādī Raybīyah 25.73472 56.02722 H WAD AE AE 05 0 9 Asia/Dubai 2011-11-06 +291058 Rawḑah Rawdah Rawdah,Rawḑah 24.09028 55.56194 T DPR AE 01 0 215 Asia/Dubai 2011-11-06 +291059 Ra’s Siyād Ra's Siyad Ra's Seyad,Ra's Siyad,Ra’s Seyād,Ra’s Siyād 24.55 51.65 T ISL AE 01 0 -9999 Asia/Dubai 2011-11-06 +291060 Ra’s Qal‘ah Ra's Qal`ah Ra's Qal`ah,Ra’s Qal‘ah 24.19222 55.58333 T DUNE AE 01 0 235 Asia/Dubai 2011-11-06 +291061 Ar Rāshidīyah Ar Rashidiyah Ar Rashidiyah,Ar Rāshidīyah,Rashdia,Rashidiyah,Rashīdīyah 25.22365 55.38894 P PPLX AE 03 0 20 Asia/Dubai 2011-11-06 +291062 Ţawī Rāshid Bin Sa‘īd Tawi Rashid Bin Sa`id Tawi Rashid Bin Sa`id,Ţawī Rāshid Bin Sa‘īd 25.65528 55.95861 H WLL AE 05 0 22 Asia/Dubai 2011-11-06 +291063 Ţawī Rāshid Bin Ḩamad Tawi Rashid Bin Hamad Tawi Rashid Bin Hamad,Ţawī Rāshid Bin Ḩamad 25.24 55.91278 H WLL AE 06 0 136 Asia/Dubai 2011-11-06 +291064 Rāshid al Gharbī Rashid al Gharbi Rashid al Gharbi,Rāshid al Gharbī,Tawi Rashid Gharbiyah,Tawi Rashid al Gharbiyah,Ţawī Rāshid Gharbīyah,Ţawī Rāshid al Gharbīyah 25.35833 55.70528 H WLL AE AE 06 0 74 Asia/Dubai 2011-11-06 +291065 Ţawī Rāshidah Tawi Rashidah Tawi Rashidah,Ţawī Rāshidah 25.16667 55.96667 H WLL AE 05 0 234 Asia/Dubai 2011-11-06 +291066 Ţawī Rāshid Tawi Rashid Tawi Rashid,Ţawī Rāshid 25.33333 55.78333 H WLL AE 06 0 105 Asia/Dubai 2011-11-06 +291067 Nadd Rāshid Nadd Rashid Nadd Rashid,Nadd Rāshid 25.21944 55.40556 T DUNE AE 03 0 24 Asia/Dubai 2011-11-06 +291068 Mīnā’ Rāshid Mina' Rashid Mina' Rashid,Mīnā’ Rāshid,Port Rashid,Rachid Port 25.27056 55.29083 L PRT AE 03 0 -9999 Asia/Dubai 2011-11-06 +291069 Ḩaql Rāshid Haql Rashid Haql Rashid,Rashid Oilfield,Ḩaql Rāshid 25.23333 55.2 L OILF AE AE 03 0 -9999 Asia/Dubai 2011-11-06 +291070 Barqat Rashīd Barqat Rashid Bada` Rashid,Bada‘ Rashid,Barqat Rashid,Barqat Rashīd,Barqat Rāshid 24.00562 54.01885 T HLL AE 01 0 18 Asia/Dubai 2011-11-06 +291071 Raseen Raseen Raseen 23.68333 54.78333 H WLL AE 01 0 130 Asia/Dubai 2011-11-06 +291072 Rasan Rasan Rasan 24.15 55.21667 T DUNE AE 01 0 151 Asia/Dubai 2011-11-06 +291073 Khawr Ra’s al Khaymah Khawr Ra's al Khaymah Khawr Khaymah,Khawr Ra's al Khaymah,Khawr Ra’s al Khaymah 25.78333 55.95 H LGN AE 05 0 -9999 Asia/Dubai 2011-11-06 +291074 Ra’s al Khaymah Ra's al Khaymah Julfa,Khaimah,Ra's al Khaymah,Ras al Khaima,Ras al Khaimah,Ra’s al Khaymah,Rās al Khaima,ras alkhymt,رأس الخيمة 25.78953 55.9432 P PPLA AE 05 115949 27 Asia/Dubai 2011-11-06 +291075 Ra’s al Khaymah Ra's al Khaymah Jasimi Shaikhdom of Ras al-Khaimah,Ra's al Khaymah,Ran al Khaima,Ras al Khaima,Ras el Khaimah,Ras el Khaïmah,Raʼs al Khaymah,Ra’s al Khaymah,Sheikhdom of Ras al Khaimah,State of Ras Al Khaima,ras alkhymt,رأس الخيمة 25.66667 56 A ADM1 AE 05 187535 12 Asia/Dubai 2011-11-05 +291076 Wādī Ra’s Wadi Ra's Wadi Ra's,Wādī Ra’s 25.10156 56.35801 H WAD AE 04 0 23 Asia/Dubai 2011-11-06 +291077 Jabal Ra’s Jabal Ra's Jabal Ra's,Jabal Ra’s 25.32634 56.3712 T MT AE 00 0 331 Asia/Dubai 2011-11-06 +291078 Sayḩ ar Raqq Sayh ar Raqq Sayh ar Raq,Sayh ar Raqq,Sayḩ ar Raq,Sayḩ ar Raqq 24.06667 55.83333 T TRGD AE AE 01 0 316 Asia/Dubai 2011-11-06 +291079 Jabal Rams Jabal Rams Jabal Rams 25.86917 56.06917 T MT AE 05 0 774 Asia/Dubai 2011-11-06 +291080 Ramrāmīyāt Ramramiyat Birkat al Ju,Ramramiyah,Ramramiyat,Ramrammiyat,Ramrammiyāt,Ramramīyah,Ramrāmīyāt 23.98231 53.7953 T HLL AE 01 0 68 69 Asia/Dubai 2011-11-06 +291081 Ḩabl Ramrām Habl Ramram Habl Ramram,Ḩabl Ramrām 24.9 55.3 T SAND AE 03 0 62 Asia/Dubai 2011-11-06 +291082 Ḩabl Ramrām Habl Ramram Habl Ramram,Ḩabl Ramrām 24.91667 55.3 T DUNE AE 03 0 74 Asia/Dubai 2011-11-06 +291083 Za‘bīl Za`bil Raml Sabil,Raml Za`bil,Raml Za‘bīl,Za`bil,Za‘bīl 25.20408 55.2875 P PPLX AE 03 0 6 Asia/Dubai 2011-11-06 +291084 Ramlat Zarārah Ramlat Zararah Ramlat Zarara,Ramlat Zararah,Ramlat Zarārah 22.90077 54.49992 L AREA AE 01 0 131 Asia/Dubai 2011-11-06 +291085 Ramlah Ramlah Ramla,Ramlah,Ramlā 25.35979 56.04452 P PPL AE 04 0 264 Asia/Dubai 2011-11-06 +291086 Jazīrat Ramḩān Jazirat Ramhan Jazirat Ramhan,Jazīrat Ramḩān,Ramhan,Ramḩān,jzyrt rmhan,جزيرة رمحان 24.53778 54.52419 T ISL AE 01 0 10 Asia/Dubai 2011-11-06 +291087 Ţawī Ramārīm Tawi Ramarim Tawi Ramarim,Tawi Rimarim,Tawi Rumayram,Tāwī Rimarim,Ţawī Ramārīm,Ţawī Rumayram 25.36083 55.535 H WLL AE 02 0 12 Asia/Dubai 2011-11-06 +291088 Ramaq Ramaq Ramaq 24.93333 55.13333 T SAND AE 03 0 42 Asia/Dubai 2011-11-06 +291089 Qūr ar Rākibī Qur ar Rakibi Qur ar Rakibi,Qūr ar Rākibī 25.5841 56.32873 T MT AE 04 0 357 Asia/Dubai 2011-11-06 +291090 Naqā Rākah Naqa Rakah Naqa Rakah,Naqā Rākah 23.95296 55.43484 T DUNE AE 01 0 232 Asia/Dubai 2011-11-06 +291091 Ghāf Rakaḑ Ghaf Rakad Ghaf Rakad,Ghāf Rakaḑ 24.51667 55.41667 T HLL AE 01 0 179 Asia/Dubai 2011-11-06 +291092 Sayḩ ar Rajībah Sayh ar Rajibah Sayh ar Rajibah,Sayḩ ar Rajībah 24.8 55.26667 T TRGD AE 03 0 71 Asia/Dubai 2011-11-06 +291093 Ḩadabat ar Rajībah Hadabat ar Rajibah Hadabat ar Rajibah,Ḩadabat ar Rajībah 24.8042 55.2656 T HLL AE 03 0 67 Asia/Dubai 2011-11-06 +291094 Raighnaan Raighnaan Raighnaan 23.16667 54.83333 H WLL AE 01 0 114 Asia/Dubai 2011-11-06 +291095 Raighan Raighan Raighan 23.26667 54.73333 H WLL AE 01 0 129 Asia/Dubai 2011-11-06 +291096 Raigha Raigha Raigha 24.44577 55.15561 T SAND AE 01 0 128 Asia/Dubai 2011-11-06 +291097 Raḩmah Rahmah Rahmah,Raḩmah 25.68 55.86361 H WLL AE 07 0 61 Asia/Dubai 2011-11-06 +291098 Rahfīyah Rahfiyah Rahfiya,Rahfiyah,Rahfīyah 22.79933 54.90797 T DPR AE 01 0 173 Asia/Dubai 2011-11-06 +291099 Jabal ar Raḩraḩ Jabal ar Rahrah Jabal Rahah,Jabal Rāḩah,Jabal ar Rahrah,Jabal ar Raḩraḩ 25.94833 56.14194 T MT AE AE 05 0 1586 Asia/Dubai 2011-11-06 +291100 Wādī Raḩbah Wadi Rahbah Wadi Rahabah,Wadi Rahbah,Wādī Raḩabah,Wādī Raḩbah 25.92472 56.07167 H WAD AE AE 05 0 12 Asia/Dubai 2011-11-06 +291101 Jabal Raḩabah Jabal Rahabah Jabal Rahabah,Jabal Raḩabah,Jabal ar Ra`aylah,Jabal ar Ra‘aylah 25.92583 56.11667 T MT AE AE 05 0 1539 Asia/Dubai 2011-11-06 +291102 Raḩabah Rahabah Rahabah,Raḩabah 25.98333 56.08333 L TRB AE 05 0 37 Asia/Dubai 2011-11-06 +291103 Raḩá Raha Raha,Raḩá 24.87639 56.2175 V CULT AE 05 0 140 Asia/Dubai 2011-11-06 +291105 Naqā Raghwah Naqa Raghwah Naqa Raghawa,Naqa Raghwah,Naqā Raghawa,Naqā Raghwah 24.44834 55.23357 T DUNE AE 01 0 141 Asia/Dubai 2011-11-06 +291106 Ţawī Rafī‘ah Tawi Rafi`ah Tawi Rafi`ah,Tawi Rafiya,Tawi Rayifah,Tāwī Rafiya,Tāwī Rayifah,Ţawī Rafī‘ah 25.31972 55.73583 H WLL AE 06 0 79 Asia/Dubai 2011-11-06 +291107 Rafaq Rafaq Rafaq 24.87471 56.24559 P PPL AE 05 0 321 Asia/Dubai 2011-11-06 +291108 Ţawī Rafāh Tawi Rafah Tawi Rafah,Ţawī Rafāh 25.28333 55.88333 H WLL AE 06 0 110 Asia/Dubai 2011-11-06 +291109 Ţawī Rafādah Tawi Rafadah Tawi Rafaada,Tawi Rafadah,Ţawī Rafaada,Ţawī Rafādah 24.89462 55.74432 H WLL AE 06 0 185 Asia/Dubai 2011-11-06 +291110 Rafā‘ Rafa` Rafa`,Rafā‘ 25.34701 56.35014 P PPL AE 06 0 40 Asia/Dubai 2011-11-06 +291111 Radūm Radum Radum,Radūm 23.09185 53.61473 L OAS AE 01 0 172 Asia/Dubai 2011-11-06 +291112 Radāt Ramz Radat Ramz Radat Ramz,Radath Ramz,Radāt Ramz 25.5 56.1 H WLL AE AE 05 0 218 Asia/Dubai 2011-11-06 +291113 Jabal ar Rabbah Jabal ar Rabbah Jabal ar Rabbah 25.39071 56.06641 T HLL AE 05 0 322 Asia/Dubai 2011-11-06 +291114 Sayḩ Rab‘ Sayh Rab` Sayh Rab`,Sayḩ Rab‘ 24.61506 54.86516 T TRGD AE 01 0 48 Asia/Dubai 2011-11-06 +291115 Quwayd Quwayd Quwayd 25.13333 56.05 L TRB AE 05 0 488 Asia/Dubai 2011-11-06 +291116 Quţūf Qutuf Qatuf,Qaṭūf,Qutuf,Quţūf 23.10971 53.72738 P PPL AE 01 0 87 Asia/Dubai 2011-11-06 +291117 Quţūf Qutuf Qutuf,Quţūf 23.10794 53.69333 T DPR AE 01 0 80 Asia/Dubai 2011-11-06 +291118 Jabal Qutayyib Jabal Qutayyib Jabal Qutayyib 25.94139 56.09333 T HLL AE 05 0 881 Asia/Dubai 2011-11-06 +291119 Jabal al Qusīy Jabal al Qusiy Jabal al Qusiy,Jabal al Qusīy 25.06667 56.31667 T HLL AE 06 0 90 Asia/Dubai 2011-11-06 +291120 Qushāsh Qushash Qushash,Qushāsh 23.95539 53.62028 T SAND AE 01 0 14 Asia/Dubai 2011-11-06 +291121 Sabkhat Qusaywirah Sabkhat Qusaywirah Sabkhat Qusaywirah 22.77956 55.04968 H SBKH AE 01 0 76 Asia/Dubai 2011-11-06 +291122 Qusaywirah Qusaywirah Geseiwra,Jiseiwrah,Qusaywirah 22.81918 54.79949 L LCTY AE 01 0 117 Asia/Dubai 2011-11-06 +291124 Quşaydāt Qusaydat Qusaidat,Qusaydat,Quşaydāt 25.77461 55.97002 P PPLX AE 05 0 21 Asia/Dubai 2011-11-06 +291125 Qurmidah Qurmidah Garmada,Garmadā,Jarmada,Jarmadā,Qarmadah,Qurmidah 23.11957 53.82855 P PPL AE 01 0 154 Asia/Dubai 2011-11-06 +291126 Qurmidah Qurmidah Qarmadah,Qurmidah 23.11234 53.82152 L OAS AE 01 0 86 Asia/Dubai 2011-11-06 +291127 Jazīrat Qurmah Jazirat Qurmah Jazirat Qurmah,Jazīrat Qurmah 25.76667 55.95 T ISL AE 05 0 20 Asia/Dubai 2011-11-06 +291128 Khawr Qurm Khawr Qurm Khawr Qurm 25.72056 55.84667 H LGN AE 05 0 -9999 Asia/Dubai 2011-11-06 +291129 Qurm Qurm Qurm 25.91139 56.06417 P PPL AE 05 0 29 Asia/Dubai 2011-11-06 +291130 Wādī Qurayyah Wadi Qurayyah Wadi Qaraiyat,Wadi Qurayyah,Wādī Qurayyah 25.24214 56.34825 H WAD AE 04 0 16 Asia/Dubai 2011-11-06 +291131 Jabal Qurayyah Jabal Qurayyah Jabal Qurayyah 25.25531 56.3374 T HLL AE 04 0 40 Asia/Dubai 2011-11-06 +291132 Quraytisah Quraytisah Quraytisah 23.57867 54.87448 H WLL AE 01 0 147 Asia/Dubai 2011-11-06 +291133 Ţawī Qurayn Tawi Qurayn Tawi Qurayn,Ţawī Qurayn 23.66667 54.7 H WLL AE 01 0 143 Asia/Dubai 2011-11-06 +291134 Sayḩ Qurayḩah Sayh Qurayhah Sayh Qurayhah,Sayḩ Qurayḩah 25.41667 55.7 T TRGD AE 07 0 77 Asia/Dubai 2011-11-06 +291135 Quraydah Quraydah Quraydah 23.13464 53.86398 L OAS AE 01 0 167 Asia/Dubai 2011-11-06 +291136 Qūr Qur Al Qawr,Al Qor,Quor,Qur,Qūr 24.91214 56.09566 P PPL AE 05 0 340 Asia/Dubai 2011-11-06 +291137 Qunayy Qunayy Qunayy 23.16667 54.38333 H WLL AE 01 0 151 Asia/Dubai 2011-11-06 +291138 Bid‘ al Qumzān Bid` al Qumzan Bid` al Qumzan,Bid‘ al Qumzān 23.78619 53.42782 H WLL AE 01 0 102 Asia/Dubai 2011-11-06 +291139 Qulaydah Qulaydah Qulaydah 25.1968 55.96372 T RDGE AE 06 0 213 Asia/Dubai 2011-11-06 +291140 Qufayyid Qufayyid Qiff Rajajil,Qiff Rajājīl,Qufayyid 23.7573 52.87017 T SAND AE 01 0 94 Asia/Dubai 2011-11-06 +291141 Sih al Qubua Sih al Qubua Sayh al Qubua,Sayḩ al Qubua,Sih al Qubua 24.31519 54.88739 T DPR AE 01 0 75 Asia/Dubai 2011-11-06 +291142 Qubbat Bū Lisail Qubbat Bu Lisail Qubbat Bu Lisail,Qubbat Bū Lisail 24.36204 55.64738 L LCTY AE 01 0 278 Asia/Dubai 2011-11-06 +291143 Wādī Qubbah Wadi Qubbah Wadi Qubbah,Wādī Qubbah 25.3444 56.13202 H WAD AE 00 0 760 Asia/Dubai 2011-11-06 +291144 Sayḩ Qubaysāt Sayh Qubaysat Sayh Qubaysat,Sayḩ Qubaysāt 24.31489 55.05401 T TRGD AE 01 0 95 Asia/Dubai 2011-11-06 +291145 Ghaḑā’ Qūbah Ghada' Qubah Ghada' Qubah,Ghaḑā’ Qūbah,Sayh as Salab,Sayḩ as Salab 24.26986 55.30432 T TRGD AE 01 0 141 Asia/Dubai 2011-11-06 +291146 Qu‘aysah Qu`aysah Ge'aisa,Ge’aisa,Je`eisah,Je‘eiṣah,Qu`aysah,Qu‘aysah 22.9941 54.22184 P PPL AE 01 0 151 Asia/Dubai 2011-11-06 +291147 Quar Ah Qahlish Quar Ah Qahlish Quar Ah Qahlish 25.985 56.08639 P PPL AE 05 0 10 Asia/Dubai 2011-11-06 +291148 Jabal Qitab Jabal Qitab Jabal Kitas,Jabal Qitab 25.02017 56.2411 T MT AE 00 0 1029 1004 Asia/Dubai 2011-11-06 +291149 Khawr Qirqishān Khawr Qirqishan Khawr Qirqishan,Khawr Qirqishān 24.37884 54.36899 H BAY AE 01 0 -9999 Asia/Dubai 2011-11-06 +291150 Wādī Qimah Wadi Qimah Wadi Qamh,Wadi Qima,Wadi Qimah,Wadi Qimh,Wādī Qamḩ,Wādī Qimah,Wādī Qimh,Wādī Qīmá 24.79862 56.13736 H WAD AE 03 0 306 Asia/Dubai 2011-11-06 +291151 Jabal Qimah Jabal Qimah Jabal Qima,Jabal Qimah,Jabal Qīmá 24.79495 56.15749 T HLL AE 03 0 609 Asia/Dubai 2011-11-06 +291152 Qimah Qimah Qamh,Qamḩ,Qima,Qimah,Qimh,Qīmá 24.78668 56.14143 P PPL AE 03 0 322 Asia/Dubai 2011-11-06 +291153 Ra’s al Qilā‘ Ra's al Qila` Qala`,Qala‘,Ra's al Qila`,Ras Djaliya,Ras Ijla,Ras Jaliya,Ras Jaliyah,Ras al Jala'a,Ras al Jala’a,Ras al-Qela',Ra’s al Qilā‘,Rās al-Qelā’ 24.15507 52.97896 T PT AE 01 0 -9999 Asia/Dubai 2011-11-06 +291154 Jabal Qidfa‘ Jabal Qidfa` Jabal Qidfa`,Jabal Qidfa‘ 25.33201 56.32246 T MT AE 06 0 473 Asia/Dubai 2011-11-06 +291155 Qidfa‘ Qidfa` Qidfa,Qidfa`,Qidfa‘,Qidfi`,Qidfi‘ 25.30426 56.37034 P PPL AE 06 0 45 Asia/Dubai 2011-11-06 +291156 Qayyat al Bawl Qayyat al Bawl Qayyat al Bawl 24.27465 54.62206 T DUNE AE 01 0 15 Asia/Dubai 2011-11-06 +291157 Naqā Qaydah Naqa Qaydah Naqa Qaydah,Naqā Qaydah 23.36667 55.4 T DUNE AE 00 0 174 Asia/Dubai 2011-11-06 +291158 Qawm ‘Anīyāt Qawm `Aniyat Qaum `Aniyat,Qaum ‘Anīyāt,Qawm `Aniyat,Qawm ‘Anīyāt 24.11544 54.34195 T HLL AE 01 0 21 Asia/Dubai 2011-11-06 +291159 Qaţţārah Qattarah Al-Qatarah,Qatara,Qatarah,Qattara,Qattarah,Qatārah,Qaţţārah,Qaṭṭāra 24.25993 55.75566 P PPL AE 01 0 292 Asia/Dubai 2011-11-06 +291160 Ţawī Qaţam Tawi Qatam Tawi Qatam,Ţawī Qaţam 24.0525 54.74417 H WLL AE 01 0 74 Asia/Dubai 2011-11-06 +291161 Qaţam Qatam Qatam,Qaţam 24.0532 54.73458 T DUNE AE 01 0 74 Asia/Dubai 2011-11-06 +291162 Qataiwa Qataiwa Qataiwa 23.41667 55.28333 H WLL AE 01 0 155 Asia/Dubai 2011-11-06 +291163 Qassīs Ḩayy Qassis Hayy Qassis Haiy,Qassis Hayy,Qassīs Haiy,Qassīs Ḩayy 24.1 55.63333 T DPR AE AE 01 0 250 Asia/Dubai 2011-11-06 +291164 Ramlat al Qassīs Ramlat al Qassis Ramlat al Qassis,Ramlat al Qassīs 24.08333 55.58333 T DUNE AE 01 0 238 Asia/Dubai 2011-11-06 +291165 Qaşşābī Qassabi Gassabi,Gassābi,Jassabi,Jaşşābī,Qassabi,Qaşşābī,Qusabi,Quşābī,Umm al Majarib,Umm al Majārib 24.21093 54.1017 T ISL AE 01 0 11 Asia/Dubai 2011-11-06 +291166 Qaşr Şāliḩ Qasr Salih Qasr Salih,Qaşr Şāliḩ 23.92871 52.78831 T SAND AE 01 0 43 Asia/Dubai 2011-11-06 +291167 Wādī Qasmah Wadi Qasmah Wadi Qasma,Wadi Qasmah,Wādī Qasma,Wādī Qasmah 24.48968 55.53049 H WAD AE 01 0 251 Asia/Dubai 2011-11-06 +291168 Kharīmat Qaşīmah Kharimat Qasimah Kharimat Qasimah,Kharmat Qasimah,Kharmat Qaşīmah,Kharīmat Qaşīmah,Qasimah,Qaşimah 24.07524 54.89174 T TRGD AE 01 0 90 Asia/Dubai 2011-11-06 +291169 Qaşīmah Qasimah Qasimah,Qaşīmah 24.05154 54.90686 H WLL AE 01 0 83 Asia/Dubai 2011-11-06 +291170 Qarn Qashash Qarn Qashash Qarn Qashash 24.42261 55.59755 T HLL AE 01 0 275 Asia/Dubai 2011-11-06 +291171 Qarqarī Qarqari Qarqari,Qarqarī 24.31889 55.61222 T DPR AE 01 0 221 Asia/Dubai 2011-11-06 +291172 Qarnayn Qarnayn Al Qarnain,Al Qarnayn,Jazirat al Qarnayn,Jazīrat al Qarnayn,Jezirat Qarnain,Karnain Island,Qarnayn,Qarnein 24.93528 52.84972 T ISL AE AE 01 0 -9999 Asia/Dubai 2011-11-06 +291173 Qarḩat Suwayd Qarhat Suwayd Qarhat Suwaid,Qarhat Suwayd,Qarḩat Suwayd 24.5 55.68333 V TREE AE AE 01 0 286 Asia/Dubai 2011-11-06 +291174 Wādī Qarḩah Wadi Qarhah Wadi Qarhah,Wādī Qarḩah 25.36471 55.8084 T DPR AE 06 0 80 Asia/Dubai 2011-11-06 +291175 Sayḩ Qarāţīs Sayh Qaratis Sayh Qaratis,Sayḩ Qarāţīs 24.86667 55.55 T DPR AE 03 0 148 Asia/Dubai 2011-11-06 +291176 Ţawī al Qaran Tawi al Qaran Tawi al Qaran,Ţawī al Qaran 25.53317 55.74746 H WLL AE 07 0 49 Asia/Dubai 2011-11-06 +291177 Qarāmidah Qaramidah Qaramidah,Qarāmidah 23.14517 53.71552 L OAS AE 01 0 160 Asia/Dubai 2011-11-06 +291178 Ţawī al Qārah Tawi al Qarah Alcara,Tawi al Qarah,Ţawī al Qārah 25.69146 56.00238 H WLL AE 05 0 15 Asia/Dubai 2011-11-06 +291179 Qar‘ah Qar`ah Qar'a,Qar`ah,Qara'a,Qara’a,Qar‘ah,Qar’a 24.9 55.03333 T SAND AE 03 0 16 Asia/Dubai 2011-11-06 +291180 Ţawī Qarad Tawi Qarad Tawi Garhad,Tawi Qarad,Ţawī Qarad,Ţāwī Garhad 25.62735 55.75506 H WLL AE 07 0 23 Asia/Dubai 2011-11-06 +291181 Khawr Qanţūr Khawr Qantur Khawr Qantur,Khawr Qanţūr 24.15843 54.06167 H CHNM AE 01 0 -9999 Asia/Dubai 2011-11-06 +291182 Qamshī Qamshi Qamshi,Qamshī,Qemshi 24.74458 54.77306 T HLL AE 01 0 12 Asia/Dubai 2011-11-06 +291183 Qamrā’ Qamra' Qamra',Qamrā’ 23.03861 52.60583 H WLL AE 01 0 103 Asia/Dubai 2011-11-06 +291184 Qamrā’ Qamra' Qamra',Qamrā’ 23.01254 52.48934 L LCTY AE 01 0 85 Asia/Dubai 2011-11-06 +291185 Qamarah Qamarah Qamarah 23.71667 53.4 T HLL AE 01 0 81 Asia/Dubai 2011-11-06 +291186 Jabal al Qumr ash Shamālī Jabal al Qumr ash Shamali Jabal al Qamar,Jabal al Qumr ash Shamali,Jabal al Qumr ash Shamālī 25.46168 56.04501 T MT AE 05 0 561 Asia/Dubai 2011-11-06 +291187 Jabal al Qumr al Janūbī Jabal al Qumr al Janubi Jabal al Qamar,Jabal al Qumr al Janubi,Jabal al Qumr al Janūbī 25.43354 56.044 T MT AE 05 0 455 Asia/Dubai 2011-11-06 +291188 Wādī al Qildī Wadi al Qildi Wadi al Qaliddi,Wadi al Qildi,Wādī al Qaliddī,Wādī al Qildī 25.59763 55.98951 H WAD AE 04 0 36 Asia/Dubai 2011-11-06 +291189 Wādī al Qaliddī Wadi al Qaliddi Wadi al Qaliddi,Wādī al Qaliddī 25.56667 56.05 H WAD AE 04 0 346 Asia/Dubai 2011-11-06 +291190 ‘Aqabat al Qaliddī `Aqabat al Qaliddi Qalidda Pass,Qaliddi Pass,Qāliddi Pass,`Aqabat al Qaliddi,‘Aqabat al Qaliddī 25.53387 56.12393 T PASS AE 04 0 512 Asia/Dubai 2011-11-06 +291191 Qaiyaisha Qaiyaisha Qaiyaisha 25.88333 56.11667 L TRB AE 05 0 853 Asia/Dubai 2011-11-06 +291192 Ḩabl Qā’imah Habl Qa'imah Habl Qa'im,Habl Qa'imah,Habl Qa’im,Ḩabl Qā’imah 24.35345 54.73194 T SAND AE 01 0 46 Asia/Dubai 2011-11-06 +291193 Qā’imah Qa'imah Gaimo,Qa'imah,Qā’imah 24.32635 54.7658 H WLLS AE 01 0 53 Asia/Dubai 2011-11-06 +291194 Raml al Qaḩţ Raml al Qaht Raml al Qaht,Raml al Qaḩţ 24.73333 55.28333 T SAND AE 03 0 115 Asia/Dubai 2011-11-06 +291195 Ţawī Qafan Tawi Qafan Tawi Qafan,Ţawī Qafan 25.29778 55.88472 H WLL AE 06 0 118 Asia/Dubai 2011-11-06 +291196 Wādī Qada‘ah Wadi Qada`ah Wadi Ghayl,Wadi Qada`a,Wadi Qada`ah,Wadi Qadda`a,Wādī Qada‘a,Wādī Qada‘ah,Wādī Qadda‘a 25.79083 56.07842 H WAD AE 05 0 203 Asia/Dubai 2011-11-06 +291197 Jabal Qada‘ah Jabal Qada`ah Jabal Qada`a,Jabal Qada`ah,Jabal Qada‘a,Jabal Qada‘ah 25.77944 56.13973 T MT AE 05 0 1374 Asia/Dubai 2011-11-06 +291198 Qada‘ah Qada`ah Qada`a,Qada`ah,Qada‘a,Qada‘ah 25.76667 56.08333 V CULT AE 05 0 379 Asia/Dubai 2011-11-06 +291199 Qabas Qabas Qabas 26.03435 56.12302 P PPL AE 05 0 419 Asia/Dubai 2011-11-06 +291200 Qubaythah Qubaythah Qabaitha,Qubaythah 24.41472 55.69599 L LCTY AE 01 0 318 Asia/Dubai 2011-11-06 +291201 Petty Patches Petty Patches Petty Patches 24.48392 52.4424 H SHOL AE 01 0 -9999 Asia/Dubai 2011-11-06 +291204 Nuwayrān Nuwayran Nuwayran,Nuwayrān 24.0781 54.66495 T DUNE AE 01 0 56 Asia/Dubai 2011-11-06 +291205 Ţawī Nuşaylī Tawi Nusayli Tawi Nusayli,Ţawī Nuşaylī 24.34467 55.22058 H WLLS AE 01 0 133 Asia/Dubai 2011-11-06 +291206 Sabkhat Nuşaylī Sabkhat Nusayli Sabkhat Nusayli,Sabkhat Nuşaylī 24.32398 55.1741 H SBKH AE 01 0 124 Asia/Dubai 2011-11-06 +291207 Qarn Nuşaylah Qarn Nusaylah Al-Neseilah,Qarn Nusaylah,Qarn Nuşaylah 24.46222 54.63361 T DUNE AE AE 01 0 14 Asia/Dubai 2011-11-06 +291208 Nuşayb Nusayb Nusayb,Nuşayb 24.45 55.11667 T TRGD AE 01 0 123 Asia/Dubai 2011-11-06 +291209 Nuqayrah Nuqayrah Nuqayrah 23.30021 54.09107 P PPL AE 01 0 172 Asia/Dubai 2011-11-06 +291210 Nuqaydhah Nuqaydhah Nuqaydhah 23.02418 53.56632 T DPR AE 01 0 77 Asia/Dubai 2011-11-06 +291211 Ţawī Numayrīyah Tawi Numayriyah Nimairiya,Numairiya,Tawi Nimairiyyah,Tawi Numayriyah,Ţawī Numayrīyah 23.75469 54.42187 H WLL AE 01 0 104 Asia/Dubai 2011-11-06 +291212 Numayl Numayl Nemail,Numayl 23.13487 53.88304 L OAS AE 01 0 106 Asia/Dubai 2011-11-06 +291213 Ţawī an Nukharah Tawi an Nukharah Tawi Nakh,Tawi an Nakharah,Tawi an Nukharah,Ţawī an Nakharah,Ţawī an Nukharah,Ṭāwī Nakh 24.93857 55.39779 H WLL AE 03 0 83 Asia/Dubai 2011-11-06 +291214 Sayḩ an Nukharah Sayh an Nukharah Sayh an Nakharah,Sayh an Nukharah,Sayḩ an Nakharah,Sayḩ an Nukharah 24.93333 55.35 T TRGD AE AE 03 0 71 Asia/Dubai 2011-11-06 +291215 Nuhayy Nuhayy Nahai,Nuhayy 25.27074 56.36242 P PPL AE 06 0 22 Asia/Dubai 2011-11-06 +291216 Ţawī Nubayy Tawi Nubayy Tawi Nubayy,Ţawī Nubayy 25.48333 55.71667 H WLL AE 07 0 45 Asia/Dubai 2011-11-06 +291217 Ţawī Nubaybigh Tawi Nubaybigh Nebeibighat,Tawi Nubaybigh,Tawi Nubaybighah,Ţawī Nubaybigh,Ţawī Nubaybighah 25.26667 55.81667 H WLL AE AE 06 0 125 Asia/Dubai 2011-11-06 +291218 Wādī Niyām Wadi Niyam Wadi Niyam,Wādī Niyām 25.08412 55.92606 H WAD AE 05 0 185 Asia/Dubai 2011-11-06 +291219 Qurūn Nişāb Qurun Nisab Qurun Nisab,Qurūn Nişāb 23.80045 54.33433 T DUNE AE 01 0 100 Asia/Dubai 2011-11-06 +291220 Nisāb Nisab Nisab,Nisāb 23.79429 54.35987 H WLL AE 01 0 90 Asia/Dubai 2011-11-06 +291221 Nibrī Nibri Nibri,Nibrī 25.35176 55.84985 S FT AE 07 0 75 Asia/Dubai 2011-11-06 +291222 Jabal Nibah Jabal Nibah Jabal Nibah 24.76861 56.15111 T MT AE 00 0 522 Asia/Dubai 2011-11-06 +291223 Wādī Nazwá Wadi Nazwa Wadi Nazwa,Wādī Nazwá 25.01163 55.65579 T TRGD AE 06 0 176 Asia/Dubai 2011-11-06 +291224 Ţawī Nazwá Tawi Nazwa Nazwa,Nazwā,Tawi Nazwa,Tawi Nezwa,Tawi Nizwa,Ţawī Nazwá,Ţāwī Nezwa 25.0325 55.68361 H WLL AE AE 06 0 168 Asia/Dubai 2011-11-06 +291225 Qarn Nazwá Qarn Nazwa Qarn Nazwa,Qarn Nazwá,Qarn Nizwa 24.98371 55.66235 T HLL AE 00 0 173 Asia/Dubai 2011-11-06 +291226 Wādī Nayās Wadi Nayas Wadi Nayas,Wadi Nayassa,Wādī Nayassa,Wādī Nayās 25.02082 55.9848 H WAD AE 05 0 247 Asia/Dubai 2011-11-06 +291227 Naqā an Nawā Naqa an Nawa Naqa Nawi,Naqa an Nawa,Naqā Nāwī,Naqā an Nawā 25.14487 55.42354 T DUNE AE 03 0 55 Asia/Dubai 2011-11-06 +291228 Sayḩ Naşūrīyah Ghafanī Sayh Nasuriyah Ghafani Sayh Nasuriyah Ghafani,Sayh Nisuriyah,Sayḩ Naşūrīyah Ghafanī,Sayḩ Nişūrīyah 24.39117 55.2855 T TRGD AE 01 0 155 Asia/Dubai 2011-11-06 +291229 Ţawī Naşūrīyah Tawi Nasuriyah Tawi Nasuriyah,Tawi Nisuriyah,Ţawī Naşūrīyah,Ţawī Nişūrīyah 24.32521 55.35583 H WLL AE 01 0 146 Asia/Dubai 2011-11-06 +291230 Sayḩ Naşūrīyah Sayh Nasuriyah Sayh Nasuriyah,Sayh Nisuriyah,Sayḩ Naşūrīyah,Sayḩ Nişūrīyah 24.36214 55.35931 T TRGD AE 01 0 179 Asia/Dubai 2011-11-06 +291231 Naşūrīyah Nasuriyah Nasuriyah,Naşūrīyah,Ryah Nisuh 24.4 55.31667 H WLL AE AE 01 0 100 Asia/Dubai 2011-11-06 +291232 Naşūrīyah Nasuriyah Nasuriyah,Naşūrīyah,Nisuriyah,Nişūrīyah 24.36667 55.41667 T DUNE AE AE 01 0 184 Asia/Dubai 2011-11-06 +291233 Naşlah Naslah Naslah,Naşlah 23.82234 52.6032 T SAND AE 01 0 62 Asia/Dubai 2011-11-06 +291234 Naşīb Nasib Nasib,Naşīb 24.56667 55.16667 T DUNE AE 01 0 92 Asia/Dubai 2011-11-06 +291235 Nashimah Nashimah Nashimah 23.09103 53.80754 T DPR AE 01 0 81 Asia/Dubai 2011-11-06 +291236 Sayḩ an Nashash Sayh an Nashash Sayh an Nashash,Sayḩ an Nashash,Sih al Nashash,Sih an Nashash,Sīḩ an Nashāsh 24.08865 55.71184 T TRGD AE 01 0 245 Asia/Dubai 2011-11-06 +291237 Milhala Milhala Milhala,Tawi Nasas,Ţawī Nasas,Ţawī Naşāş 25.02694 55.97 H WLL AE 05 0 265 Asia/Dubai 2011-11-06 +291238 Ramlat Nasās Ramlat Nasas Ramlat Nasas,Ramlat Nasās 24.51593 55.168 T DUNE AE 01 0 106 Asia/Dubai 2011-11-06 +291239 Nasas Nasas Nasas 24.5 55.18333 T TRGD AE 01 0 125 Asia/Dubai 2011-11-06 +291240 Ţawī Naqrah Tawi Naqrah Tawi Nagarah,Tawi Naqara,Tawi Naqrah,Ţawī Naqara,Ţawī Naqrah 24.3762 55.53108 H WLLS AE 01 0 194 Asia/Dubai 2011-11-06 +291241 Qarn Naqrah Qarn Naqrah Qarn Naqrah 24.37348 55.52974 T DUNE AE 01 0 235 Asia/Dubai 2011-11-06 +291242 Naqrah Naqrah Naqrah 24.37644 55.56032 P PPL AE 01 0 247 Asia/Dubai 2011-11-06 +291243 Naqrah Naqrah Naqrah 24.38333 55.45 T DUNE AE 01 0 204 Asia/Dubai 2011-11-06 +291244 Naqbīyīn Naqbiyin Naqbiyin,Naqbīyīn 25.66667 56 L TRB AE 00 0 12 Asia/Dubai 2011-11-06 +291245 Naqbiyīn Naqbiyin Naqbiyin,Naqbiyīn 25.33333 56.33333 L TRB AE 00 0 426 Asia/Dubai 2011-11-06 +291246 Wādī Naqat Wadi Naqat Wadi Naqat,Wādī Naqat 25.86667 56.1 H WAD AE 05 0 205 Asia/Dubai 2011-11-06 +291247 Jaww an Nāqah Jaww an Naqah Jaww an Naqah,Jaww an Nāqah 22.96387 54.14931 T DPR AE 01 0 95 Asia/Dubai 2011-11-06 +291248 Naqab Sha‘rān Naqab Sha`ran Naqab Sha`ran,Naqab Sha‘rān 24.17121 54.66632 T SAND AE 01 0 44 Asia/Dubai 2011-11-06 +291249 Wādī Naqab Wadi Naqab Wadi Naqab,Wādī Naqab 25.70384 56.0662 H WAD AE 05 0 85 Asia/Dubai 2011-11-06 +291250 Namlīyah Namliyah Namliyah,Namlīyah 23.05915 53.958 T DPR AE 01 0 170 Asia/Dubai 2011-11-06 +291251 Namlīyah Namliyah Namliyah,Namlīyah 23.03453 54.02193 T DPR AE 01 0 87 Asia/Dubai 2011-11-06 +291252 Namlah Namlah Namlah 23.06497 53.97529 H WLL AE 01 0 76 Asia/Dubai 2011-11-06 +291253 Namlah Namlah Namalah,Namlah 23.01393 53.47494 T DPR AE 01 0 172 Asia/Dubai 2011-11-06 +291254 Nakhl Subayyis Nakhl Subayyis Nakhl Sibaiyis,Nakhl Sibaylis,Nakhl Subaiyis,Nakhl Subayyis 24.3575 55.20611 V TREE AE AE 01 0 107 Asia/Dubai 2011-11-06 +291255 Nakhl Bin Jirwān Nakhl Bin Jirwan Nakhl Bin Jirwan,Nakhl Bin Jirwān,Nakhl bin Jerwan 24.18333 55.11667 H WLLS AE AE 01 0 123 Asia/Dubai 2011-11-06 +291256 ‘Uqlat an Nakhlah `Uqlat an Nakhlah An Nakhlah,Nakhla,`Uglat Nakhlan,`Uqlat al-Nakhlah,`Uqlat an Nakhlah,‘Uglat Nakhlan,‘Uqlat al-Nakhlah,‘Uqlat an Nakhlah 24.31667 51.2 H WLL AE 01 0 7 Asia/Dubai 2011-11-06 +291257 Ramlat an Nakhlah Ramlat an Nakhlah Ramlat an Nakhlah 24.35861 51.20632 T DUNE AE 01 0 10 Asia/Dubai 2011-11-06 +291258 Nakhalai Nakhalai Nakhalai 25.09528 55.57653 L LCTY AE 03 0 89 Asia/Dubai 2011-11-06 +291259 Jabal Najla‘ Jabal Najla` Jabal Najla`,Jabal Najla‘ 25.43593 55.99124 T HLL AE 05 0 208 Asia/Dubai 2011-11-06 +291260 Jabal Najdayn Jabal Najdayn Jabal Najdayn,Jabal Naydayn 25.17988 56.17201 T MT AE 00 0 880 Asia/Dubai 2011-11-06 +291261 Najdayn Najdayn Najdayn 25.16667 56.2 V CULT AE 04 0 639 Asia/Dubai 2011-11-06 +291262 Najdāt Najdat Najadat,Najadāt,Najdat,Najdāt 24.13333 55.91667 L TRB AE AE 01 0 378 Asia/Dubai 2011-11-06 +291263 Na‘ītah Na`itah Jazirat Na`itah,Jazīrat Na‘ītah,Na`itah,Naita,Na‘ītah,Ne'ita,Ne’īta,Ni`eitah,Ni‘eitah 24.29085 51.79455 T ISL AE 01 0 -9999 Asia/Dubai 2011-11-06 +291264 Naqā Nā’if Naqa Na'if Naqa Na'if,Naqā Nā’if 23.08742 55.22844 T DUNE AE 01 0 171 Asia/Dubai 2011-11-06 +291265 Nahwá Nahwa Nahawa,Nahwa,Nahwá 25.26823 56.28002 P PPL AE 06 0 213 Asia/Dubai 2011-11-06 +291266 Ţawī Nahshīlah Tawi Nahshilah Tawi Nahshilah,Ţawī Nahshīlah 24.40832 55.10681 H WLL AE 01 0 103 Asia/Dubai 2011-11-06 +291267 Nahshīlah Nahshilah Nahshilah,Nahshīlah 24.4032 55.05936 T SAND AE 01 0 100 Asia/Dubai 2011-11-06 +291268 Nahdayn Nahdayn Nahdain,Nahdayn,Nahdein 23.68333 52.3 S OILW AE AE 01 0 41 Asia/Dubai 2011-11-06 +291269 Nahdayn Nahdayn Nahadain,Nahdayn 23.68725 52.30246 T HLL AE 01 0 49 Asia/Dubai 2011-11-06 +291270 Nafīr Nafir Nafir,Nafīr,Nefair 23.10393 53.78919 P PPL AE 01 0 86 Asia/Dubai 2011-11-06 +291271 Nafīr Nafir Nafir,Nafīr 23.10444 53.78667 T DPR AE 01 0 86 Asia/Dubai 2011-11-06 +291272 Naqā Nadh Naqa Nadh Naqa Nadh,Naqā Nadh 23.79851 55.49041 T DUNE AE 01 0 194 Asia/Dubai 2011-11-06 +291273 Nadd Umm Ḩaşá Nadd Umm Hasa Nadd Umm Hasa,Nadd Umm Ḩaşá 25.13954 55.38266 L LCTY AE 03 0 20 Asia/Dubai 2011-11-06 +291274 Nadd Māni‘ Nadd Mani` Nadd Mani`,Nadd Māni‘,Ned Bin Tamana,Nidd Mani`,Nidd Māni‘ 25.55306 55.5475 T PEN AE 07 0 18 Asia/Dubai 2011-11-06 +291275 Nadd Bayḑā’ Nadd Bayda' Nad Beidha,Nadd Bayda',Nadd Bayḑā’ 25.35352 55.43762 L LCTY AE 06 0 15 Asia/Dubai 2011-11-06 +291276 Ramlat Nadd Ramlat Nadd Ramlat Nadd 23.97641 55.12876 T DUNE AE 01 0 143 Asia/Dubai 2011-11-06 +291277 Naban Naban Naban 24.23824 54.90422 H WLL AE 01 0 77 Asia/Dubai 2011-11-06 +291278 Na‘adhal Na`adhal Na`adhal,Na‘adhal 22.98454 53.54606 T DPR AE 01 0 46 Asia/Dubai 2011-11-06 +291279 Muzayri‘ Muzayri` Mezaira'a,Mezaira’a,Mizeir`ah,Mizeir‘ah,Mozayri`,Mozayri‘,Muzayri`,Muzayri‘ 23.14355 53.7881 P PPL AE 01 10000 181 Asia/Dubai 2011-11-06 +291280 Mughaylat Muzāri‘ Mughaylat Muzari` Maghailat Muzaria,Mughaylat Muzari`,Mughaylat Muzāri‘ 24.03333 54.95 H WLL AE 01 0 90 Asia/Dubai 2011-11-06 +291281 Ghāfat al Muyayridah Ghafat al Muyayridah Ghafat al Muyayridah,Ghāfat al Muyayridah 25.6 56.3 H WLL AE 04 0 45 Asia/Dubai 2011-11-06 +291282 Sayḩ Muyaydirah Sayh Muyaydirah Sayh Muyaydirah,Sayḩ Muyaydirah 24.68333 55.4 T TRGD AE 03 0 155 Asia/Dubai 2011-11-06 +291283 Muyaydirah Muyaydirah Muyaydirah 24.7 55.38333 T SAND AE 03 0 118 Asia/Dubai 2011-11-06 +291284 Naqā Muwayzah Naqa Muwayzah Naqa Muwayzah,Naqā Muwayzah 24.6 55.31667 T SAND AE 01 0 135 Asia/Dubai 2011-11-06 +291285 Ḩişn al Muwayqi‘ī Hisn al Muwayqi`i Hisn al Muwayqi`i,Ḩişn al Muwayqi‘ī 24.21667 55.71667 S FT AE 01 0 266 Asia/Dubai 2011-11-06 +291286 Muwayliḩ Muwaylih Muailah,Muwaylih,Muwayliḩ 24.61506 54.7728 H WLL AE 01 0 24 Asia/Dubai 2011-11-06 +291287 Wādī al Muwayji‘ah Wadi al Muwayji`ah Wadi al Muwayji`ah,Wādī al Muwayji‘ah 24.95 55.4 T DPR AE 03 0 85 Asia/Dubai 2011-11-06 +291288 Muwayh Arnab Muwayh Arnab Muwayh Arnab 24.27467 55.05049 T SAND AE 01 0 123 Asia/Dubai 2011-11-06 +291289 Muwayh al Ju’ābir Muwayh al Ju'abir Muwayh al Ju'abir,Muwayh al Ju’ābir 23.82211 55.46188 T DUNE AE 01 0 181 Asia/Dubai 2011-11-06 +291290 Muwayh al Huḑayb Muwayh al Hudayb Muwayh al Hudayb,Muwayh al Huḑayb 24.06076 55.35169 T SAND AE 01 0 191 Asia/Dubai 2011-11-06 +291291 Bi’r Muwayfiqah Bi'r Muwayfiqah Bi'r Muwayfiqah,Bi’r Muwayfiqah,Muwafiqa,Muwafiqah,Muwāfiqa,Muwāfīqah 24.13194 55.68139 H WLL AE 01 0 247 Asia/Dubai 2011-11-06 +291292 Jabal Muthrad Jabal Muthrad Jabal Muthrad 25.15731 56.28963 T MT AE 04 0 387 Asia/Dubai 2011-11-06 +291293 Ţawī Mutayn Tawi Mutayn Tawi Mutayn,Ţawī Mutayn 23.2725 53.60472 H WLL AE 01 0 141 Asia/Dubai 2011-11-06 +291294 Muţaylān Mutaylan Mitailan,Mutailan,Mutaylan,Muţaylān 23.84996 53.82125 L AREA AE 01 0 69 Asia/Dubai 2011-11-06 +291295 Mughayyil Muţawwá Mughayyil Mutawwa Mughayyil Mutawwa,Mughayyil Muţawwá 24.06546 54.89046 H WLL AE 01 0 107 Asia/Dubai 2011-11-06 +291296 Bid‘ al Muţāwa‘ah Bid` al Mutawa`ah Bid' al-Mataw'a,Bid` al Mutawa`ah,Bid` al Mutawwa`,Bid` al-Mataw`ah,Bid‘ al Muţawwa‘,Bid‘ al Muţāwa‘ah,Bid‘ al-Maṭāw‘ah,Bid’ al-Mataw’a 23.75972 52.51917 H WLL AE 01 0 68 Asia/Dubai 2011-11-06 +291297 Wādī Mu‘tariḑah Wadi Mu`taridah Wadi Mu`taridah,Wādī Mu‘tariḑah 25.5165 56.00264 H WAD AE 00 0 97 Asia/Dubai 2011-11-06 +291298 Mu‘tariḑah Mu`taridah Mu`taridah,Mu`taridat,Mu‘tariḑah,Mu‘tariḑat 23.93178 52.41949 T RKS AE 01 0 58 Asia/Dubai 2011-11-06 +291299 Mu‘tariḑah Mu`taridah Mu`taridah,Mu‘tariḑah 25.50841 56.11046 P PPL AE 04 0 350 Asia/Dubai 2011-11-06 +291300 Mu‘tariḑah Mu`taridah Mu`taridah,Mu‘tariḑah 24.03558 53.34833 T HLLS AE 01 0 18 Asia/Dubai 2011-11-06 +291301 Mu‘tariḑah Mu`taridah Mu`taridah,Mu‘tariḑah 23.92444 52.43222 T DUNE AE 01 0 38 Asia/Dubai 2011-11-06 +291302 Jabal Mu‘tariḑ Jabal Mu`tarid Jabal Ma'atridh,Jabal Ma’atridh,Jabal Mu`tarid,Jabal Mu‘tariḑ 25.45641 55.99319 T HLL AE 05 0 233 Asia/Dubai 2011-11-06 +291303 Bid‘ Mussama Bid` Mussama Bid` Mussama,Bid‘ Mussama 23.55 53.61667 H WLL AE 01 0 128 Asia/Dubai 2011-11-06 +291304 Musaqab Musaqab Musaqab,Musqab 25.16778 56.14167 V GRVP AE AE 05 0 363 Asia/Dubai 2011-11-06 +291305 Mushrif Mushrif Mushrif 25.21667 55.45 H WLL AE 03 0 34 Asia/Dubai 2011-11-06 +291306 Ţawī Mushayrif Tawi Mushayrif Mashairif,Mushairif,Tawi Mushayrif,Ţawī Mushayrif 24.08689 54.81192 H WLL AE 01 0 76 Asia/Dubai 2011-11-06 +291307 Sabkhat Mushayrif Sabkhat Mushayrif Sabkhat Mushayrif 24.15149 54.66116 H SBKH AE 01 0 40 Asia/Dubai 2011-11-06 +291308 Mushayrif Mushayrif Mushayrif 23.92507 54.31447 T TRGD AE 01 0 81 Asia/Dubai 2011-11-06 +291309 Mushayrif Mushayrif Mushairif,Mushayrif 24.11525 54.81618 L LCTY AE 01 0 84 Asia/Dubai 2011-11-06 +291310 Mushayrif Mushayrif Mushayrif 24.11489 54.66871 T DUNE AE 01 0 57 Asia/Dubai 2011-11-06 +291311 Ra’s Mushayrib Ra's Mushayrib Ra's Mashayrib,Ra's Mushayrib,Ras Mashairif,Ras Masheirib,Ras Masherib,Ras Mushairib,Ras Musheirib,Ra’s Mashayrib,Ra’s Mushayrib,Rās Mushairib 24.29292 51.74242 T PT AE 01 0 -9999 Asia/Dubai 2011-11-06 +291312 Mushayrib Mushayrib Mushayrib 24.46667 54.41667 T ISL AE 01 0 -9999 Asia/Dubai 2011-11-06 +291313 Mushāshī Mushashi Mashashi,Mushashi,Mushāshī 23.11124 52.5636 S OILW AE 01 0 114 Asia/Dubai 2011-11-06 +291314 Mushāsh Mushash Imshash,Mushash,Mushāsh 24.55769 51.35768 H WLL AE 01 0 -9999 Asia/Dubai 2011-11-06 +291315 Mushājir Mushajir Mushajir,Mushājir 23.08605 53.99163 L OAS AE 01 0 178 Asia/Dubai 2011-11-06 +291316 Mushājir Mushajir Mushajir,Mushājir 23.07049 53.93374 T DPR AE 01 0 73 Asia/Dubai 2011-11-06 +291317 Bid‘ Muşfir Bid` Musfir Bid` Musfir,Bid‘ Muşfir,Bir Misfar 24.0619 55.29648 H WLL AE 01 0 175 Asia/Dubai 2011-11-06 +291318 Ruqq Musfayr Ruqq Musfayr Ruqq Musfayr 24.27875 51.88656 H RF AE 01 0 -9999 Asia/Dubai 2011-11-06 +291319 Musayyibah Musayyibah Musayyibah 23.82699 55.2768 T TRGD AE 01 0 122 Asia/Dubai 2011-11-06 +291320 Ţawī Musannad Tawi Musannad Tawi Musannad,Tawi Mussarad,Ţawī Musannad,Ţawī Mussarad 25.25 55.7 H WLL AE AE 06 0 111 Asia/Dubai 2011-11-06 +291321 Sayḩ Musannad Sayh Musannad Sayh Musannad,Sayḩ Musannad 25.25104 55.67154 T TRGD AE 06 0 71 Asia/Dubai 2011-11-06 +291322 Wādī Musallā Wadi Musalla Wadi Musalla,Wādī Musallā 25.51575 56.00944 H WAD AE 04 0 142 Asia/Dubai 2011-11-06 +291323 Ḩadd Musafsif Hadd Musafsif Hadd Musafsif,Ḩadd Musafsif 24.10083 52.06417 H SHOL AE 01 0 -9999 Asia/Dubai 2011-11-06 +291324 Khawr Musá Khawr Musa Khawr Musa,Khawr Musá 22.725 53.51671 T DPR AE 01 0 62 Asia/Dubai 2011-11-06 +291325 Sayḩ Muruq Sayh Muruq Sayh Muruq,Sayḩ Muruq 25.56617 56.0731 T DPR AE 04 0 211 Asia/Dubai 2011-11-06 +291326 Wādī Murtaqam Wadi Murtaqam Wadi Murtaqam,Wadi Murtaqau,Wādī Murtaqam,Wādī Murtaqau 25.36727 56.25448 H WAD AE 04 0 277 Asia/Dubai 2011-11-06 +291327 Wādī Murrah Wadi Murrah Wadi Murrah,Wādī Murrah 25.19803 56.22673 H WAD AE 04 0 321 Asia/Dubai 2011-11-06 +291328 Wādī Murrah Wadi Murrah Wadi Murrah,Wādī Murrah 24.9 55.43333 T TRGD AE 03 0 105 Asia/Dubai 2011-11-06 +291329 Ţawī Murrah Tawi Murrah Al-Murrah,Qa`r Murra,Qa‘r Murra,Tawi Murra,Tawi Murrah,Ţawī Murrah,Ţāwī Murra 25.13443 55.74992 H WLL AE 06 0 117 Asia/Dubai 2011-11-06 +291330 Ţawī Murrah Tawi Murrah Tawi Morro,Tawi Motto,Tawi Murra,Tawi Murrah,Ţawī Murrah 24.90846 55.44146 H WLL AE 03 0 113 Asia/Dubai 2011-11-06 +291331 Raml Murrah Raml Murrah Raml Murrah 24.86266 55.38085 T SAND AE 03 0 80 Asia/Dubai 2011-11-06 +291332 Qarn Murrah Qarn Murrah Qarat Murra,Qarat Murrah,Qarn Murrah,Qārat Murra,Qārat Murrah 25.13349 55.7703 T DUNE AE 06 0 150 Asia/Dubai 2011-11-06 +291333 Murrah Murrah Murrah 25.03333 55.6 V TREE AE 03 0 162 Asia/Dubai 2011-11-06 +291334 Murrah Murrah Murrah 25.19903 56.22165 P PPL AE 04 0 223 Asia/Dubai 2011-11-06 +291335 Muriya Hammāmah Muriya Hammamah Muriya Hammamah,Muriya Hammāmah 24.93333 54.26667 T RKS AE 01 0 -9999 Asia/Dubai 2011-11-06 +291336 Ḩaql Murbān Haql Murban Haql Murban,Mirban,Murban Field,Ḩaql Murbān 23.83333 53.75 L OILF AE AE 01 0 76 Asia/Dubai 2011-11-06 +291337 Murbān Murban Mirban,Mirbān,Murban,Murbān 23.95342 53.69134 T HLL AE 01 0 3 Asia/Dubai 2011-11-06 +291338 Sabkhat Murbaḩ Sabkhat Murbah Sabkhat Murbah,Sabkhat Murbaḩ 25.25 56.36667 H SBKH AE 04 0 -9999 Asia/Dubai 2011-11-06 +291339 Murbaḩ Murbah Marbah,Mirba,Mirbih,Mirbiḥ,Murbah,Murbaḩ 25.27623 56.36256 P PPL AE 06 0 23 Asia/Dubai 2011-11-06 +291340 Murbaḑ Murbad Marbad,Murbad,Murbaḑ 25.3254 56.13311 P PPL AE 04 0 487 Asia/Dubai 2011-11-06 +291341 Murayyil Murayyil Murayyil 25.11667 55.51667 V TREE AE 06 0 82 Asia/Dubai 2011-11-06 +291342 Muraytah Muraytah Muraytah 25.40032 56.05844 P PPL AE 05 0 240 Asia/Dubai 2011-11-06 +291343 Wādī Murayshid Wadi Murayshid Wadi Murayshid,Wādī Murayshid 25.1 56.36667 H WAD AE 04 0 -9999 Asia/Dubai 2011-11-06 +291344 Jabal Murayshid Jabal Murayshid Jabal Murayshid 25.11667 56.33333 T HLL AE 04 0 35 Asia/Dubai 2011-11-06 +291345 Barqat Muraymīth Barqat Muraymith Barqat Muraymith,Barqat Muraymīth 23.88902 54.47119 T RKS AE 01 0 88 Asia/Dubai 2011-11-06 +291346 Muraykh Muraykh Maraikh,Muraykh 24 55.41667 H WLL AE AE 01 0 188 Asia/Dubai 2011-11-06 +291347 Ţawī Muray Tawi Muray Tawi Muray,Ţawī Muray 23.86667 54.61667 H WLL AE 01 0 86 Asia/Dubai 2011-11-06 +291348 Ţawī Muraqqibāt Tawi Muraqqibat Muraghabat,Muraqabat,Muraqqibat,Tawi Muraqqibat,Ţawī Muraqqibāt 25.32611 55.89944 H WLL AE AE 07 0 170 Asia/Dubai 2011-11-06 +291349 Ţawī Muraqqab Tawi Muraqqab Tawi Muraqqab,Ţawī Muraqqab 24.82029 55.58435 H WLL AE 03 0 182 Asia/Dubai 2011-11-06 +291350 Murāqabāt Muraqabat Muraqabat,Murāqabāt 25.16361 55.34111 H WLL AE 03 0 13 Asia/Dubai 2011-11-06 +291351 Murabba‘ah Murabba`ah Murabba`ah,Murabba‘ah 25.88333 56.03333 S TOWR AE 05 0 1 Asia/Dubai 2011-11-06 +291352 Ra’s Muqayshiţ Ra's Muqayshit Mughhaishat,Ra's Muqayshit,Ra's al Ibrah,Ra’s Muqayshiţ,Ra’s al Ibrah 24.16778 53.6236 T PT AE 01 0 -9999 Asia/Dubai 2011-11-06 +291353 Muqayshiţ Muqayshit Megaishit,Megeshit,Megeshiţ,Muqayshit,Muqayshiţ 24.18908 53.75226 T ISLX AE 01 0 10 Asia/Dubai 2011-11-06 +291354 Muqaţţarah Muqattarah Miqattarah,Miqaṭṭarah,Mugatara,Mugattara,Mugaţţara,Muqatirah,Muqattarah,Muqaţţarah,Muqātirah 24.2694 54.51333 T HLL AE 01 0 10 Asia/Dubai 2011-11-06 +291355 Muqala Muqala Muqala 23.53333 54.43333 H WLL AE 01 0 131 Asia/Dubai 2011-11-06 +291356 Muntahá Muntaha Mntaha,Muntaha,Muntahá 23.84263 55.41381 T DPR AE 01 0 187 Asia/Dubai 2011-11-06 +291357 Munfatrah Munfatrah Mufatra,Munfatrah 23.96667 53.03333 T HLL AE AE 01 0 39 Asia/Dubai 2011-11-06 +291358 Mundafinah Mundafinah Mondafanah,Mondafinah,Mundafinah,Mundafnah 24.11667 55.8 P PPL AE AE 01 0 320 Asia/Dubai 2011-11-06 +291359 Khawr Manā’if Khawr Mana'if Khawr Mana'if,Khawr Manā’if,Khawr Munayyif,Khor Manayef,Khor Manāyef 24.14456 52.91494 H COVE AE 01 0 -9999 Asia/Dubai 2011-11-06 +291360 Munayyif Munayyif Munayyif 24.07278 52.94833 L LCTY AE 01 0 22 Asia/Dubai 2011-11-06 +291361 Munayyif Munayyif Munaiyif,Munayyif 24.09324 52.93446 T HLL AE 01 0 51 Asia/Dubai 2011-11-06 +291362 Wādī Munay‘ī Wadi Munay`i Wadi Manai,Wadi Munay`,Wadi Munay`i,Wādī Munay‘,Wādī Munay‘ī 24.88227 56.20944 H WAD AE 05 0 142 Asia/Dubai 2011-11-06 +291363 Munay‘ī Munay`i Manai,Manai'i,Manai’i,Munay`i,Munay‘ī 24.95135 56.14997 P PPL AE 05 0 370 Asia/Dubai 2011-11-06 +291364 Jabal Mulfīrah Jabal Mulfirah Jabal Mulfirah,Jabal Mulfīrah 25.15716 56.31601 T HLL AE 04 0 229 Asia/Dubai 2011-11-06 +291365 Mulaysah Mulaysah Mulaysah 23.91634 53.03505 H WLL AE 01 0 63 Asia/Dubai 2011-11-06 +291366 Mulaysah Mulaysah Mulaysah 23.9 53.05 H WLL AE 01 0 51 Asia/Dubai 2011-11-06 +291367 Mulayhim Mulayhim Malayham,Mulayhim 22.90126 53.43345 T DPR AE 01 0 54 Asia/Dubai 2011-11-06 +291368 Wādī Mulayḩah Wadi Mulayhah Wadi Mulayhah,Wādī Mulayḩah 25.73333 56.01667 H WAD AE 05 0 28 Asia/Dubai 2011-11-06 +291369 Wādī Mulayḩah Wadi Mulayhah Wadi Mulayhah,Wādī Mulayḩah 25.23504 55.90669 H WAD AE 06 0 121 Asia/Dubai 2011-11-06 +291370 Ţawī Mulayḩah Tawi Mulayhah Tawi Mulaiha,Tawi Mulayhah,Ţawī Mulaiha,Ţawī Mulayḩah 25.02722 55.795 H WLL AE AE 06 0 161 Asia/Dubai 2011-11-06 +291371 Jabal Mulayḩah Jabal Mulayhah Jabal Milaiha,Jabal Mileihah,Jabal Mileiḥah,Jabal Mulayhah,Jabal Mulayḩah,Jibal Mulayhah,Jibāl Mulayḩah,Mulaiha 25.14818 55.83716 T HLL AE 06 0 362 Asia/Dubai 2011-11-06 +291372 Mulayḩah Mulayhah Mileihah,Mileiḥah,Miliaha,Mulayhah,Mulayḩah 25.16667 55.8 H WLLS AE AE 06 0 158 Asia/Dubai 2011-11-06 +291373 Qarn Mulayḩ Qarn Mulayh Qarn Mileih,Qarn Mulayh,Qarn Mulayḩ 25.02286 55.72966 T HLL AE 06 0 274 236 Asia/Dubai 2011-11-06 +291374 Mukhtaraqah Mukhtaraqah Mahtarraqah,Muhtarqah,Mukhtaraja,Mukhtaraqah 25.54092 56.13066 P PPL AE 04 0 272 Asia/Dubai 2011-11-06 +291375 Mukhayūs Mukhayus Mukhayus,Mukhayūs 25.73222 55.95389 H WLL AE 05 0 47 Asia/Dubai 2011-11-06 +291376 Mūjib Mujib Mujib,Mūjib 23.11667 53.68333 P PPL AE 01 0 84 Asia/Dubai 2011-11-06 +291377 Kharmat al Muhayn Kharmat al Muhayn Kharimat al Mahain,Kharmat al Mahaim,Kharmat al Muhayn 23.01796 55.10773 T DPR AE 01 0 109 Asia/Dubai 2011-11-06 +291378 Wādī Muhaylī Wadi Muhayli Wadi Muhayli,Wādī Muhaylī 25.7044 56.06564 H WAD AE 05 0 85 Asia/Dubai 2011-11-06 +291379 Ţawī Muḩayjir Tawi Muhayjir Tawi Muhayjir,Ţawī Muḩayjir 24.5511 55.76381 H WLL AE 01 0 319 Asia/Dubai 2011-11-06 +291380 Jabal Muḩayjir Jabal Muhayjir Jabal Muhayjir,Jabal Muḩayjir,Qarn Muhaiyir 24.53819 55.73512 T HLL AE 01 0 293 Asia/Dubai 2011-11-06 +291381 Muhammalīyah Muhammaliyah Al Mahammaliyah,Jazirat Muhammaliyah,Jazīrat Muḩammalīyah,Mahamaliya,Mehammaliyya,Mehammaliyyah,Muhammaliya,Muhammaliyah,Muhammalīyah 24.11616 51.89603 T ISL AE 01 0 -9999 Asia/Dubai 2011-11-06 +291382 Ţawī Muḩammad Tawi Muhammad Tawi Muhammad,Ţawī Muḩammad 24.94636 55.75046 H WLL AE 06 0 183 Asia/Dubai 2011-11-06 +291383 Bid‘ Muḩammad Bid` Muhammad Bid` Muhammad,Bid‘ Muḩammad 24.25 55.1 H WLL AE 01 0 125 Asia/Dubai 2011-11-06 +291384 Qullat Muḩāfiz̧ Qullat Muhafiz Qal`eh Mahafidh,Qallah Mahafidh,Qal‘eh Mahāfidh,Qullat Mahafiz,Qullat Maḩāfiz̧,Qullat Muhafiz,Qullat Muḩāfiz̧ 25.15848 55.93008 T PLN AE 06 0 164 Asia/Dubai 2011-11-06 +291385 Mughīlah Mughilah Mughila,Mughilah,Mughīlah 23.78842 55.18178 T DPR AE 01 0 113 Asia/Dubai 2011-11-06 +291386 Mughayyin Mughayyin Mughaiyin,Mughayyin 23.89196 52.78213 T SAND AE 01 0 69 Asia/Dubai 2011-11-06 diff -r d4d36b583f40 -r a4fcee1e9789 dataimport/test/data/people.csv --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dataimport/test/data/people.csv Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,3 @@ +# uri,name,knows +http://www.example.org/alice,Alice, +http://www.example.org/bob,Bob,http://www.example.org/alice diff -r d4d36b583f40 -r a4fcee1e9789 dataimport/test/data/schema.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dataimport/test/data/schema.py Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,29 @@ +# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr +# +# This file is part of CubicWeb. +# +# CubicWeb is free software: you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 2.1 of the License, or (at your option) +# any later version. +# +# CubicWeb is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with CubicWeb. If not, see . + +from yams.buildobjs import EntityType, String, SubjectRelation + +from cubicweb.schema import RQLConstraint + + +class Personne(EntityType): + nom = String(required=True) + prenom = String() + enfant = SubjectRelation('Personne', inlined=True, cardinality='?*') + connait = SubjectRelation('Personne', symmetric=True, + constraints=[RQLConstraint('NOT S identity O')]) diff -r d4d36b583f40 -r a4fcee1e9789 dataimport/test/data/timeZones.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dataimport/test/data/timeZones.txt Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,410 @@ +Africa/Abidjan 0.0 0.0 0.0 +Africa/Accra 0.0 0.0 0.0 +Africa/Addis_Ababa 3.0 3.0 3.0 +Africa/Algiers 1.0 1.0 1.0 +Africa/Asmara 3.0 3.0 3.0 +Africa/Bamako 0.0 0.0 0.0 +Africa/Bangui 1.0 1.0 1.0 +Africa/Banjul 0.0 0.0 0.0 +Africa/Bissau 0.0 0.0 0.0 +Africa/Blantyre 2.0 2.0 2.0 +Africa/Brazzaville 1.0 1.0 1.0 +Africa/Bujumbura 2.0 2.0 2.0 +Africa/Cairo 2.0 2.0 2.0 +Africa/Casablanca 0.0 1.0 0.0 +Africa/Ceuta 1.0 2.0 1.0 +Africa/Conakry 0.0 0.0 0.0 +Africa/Dakar 0.0 0.0 0.0 +Africa/Dar_es_Salaam 3.0 3.0 3.0 +Africa/Djibouti 3.0 3.0 3.0 +Africa/Douala 1.0 1.0 1.0 +Africa/El_Aaiun 0.0 0.0 0.0 +Africa/Freetown 0.0 0.0 0.0 +Africa/Gaborone 2.0 2.0 2.0 +Africa/Harare 2.0 2.0 2.0 +Africa/Johannesburg 2.0 2.0 2.0 +Africa/Kampala 3.0 3.0 3.0 +Africa/Khartoum 3.0 3.0 3.0 +Africa/Kigali 2.0 2.0 2.0 +Africa/Kinshasa 1.0 1.0 1.0 +Africa/Lagos 1.0 1.0 1.0 +Africa/Libreville 1.0 1.0 1.0 +Africa/Lome 0.0 0.0 0.0 +Africa/Luanda 1.0 1.0 1.0 +Africa/Lubumbashi 2.0 2.0 2.0 +Africa/Lusaka 2.0 2.0 2.0 +Africa/Malabo 1.0 1.0 1.0 +Africa/Maputo 2.0 2.0 2.0 +Africa/Maseru 2.0 2.0 2.0 +Africa/Mbabane 2.0 2.0 2.0 +Africa/Mogadishu 3.0 3.0 3.0 +Africa/Monrovia 0.0 0.0 0.0 +Africa/Nairobi 3.0 3.0 3.0 +Africa/Ndjamena 1.0 1.0 1.0 +Africa/Niamey 1.0 1.0 1.0 +Africa/Nouakchott 0.0 0.0 0.0 +Africa/Ouagadougou 0.0 0.0 0.0 +Africa/Porto-Novo 1.0 1.0 1.0 +Africa/Sao_Tome 0.0 0.0 0.0 +Africa/Tripoli 2.0 2.0 2.0 +Africa/Tunis 1.0 1.0 1.0 +Africa/Windhoek 2.0 1.0 1.0 +America/Adak -10.0 -9.0 -10.0 +America/Anchorage -9.0 -8.0 -9.0 +America/Anguilla -4.0 -4.0 -4.0 +America/Antigua -4.0 -4.0 -4.0 +America/Araguaina -3.0 -3.0 -3.0 +America/Argentina/Buenos_Aires -3.0 -3.0 -3.0 +America/Argentina/Catamarca -3.0 -3.0 -3.0 +America/Argentina/Cordoba -3.0 -3.0 -3.0 +America/Argentina/Jujuy -3.0 -3.0 -3.0 +America/Argentina/La_Rioja -3.0 -3.0 -3.0 +America/Argentina/Mendoza -3.0 -3.0 -3.0 +America/Argentina/Rio_Gallegos -3.0 -3.0 -3.0 +America/Argentina/Salta -3.0 -3.0 -3.0 +America/Argentina/San_Juan -3.0 -3.0 -3.0 +America/Argentina/San_Luis -3.0 -3.0 -4.0 +America/Argentina/Tucuman -3.0 -3.0 -3.0 +America/Argentina/Ushuaia -3.0 -3.0 -3.0 +America/Aruba -4.0 -4.0 -4.0 +America/Asuncion -3.0 -4.0 -4.0 +America/Atikokan -5.0 -5.0 -5.0 +America/Bahia -3.0 -3.0 -3.0 +America/Bahia_Banderas -6.0 -5.0 -6.0 +America/Barbados -4.0 -4.0 -4.0 +America/Belem -3.0 -3.0 -3.0 +America/Belize -6.0 -6.0 -6.0 +America/Blanc-Sablon -4.0 -4.0 -4.0 +America/Boa_Vista -4.0 -4.0 -4.0 +America/Bogota -5.0 -5.0 -5.0 +America/Boise -7.0 -6.0 -7.0 +America/Cambridge_Bay -7.0 -6.0 -7.0 +America/Campo_Grande -3.0 -4.0 -4.0 +America/Cancun -6.0 -5.0 -6.0 +America/Caracas -4.5 -4.5 -4.5 +America/Cayenne -3.0 -3.0 -3.0 +America/Cayman -5.0 -5.0 -5.0 +America/Chicago -6.0 -5.0 -6.0 +America/Chihuahua -7.0 -6.0 -7.0 +America/Costa_Rica -6.0 -6.0 -6.0 +America/Cuiaba -3.0 -4.0 -4.0 +America/Curacao -4.0 -4.0 -4.0 +America/Danmarkshavn 0.0 0.0 0.0 +America/Dawson -8.0 -7.0 -8.0 +America/Dawson_Creek -7.0 -7.0 -7.0 +America/Denver -7.0 -6.0 -7.0 +America/Detroit -5.0 -4.0 -5.0 +America/Dominica -4.0 -4.0 -4.0 +America/Edmonton -7.0 -6.0 -7.0 +America/Eirunepe -4.0 -4.0 -4.0 +America/El_Salvador -6.0 -6.0 -6.0 +America/Fortaleza -3.0 -3.0 -3.0 +America/Glace_Bay -4.0 -3.0 -4.0 +America/Godthab -3.0 -2.0 -3.0 +America/Goose_Bay -4.0 -3.0 -4.0 +America/Grand_Turk -5.0 -4.0 -5.0 +America/Grenada -4.0 -4.0 -4.0 +America/Guadeloupe -4.0 -4.0 -4.0 +America/Guatemala -6.0 -6.0 -6.0 +America/Guayaquil -5.0 -5.0 -5.0 +America/Guyana -4.0 -4.0 -4.0 +America/Halifax -4.0 -3.0 -4.0 +America/Havana -5.0 -4.0 -5.0 +America/Hermosillo -7.0 -7.0 -7.0 +America/Indiana/Indianapolis -5.0 -4.0 -5.0 +America/Indiana/Knox -6.0 -5.0 -6.0 +America/Indiana/Marengo -5.0 -4.0 -5.0 +America/Indiana/Petersburg -5.0 -4.0 -5.0 +America/Indiana/Tell_City -6.0 -5.0 -6.0 +America/Indiana/Vevay -5.0 -4.0 -5.0 +America/Indiana/Vincennes -5.0 -4.0 -5.0 +America/Indiana/Winamac -5.0 -4.0 -5.0 +America/Inuvik -7.0 -6.0 -7.0 +America/Iqaluit -5.0 -4.0 -5.0 +America/Jamaica -5.0 -5.0 -5.0 +America/Juneau -9.0 -8.0 -9.0 +America/Kentucky/Louisville -5.0 -4.0 -5.0 +America/Kentucky/Monticello -5.0 -4.0 -5.0 +America/La_Paz -4.0 -4.0 -4.0 +America/Lima -5.0 -5.0 -5.0 +America/Los_Angeles -8.0 -7.0 -8.0 +America/Maceio -3.0 -3.0 -3.0 +America/Managua -6.0 -6.0 -6.0 +America/Manaus -4.0 -4.0 -4.0 +America/Marigot -4.0 -4.0 -4.0 +America/Martinique -4.0 -4.0 -4.0 +America/Matamoros -6.0 -5.0 -6.0 +America/Mazatlan -7.0 -6.0 -7.0 +America/Menominee -6.0 -5.0 -6.0 +America/Merida -6.0 -5.0 -6.0 +America/Metlakatla -8.0 -8.0 -8.0 +America/Mexico_City -6.0 -5.0 -6.0 +America/Miquelon -3.0 -2.0 -3.0 +America/Moncton -4.0 -3.0 -4.0 +America/Monterrey -6.0 -5.0 -6.0 +America/Montevideo -2.0 -3.0 -3.0 +America/Montreal -5.0 -4.0 -5.0 +America/Montserrat -4.0 -4.0 -4.0 +America/Nassau -5.0 -4.0 -5.0 +America/New_York -5.0 -4.0 -5.0 +America/Nipigon -5.0 -4.0 -5.0 +America/Nome -9.0 -8.0 -9.0 +America/Noronha -2.0 -2.0 -2.0 +America/North_Dakota/Beulah -6.0 -5.0 -6.0 +America/North_Dakota/Center -6.0 -5.0 -6.0 +America/North_Dakota/New_Salem -6.0 -5.0 -6.0 +America/Ojinaga -7.0 -6.0 -7.0 +America/Panama -5.0 -5.0 -5.0 +America/Pangnirtung -5.0 -4.0 -5.0 +America/Paramaribo -3.0 -3.0 -3.0 +America/Phoenix -7.0 -7.0 -7.0 +America/Port-au-Prince -5.0 -5.0 -5.0 +America/Port_of_Spain -4.0 -4.0 -4.0 +America/Porto_Velho -4.0 -4.0 -4.0 +America/Puerto_Rico -4.0 -4.0 -4.0 +America/Rainy_River -6.0 -5.0 -6.0 +America/Rankin_Inlet -6.0 -5.0 -6.0 +America/Recife -3.0 -3.0 -3.0 +America/Regina -6.0 -6.0 -6.0 +America/Resolute -6.0 -5.0 -6.0 +America/Rio_Branco -4.0 -4.0 -4.0 +America/Santa_Isabel -8.0 -7.0 -8.0 +America/Santarem -3.0 -3.0 -3.0 +America/Santiago -3.0 -4.0 -4.0 +America/Santo_Domingo -4.0 -4.0 -4.0 +America/Sao_Paulo -2.0 -3.0 -3.0 +America/Scoresbysund -1.0 0.0 -1.0 +America/Shiprock -7.0 -6.0 -7.0 +America/Sitka -9.0 -8.0 -9.0 +America/St_Barthelemy -4.0 -4.0 -4.0 +America/St_Johns -3.5 -2.5 -3.5 +America/St_Kitts -4.0 -4.0 -4.0 +America/St_Lucia -4.0 -4.0 -4.0 +America/St_Thomas -4.0 -4.0 -4.0 +America/St_Vincent -4.0 -4.0 -4.0 +America/Swift_Current -6.0 -6.0 -6.0 +America/Tegucigalpa -6.0 -6.0 -6.0 +America/Thule -4.0 -3.0 -4.0 +America/Thunder_Bay -5.0 -4.0 -5.0 +America/Tijuana -8.0 -7.0 -8.0 +America/Toronto -5.0 -4.0 -5.0 +America/Tortola -4.0 -4.0 -4.0 +America/Vancouver -8.0 -7.0 -8.0 +America/Whitehorse -8.0 -7.0 -8.0 +America/Winnipeg -6.0 -5.0 -6.0 +America/Yakutat -9.0 -8.0 -9.0 +America/Yellowknife -7.0 -6.0 -7.0 +Antarctica/Casey 8.0 8.0 8.0 +Antarctica/Davis 7.0 7.0 7.0 +Antarctica/DumontDUrville 10.0 10.0 10.0 +Antarctica/Macquarie 11.0 11.0 11.0 +Antarctica/Mawson 5.0 5.0 5.0 +Antarctica/McMurdo 13.0 12.0 12.0 +Antarctica/Palmer -3.0 -4.0 -4.0 +Antarctica/Rothera -3.0 -3.0 -3.0 +Antarctica/South_Pole 13.0 12.0 12.0 +Antarctica/Syowa 3.0 3.0 3.0 +Antarctica/Vostok 6.0 6.0 6.0 +Arctic/Longyearbyen 1.0 2.0 1.0 +Asia/Aden 3.0 3.0 3.0 +Asia/Almaty 6.0 6.0 6.0 +Asia/Amman 2.0 3.0 2.0 +Asia/Anadyr 11.0 12.0 12.0 +Asia/Aqtau 5.0 5.0 5.0 +Asia/Aqtobe 5.0 5.0 5.0 +Asia/Ashgabat 5.0 5.0 5.0 +Asia/Baghdad 3.0 3.0 3.0 +Asia/Bahrain 3.0 3.0 3.0 +Asia/Baku 4.0 5.0 4.0 +Asia/Bangkok 7.0 7.0 7.0 +Asia/Beirut 2.0 3.0 2.0 +Asia/Bishkek 6.0 6.0 6.0 +Asia/Brunei 8.0 8.0 8.0 +Asia/Choibalsan 8.0 8.0 8.0 +Asia/Chongqing 8.0 8.0 8.0 +Asia/Colombo 5.5 5.5 5.5 +Asia/Damascus 2.0 3.0 2.0 +Asia/Dhaka 6.0 6.0 6.0 +Asia/Dili 9.0 9.0 9.0 +Asia/Dubai 4.0 4.0 4.0 +Asia/Dushanbe 5.0 5.0 5.0 +Asia/Gaza 2.0 3.0 2.0 +Asia/Harbin 8.0 8.0 8.0 +Asia/Ho_Chi_Minh 7.0 7.0 7.0 +Asia/Hong_Kong 8.0 8.0 8.0 +Asia/Hovd 7.0 7.0 7.0 +Asia/Irkutsk 8.0 9.0 9.0 +Asia/Jakarta 7.0 7.0 7.0 +Asia/Jayapura 9.0 9.0 9.0 +Asia/Jerusalem 2.0 3.0 2.0 +Asia/Kabul 4.5 4.5 4.5 +Asia/Kamchatka 11.0 12.0 12.0 +Asia/Karachi 5.0 5.0 5.0 +Asia/Kashgar 8.0 8.0 8.0 +Asia/Kathmandu 5.75 5.75 5.75 +Asia/Kolkata 5.5 5.5 5.5 +Asia/Krasnoyarsk 7.0 8.0 8.0 +Asia/Kuala_Lumpur 8.0 8.0 8.0 +Asia/Kuching 8.0 8.0 8.0 +Asia/Kuwait 3.0 3.0 3.0 +Asia/Macau 8.0 8.0 8.0 +Asia/Magadan 11.0 12.0 12.0 +Asia/Makassar 8.0 8.0 8.0 +Asia/Manila 8.0 8.0 8.0 +Asia/Muscat 4.0 4.0 4.0 +Asia/Nicosia 2.0 3.0 2.0 +Asia/Novokuznetsk 6.0 7.0 7.0 +Asia/Novosibirsk 6.0 7.0 7.0 +Asia/Omsk 6.0 7.0 7.0 +Asia/Oral 5.0 5.0 5.0 +Asia/Phnom_Penh 7.0 7.0 7.0 +Asia/Pontianak 7.0 7.0 7.0 +Asia/Pyongyang 9.0 9.0 9.0 +Asia/Qatar 3.0 3.0 3.0 +Asia/Qyzylorda 6.0 6.0 6.0 +Asia/Rangoon 6.5 6.5 6.5 +Asia/Riyadh 3.0 3.0 3.0 +Asia/Sakhalin 10.0 11.0 11.0 +Asia/Samarkand 5.0 5.0 5.0 +Asia/Seoul 9.0 9.0 9.0 +Asia/Shanghai 8.0 8.0 8.0 +Asia/Singapore 8.0 8.0 8.0 +Asia/Taipei 8.0 8.0 8.0 +Asia/Tashkent 5.0 5.0 5.0 +Asia/Tbilisi 4.0 4.0 4.0 +Asia/Tehran 3.5 4.5 3.5 +Asia/Thimphu 6.0 6.0 6.0 +Asia/Tokyo 9.0 9.0 9.0 +Asia/Ulaanbaatar 8.0 8.0 8.0 +Asia/Urumqi 8.0 8.0 8.0 +Asia/Vientiane 7.0 7.0 7.0 +Asia/Vladivostok 10.0 11.0 11.0 +Asia/Yakutsk 9.0 10.0 10.0 +Asia/Yekaterinburg 5.0 6.0 6.0 +Asia/Yerevan 4.0 5.0 4.0 +Atlantic/Azores -1.0 0.0 -1.0 +Atlantic/Bermuda -4.0 -3.0 -4.0 +Atlantic/Canary 0.0 1.0 0.0 +Atlantic/Cape_Verde -1.0 -1.0 -1.0 +Atlantic/Faroe 0.0 1.0 0.0 +Atlantic/Madeira 0.0 1.0 0.0 +Atlantic/Reykjavik 0.0 0.0 0.0 +Atlantic/South_Georgia -2.0 -2.0 -2.0 +Atlantic/St_Helena 0.0 0.0 0.0 +Atlantic/Stanley -3.0 -3.0 -4.0 +Australia/Adelaide 10.5 9.5 9.5 +Australia/Brisbane 10.0 10.0 10.0 +Australia/Broken_Hill 10.5 9.5 9.5 +Australia/Currie 11.0 10.0 10.0 +Australia/Darwin 9.5 9.5 9.5 +Australia/Eucla 8.75 8.75 8.75 +Australia/Hobart 11.0 10.0 10.0 +Australia/Lindeman 10.0 10.0 10.0 +Australia/Lord_Howe 11.0 10.5 10.5 +Australia/Melbourne 11.0 10.0 10.0 +Australia/Perth 8.0 8.0 8.0 +Australia/Sydney 11.0 10.0 10.0 +Europe/Amsterdam 1.0 2.0 1.0 +Europe/Andorra 1.0 2.0 1.0 +Europe/Athens 2.0 3.0 2.0 +Europe/Belgrade 1.0 2.0 1.0 +Europe/Berlin 1.0 2.0 1.0 +Europe/Bratislava 1.0 2.0 1.0 +Europe/Brussels 1.0 2.0 1.0 +Europe/Bucharest 2.0 3.0 2.0 +Europe/Budapest 1.0 2.0 1.0 +Europe/Chisinau 2.0 3.0 2.0 +Europe/Copenhagen 1.0 2.0 1.0 +Europe/Dublin 0.0 1.0 0.0 +Europe/Gibraltar 1.0 2.0 1.0 +Europe/Guernsey 0.0 1.0 0.0 +Europe/Helsinki 2.0 3.0 2.0 +Europe/Isle_of_Man 0.0 1.0 0.0 +Europe/Istanbul 2.0 3.0 2.0 +Europe/Jersey 0.0 1.0 0.0 +Europe/Kaliningrad 2.0 3.0 3.0 +Europe/Kiev 2.0 3.0 3.0 +Europe/Lisbon 0.0 1.0 0.0 +Europe/Ljubljana 1.0 2.0 1.0 +Europe/London 0.0 1.0 0.0 +Europe/Luxembourg 1.0 2.0 1.0 +Europe/Madrid 1.0 2.0 1.0 +Europe/Malta 1.0 2.0 1.0 +Europe/Mariehamn 2.0 3.0 2.0 +Europe/Minsk 2.0 3.0 3.0 +Europe/Monaco 1.0 2.0 1.0 +Europe/Moscow 3.0 4.0 4.0 +Europe/Oslo 1.0 2.0 1.0 +Europe/Paris 1.0 2.0 1.0 +Europe/Podgorica 1.0 2.0 1.0 +Europe/Prague 1.0 2.0 1.0 +Europe/Riga 2.0 3.0 2.0 +Europe/Rome 1.0 2.0 1.0 +Europe/Samara 3.0 4.0 4.0 +Europe/San_Marino 1.0 2.0 1.0 +Europe/Sarajevo 1.0 2.0 1.0 +Europe/Simferopol 2.0 3.0 3.0 +Europe/Skopje 1.0 2.0 1.0 +Europe/Sofia 2.0 3.0 2.0 +Europe/Stockholm 1.0 2.0 1.0 +Europe/Tallinn 2.0 3.0 2.0 +Europe/Tirane 1.0 2.0 1.0 +Europe/Uzhgorod 2.0 3.0 3.0 +Europe/Vaduz 1.0 2.0 1.0 +Europe/Vatican 1.0 2.0 1.0 +Europe/Vienna 1.0 2.0 1.0 +Europe/Vilnius 2.0 3.0 2.0 +Europe/Volgograd 3.0 4.0 4.0 +Europe/Warsaw 1.0 2.0 1.0 +Europe/Zagreb 1.0 2.0 1.0 +Europe/Zaporozhye 2.0 3.0 3.0 +Europe/Zurich 1.0 2.0 1.0 +Indian/Antananarivo 3.0 3.0 3.0 +Indian/Chagos 6.0 6.0 6.0 +Indian/Christmas 7.0 7.0 7.0 +Indian/Cocos 6.5 6.5 6.5 +Indian/Comoro 3.0 3.0 3.0 +Indian/Kerguelen 5.0 5.0 5.0 +Indian/Mahe 4.0 4.0 4.0 +Indian/Maldives 5.0 5.0 5.0 +Indian/Mauritius 4.0 4.0 4.0 +Indian/Mayotte 3.0 3.0 3.0 +Indian/Reunion 4.0 4.0 4.0 +Pacific/Apia -10.0 -11.0 -11.0 +Pacific/Auckland 13.0 12.0 12.0 +Pacific/Chatham 13.75 12.75 12.75 +Pacific/Chuuk 10.0 10.0 10.0 +Pacific/Easter -5.0 -6.0 -6.0 +Pacific/Efate 11.0 11.0 11.0 +Pacific/Enderbury 13.0 13.0 13.0 +Pacific/Fakaofo -10.0 -10.0 -10.0 +Pacific/Fiji 13.0 12.0 12.0 +Pacific/Funafuti 12.0 12.0 12.0 +Pacific/Galapagos -6.0 -6.0 -6.0 +Pacific/Gambier -9.0 -9.0 -9.0 +Pacific/Guadalcanal 11.0 11.0 11.0 +Pacific/Guam 10.0 10.0 10.0 +Pacific/Honolulu -10.0 -10.0 -10.0 +Pacific/Johnston -10.0 -10.0 -10.0 +Pacific/Kiritimati 14.0 14.0 14.0 +Pacific/Kosrae 11.0 11.0 11.0 +Pacific/Kwajalein 12.0 12.0 12.0 +Pacific/Majuro 12.0 12.0 12.0 +Pacific/Marquesas -9.5 -9.5 -9.5 +Pacific/Midway -11.0 -11.0 -11.0 +Pacific/Nauru 12.0 12.0 12.0 +Pacific/Niue -11.0 -11.0 -11.0 +Pacific/Norfolk 11.5 11.5 11.5 +Pacific/Noumea 11.0 11.0 11.0 +Pacific/Pago_Pago -11.0 -11.0 -11.0 +Pacific/Palau 9.0 9.0 9.0 +Pacific/Pitcairn -8.0 -8.0 -8.0 +Pacific/Pohnpei 11.0 11.0 11.0 +Pacific/Port_Moresby 10.0 10.0 10.0 +Pacific/Rarotonga -10.0 -10.0 -10.0 +Pacific/Saipan 10.0 10.0 10.0 +Pacific/Tahiti -10.0 -10.0 -10.0 +Pacific/Tarawa 12.0 12.0 12.0 +Pacific/Tongatapu 13.0 13.0 13.0 +Pacific/Wake 12.0 12.0 12.0 +Pacific/Wallis 12.0 12.0 12.0 diff -r d4d36b583f40 -r a4fcee1e9789 dataimport/test/test_csv.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dataimport/test/test_csv.py Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,72 @@ +# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr +# +# This file is part of CubicWeb. +# +# CubicWeb is free software: you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 2.1 of the License, or (at your option) +# any later version. +# +# CubicWeb is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with CubicWeb. If not, see . +"""unittest for cubicweb.dataimport.csv""" + +from StringIO import StringIO + +from logilab.common.testlib import TestCase, unittest_main + +from cubicweb.dataimport import csv + + +class UcsvreaderTC(TestCase): + + def test_empty_lines_skipped(self): + stream = StringIO('''a,b,c,d, +1,2,3,4, +,,,, +,,,, +''') + self.assertEqual([[u'a', u'b', u'c', u'd', u''], + [u'1', u'2', u'3', u'4', u''], + ], + list(csv.ucsvreader(stream))) + stream.seek(0) + self.assertEqual([[u'a', u'b', u'c', u'd', u''], + [u'1', u'2', u'3', u'4', u''], + [u'', u'', u'', u'', u''], + [u'', u'', u'', u'', u''] + ], + list(csv.ucsvreader(stream, skip_empty=False))) + + def test_skip_first(self): + stream = StringIO('a,b,c,d,\n1,2,3,4,\n') + reader = csv.ucsvreader(stream, skipfirst=True, ignore_errors=True) + self.assertEqual(list(reader), + [[u'1', u'2', u'3', u'4', u'']]) + + stream.seek(0) + reader = csv.ucsvreader(stream, skipfirst=True, ignore_errors=False) + self.assertEqual(list(reader), + [[u'1', u'2', u'3', u'4', u'']]) + + stream.seek(0) + reader = csv.ucsvreader(stream, skipfirst=False, ignore_errors=True) + self.assertEqual(list(reader), + [[u'a', u'b', u'c', u'd', u''], + [u'1', u'2', u'3', u'4', u'']]) + + stream.seek(0) + reader = csv.ucsvreader(stream, skipfirst=False, ignore_errors=False) + self.assertEqual(list(reader), + [[u'a', u'b', u'c', u'd', u''], + [u'1', u'2', u'3', u'4', u'']]) + + +if __name__ == '__main__': + unittest_main() diff -r d4d36b583f40 -r a4fcee1e9789 dataimport/test/test_pgstore.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dataimport/test/test_pgstore.py Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,93 @@ +# coding: utf-8 +# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr +# +# This file is part of CubicWeb. +# +# CubicWeb is free software: you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 2.1 of the License, or (at your option) +# any later version. +# +# CubicWeb is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with CubicWeb. If not, see . +"""unittest for cubicweb.dataimport.pgstore""" + +import datetime as DT + +from logilab.common.testlib import TestCase, unittest_main + +from cubicweb.dataimport import pgstore + + +class CreateCopyFromBufferTC(TestCase): + + # test converters + + def test_convert_none(self): + cnvt = pgstore._copyfrom_buffer_convert_None + self.assertEqual('NULL', cnvt(None)) + + def test_convert_number(self): + cnvt = pgstore._copyfrom_buffer_convert_number + self.assertEqual('42', cnvt(42)) + self.assertEqual('42', cnvt(42L)) + self.assertEqual('42.42', cnvt(42.42)) + + def test_convert_string(self): + cnvt = pgstore._copyfrom_buffer_convert_string + # simple + self.assertEqual('babar', cnvt('babar')) + # unicode + self.assertEqual('\xc3\xa9l\xc3\xa9phant', cnvt(u'éléphant')) + self.assertEqual('\xe9l\xe9phant', cnvt(u'éléphant', encoding='latin1')) + # escaping + self.assertEqual('babar\\tceleste\\n', cnvt('babar\tceleste\n')) + self.assertEqual(r'C:\\new\tC:\\test', cnvt('C:\\new\tC:\\test')) + + def test_convert_date(self): + cnvt = pgstore._copyfrom_buffer_convert_date + self.assertEqual('0666-01-13', cnvt(DT.date(666, 1, 13))) + + def test_convert_time(self): + cnvt = pgstore._copyfrom_buffer_convert_time + self.assertEqual('06:06:06.000100', cnvt(DT.time(6, 6, 6, 100))) + + def test_convert_datetime(self): + cnvt = pgstore._copyfrom_buffer_convert_datetime + self.assertEqual('0666-06-13 06:06:06.000000', cnvt(DT.datetime(666, 6, 13, 6, 6, 6))) + + # test buffer + def test_create_copyfrom_buffer_tuple(self): + data = ((42, 42L, 42.42, u'éléphant', DT.date(666, 1, 13), DT.time(6, 6, 6), + DT.datetime(666, 6, 13, 6, 6, 6)), + (6, 6L, 6.6, u'babar', DT.date(2014, 1, 14), DT.time(4, 2, 1), + DT.datetime(2014, 1, 1, 0, 0, 0))) + results = pgstore._create_copyfrom_buffer(data) + # all columns + expected = '''42\t42\t42.42\téléphant\t0666-01-13\t06:06:06.000000\t0666-06-13 06:06:06.000000 +6\t6\t6.6\tbabar\t2014-01-14\t04:02:01.000000\t2014-01-01 00:00:00.000000''' + self.assertMultiLineEqual(expected, results.getvalue()) + # selected columns + results = pgstore._create_copyfrom_buffer(data, columns=(1, 3, 6)) + expected = '''42\téléphant\t0666-06-13 06:06:06.000000 +6\tbabar\t2014-01-01 00:00:00.000000''' + self.assertMultiLineEqual(expected, results.getvalue()) + + def test_create_copyfrom_buffer_dict(self): + data = (dict(integer=42, double=42.42, text=u'éléphant', + date=DT.datetime(666, 6, 13, 6, 6, 6)), + dict(integer=6, double=6.6, text=u'babar', + date=DT.datetime(2014, 1, 1, 0, 0, 0))) + results = pgstore._create_copyfrom_buffer(data, ('integer', 'text')) + expected = '''42\téléphant\n6\tbabar''' + self.assertMultiLineEqual(expected, results.getvalue()) + + +if __name__ == '__main__': + unittest_main() diff -r d4d36b583f40 -r a4fcee1e9789 dataimport/test/test_sqlgenstore.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dataimport/test/test_sqlgenstore.py Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,124 @@ +# -*- coding: utf-8 -*- +# copyright 2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# contact http://www.logilab.fr -- mailto:contact@logilab.fr +# +# This program is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 2.1 of the License, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with this program. If not, see . +"""SQL object store test case""" + +import itertools + +from cubicweb.dataimport import ucsvreader +from cubicweb.devtools import testlib, PostgresApptestConfiguration +from cubicweb.devtools import startpgcluster, stoppgcluster +from cubicweb.dataimport.pgstore import SQLGenObjectStore + + +def setUpModule(): + startpgcluster(__file__) + + +def tearDownModule(*args): + stoppgcluster(__file__) + + +class SQLGenImportSimpleTC(testlib.CubicWebTC): + configcls = PostgresApptestConfiguration + appid = 'data-massimport' + + def cast(self, _type, value): + try: + return _type(value) + except ValueError: + return None + + def push_geonames_data(self, dumpname, store): + # Push timezones + cnx = store._cnx + for code, gmt, dst, raw_offset in ucsvreader(open(self.datapath('timeZones.txt'), 'rb'), + delimiter='\t'): + cnx.create_entity('TimeZone', code=code, gmt=float(gmt), + dst=float(dst), raw_offset=float(raw_offset)) + timezone_code = dict(cnx.execute('Any C, X WHERE X is TimeZone, X code C')) + cnx.commit() + # Push data + for ind, infos in enumerate(ucsvreader(open(dumpname, 'rb'), + delimiter='\t', + ignore_errors=True)): + if ind > 99: + break + latitude = self.cast(float, infos[4]) + longitude = self.cast(float, infos[5]) + population = self.cast(int, infos[14]) + elevation = self.cast(int, infos[15]) + gtopo = self.cast(int, infos[16]) + feature_class = infos[6] + if len(infos[6]) != 1: + feature_class = None + entity = {'name': infos[1], + 'asciiname': infos[2], + 'alternatenames': infos[3], + 'latitude': latitude, 'longitude': longitude, + 'feature_class': feature_class, + 'alternate_country_code':infos[9], + 'admin_code_3': infos[12], + 'admin_code_4': infos[13], + 'population': population, 'elevation': elevation, + 'gtopo30': gtopo, 'timezone': timezone_code.get(infos[17]), + 'cwuri': u'http://sws.geonames.org/%s/' % int(infos[0]), + 'geonameid': int(infos[0]), + } + store.prepare_insert_entity('Location', **entity) + + def test_autoflush_metadata(self): + with self.admin_access.repo_cnx() as cnx: + crs = cnx.system_sql('SELECT * FROM entities WHERE type=%(t)s', + {'t': 'Location'}) + self.assertEqual(len(crs.fetchall()), 0) + store = SQLGenObjectStore(cnx) + store.prepare_insert_entity('Location', name=u'toto') + store.flush() + store.commit() + cnx.commit() + with self.admin_access.repo_cnx() as cnx: + crs = cnx.system_sql('SELECT * FROM entities WHERE type=%(t)s', + {'t': 'Location'}) + self.assertEqual(len(crs.fetchall()), 1) + + def test_sqlgenstore_etype_metadata(self): + with self.admin_access.repo_cnx() as cnx: + store = SQLGenObjectStore(cnx) + timezone_eid = store.prepare_insert_entity('TimeZone') + store.prepare_insert_entity('Location', timezone=timezone_eid) + store.flush() + store.commit() + eid, etname = cnx.execute('Any X, TN WHERE X timezone TZ, X is T, ' + 'T name TN')[0] + self.assertEqual(cnx.entity_from_eid(eid).cw_etype, etname) + + def test_simple_insert(self): + with self.admin_access.repo_cnx() as cnx: + store = SQLGenObjectStore(cnx) + self.push_geonames_data(self.datapath('geonames.csv'), store) + store.flush() + store.commit() + with self.admin_access.repo_cnx() as cnx: + rset = cnx.execute('Any X WHERE X is Location') + self.assertEqual(len(rset), 100) + rset = cnx.execute('Any X WHERE X is Location, X timezone T') + self.assertEqual(len(rset), 100) + + +if __name__ == '__main__': + from logilab.common.testlib import unittest_main + unittest_main() diff -r d4d36b583f40 -r a4fcee1e9789 dataimport/test/test_stores.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dataimport/test/test_stores.py Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,88 @@ +# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr +# +# This file is part of CubicWeb. +# +# CubicWeb is free software: you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 2.1 of the License, or (at your option) +# any later version. +# +# CubicWeb is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with CubicWeb. If not, see . +"""unittest for cubicweb.dataimport.stores""" + +import datetime as DT + +from cubicweb.dataimport import stores +from cubicweb.devtools.testlib import CubicWebTC + + +class RQLObjectStoreTC(CubicWebTC): + + def test_all(self): + with self.admin_access.repo_cnx() as cnx: + store = stores.RQLObjectStore(cnx) + # Check data insertion + group_eid = store.prepare_insert_entity('CWGroup', name=u'grp') + user_eid = store.prepare_insert_entity('CWUser', login=u'lgn', + upassword=u'pwd') + store.prepare_insert_relation(user_eid, 'in_group', group_eid) + cnx.commit() + users = cnx.execute('CWUser X WHERE X login "lgn"') + self.assertEqual(1, len(users)) + self.assertEqual(user_eid, users.one().eid) + groups = cnx.execute('CWGroup X WHERE U in_group X, U login "lgn"') + self.assertEqual(1, len(users)) + self.assertEqual(group_eid, groups.one().eid) + # Check data update + self.set_description('Check data update') + store.prepare_update_entity('CWGroup', group_eid, name=u'new_grp') + cnx.commit() + group = cnx.execute('CWGroup X WHERE X name "grp"') + self.assertEqual(len(group), 0) + group = cnx.execute('CWGroup X WHERE X name "new_grp"') + self.assertEqual, len(group), 1 + # Check data update with wrong type + with self.assertRaises(AssertionError): + store.prepare_update_entity('CWUser', group_eid, name=u'new_user') + cnx.commit() + group = cnx.execute('CWGroup X WHERE X name "new_user"') + self.assertEqual(len(group), 0) + group = cnx.execute('CWGroup X WHERE X name "new_grp"') + self.assertEqual(len(group), 1) + + +class MetaGeneratorTC(CubicWebTC): + + def test_dont_generate_relation_to_internal_manager(self): + with self.admin_access.repo_cnx() as cnx: + metagen = stores.MetaGenerator(cnx) + self.assertIn('created_by', metagen.etype_rels) + self.assertIn('owned_by', metagen.etype_rels) + with self.repo.internal_cnx() as cnx: + metagen = stores.MetaGenerator(cnx) + self.assertNotIn('created_by', metagen.etype_rels) + self.assertNotIn('owned_by', metagen.etype_rels) + + def test_dont_generate_specified_values(self): + with self.admin_access.repo_cnx() as cnx: + metagen = stores.MetaGenerator(cnx) + # hijack gen_modification_date to ensure we don't go through it + metagen.gen_modification_date = None + md = DT.datetime.now() - DT.timedelta(days=1) + entity, rels = metagen.base_etype_dicts('CWUser') + entity.cw_edited.update(dict(modification_date=md)) + with cnx.ensure_cnx_set: + metagen.init_entity(entity) + self.assertEqual(entity.cw_edited['modification_date'], md) + + +if __name__ == '__main__': + from logilab.common.testlib import unittest_main + unittest_main() diff -r d4d36b583f40 -r a4fcee1e9789 dataimport/test/unittest_importer.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dataimport/test/unittest_importer.py Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- +# copyright 2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# contact http://www.logilab.fr -- mailto:contact@logilab.fr +# +# This program is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 2.1 of the License, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with this program. If not, see . +"""Tests for cubicweb.dataimport.importer""" + +from collections import defaultdict + +from logilab.common.testlib import TestCase, unittest_main + +from cubicweb import ValidationError +from cubicweb.devtools.testlib import CubicWebTC +from cubicweb.dataimport import RQLObjectStore, ucsvreader +from cubicweb.dataimport.importer import (ExtEntity, ExtEntitiesImporter, SimpleImportLog, + RelationMapping, use_extid_as_cwuri) + + +class RelationMappingTC(CubicWebTC): + + def test_nosource(self): + with self.admin_access.repo_cnx() as cnx: + alice_eid = cnx.create_entity('Personne', nom=u'alice').eid + bob_eid = cnx.create_entity('Personne', nom=u'bob', connait=alice_eid).eid + cnx.commit() + mapping = RelationMapping(cnx) + self.assertEqual(mapping['connait'], + set([(bob_eid, alice_eid), (alice_eid, bob_eid)])) + + def test_with_source(self): + with self.admin_access.repo_cnx() as cnx: + alice_eid = cnx.create_entity('Personne', nom=u'alice').eid + bob_eid = cnx.create_entity('Personne', nom=u'bob', connait=alice_eid).eid + cnx.commit() + mapping = RelationMapping(cnx, cnx.find('CWSource', name=u'system').one()) + self.assertEqual(mapping['connait'], + set([(bob_eid, alice_eid), (alice_eid, bob_eid)])) + + +class ExtEntitiesImporterTC(CubicWebTC): + + def importer(self, cnx): + store = RQLObjectStore(cnx) + return ExtEntitiesImporter(self.schema, store, raise_on_error=True) + + def test_simple_import(self): + with self.admin_access.repo_cnx() as cnx: + importer = self.importer(cnx) + personne = ExtEntity('Personne', 1, {'nom': set([u'de la lune']), + 'prenom': set([u'Jean'])}) + importer.import_entities([personne]) + cnx.commit() + rset = cnx.execute('Any X WHERE X is Personne') + entity = rset.get_entity(0, 0) + self.assertEqual(entity.nom, u'de la lune') + self.assertEqual(entity.prenom, u'Jean') + + def test_import_missing_required_attribute(self): + """Check import of ext entity with missing required attribute""" + with self.admin_access.repo_cnx() as cnx: + importer = self.importer(cnx) + tag = ExtEntity('Personne', 2, {'prenom': set([u'Jean'])}) + self.assertRaises(ValidationError, importer.import_entities, [tag]) + + def test_import_inlined_relation(self): + """Check import of ext entities with inlined relation""" + with self.admin_access.repo_cnx() as cnx: + importer = self.importer(cnx) + richelieu = ExtEntity('Personne', 3, {'nom': set([u'Richelieu']), + 'enfant': set([4])}) + athos = ExtEntity('Personne', 4, {'nom': set([u'Athos'])}) + importer.import_entities([athos, richelieu]) + cnx.commit() + rset = cnx.execute('Any X WHERE X is Personne, X nom "Richelieu"') + entity = rset.get_entity(0, 0) + self.assertEqual(entity.enfant[0].nom, 'Athos') + + def test_import_non_inlined_relation(self): + """Check import of ext entities with non inlined relation""" + with self.admin_access.repo_cnx() as cnx: + importer = self.importer(cnx) + richelieu = ExtEntity('Personne', 5, {'nom': set([u'Richelieu']), + 'connait': set([6])}) + athos = ExtEntity('Personne', 6, {'nom': set([u'Athos'])}) + importer.import_entities([athos, richelieu]) + cnx.commit() + rset = cnx.execute('Any X WHERE X is Personne, X nom "Richelieu"') + entity = rset.get_entity(0, 0) + self.assertEqual(entity.connait[0].nom, 'Athos') + rset = cnx.execute('Any X WHERE X is Personne, X nom "Athos"') + entity = rset.get_entity(0, 0) + self.assertEqual(entity.connait[0].nom, 'Richelieu') + + def test_import_missing_inlined_relation(self): + """Check import of ext entity with missing inlined relation""" + with self.admin_access.repo_cnx() as cnx: + importer = self.importer(cnx) + richelieu = ExtEntity('Personne', 7, + {'nom': set([u'Richelieu']), 'enfant': set([8])}) + self.assertRaises(Exception, importer.import_entities, [richelieu]) + cnx.commit() + rset = cnx.execute('Any X WHERE X is Personne, X nom "Richelieu"') + self.assertEqual(len(rset), 0) + + def test_import_missing_non_inlined_relation(self): + """Check import of ext entity with missing non-inlined relation""" + with self.admin_access.repo_cnx() as cnx: + importer = self.importer(cnx) + richelieu = ExtEntity('Personne', 9, + {'nom': set([u'Richelieu']), 'connait': set([10])}) + self.assertRaises(Exception, importer.import_entities, [richelieu]) + cnx.commit() + rset = cnx.execute('Any X WHERE X is Personne, X nom "Richelieu"') + entity = rset.get_entity(0, 0) + self.assertEqual(entity.nom, u'Richelieu') + self.assertEqual(len(entity.connait), 0) + + def test_update(self): + """Check update of ext entity""" + with self.admin_access.repo_cnx() as cnx: + importer = self.importer(cnx) + # First import + richelieu = ExtEntity('Personne', 11, + {'nom': {u'Richelieu Diacre'}}) + importer.import_entities([richelieu]) + cnx.commit() + rset = cnx.execute('Any X WHERE X is Personne') + entity = rset.get_entity(0, 0) + self.assertEqual(entity.nom, u'Richelieu Diacre') + # Second import + richelieu = ExtEntity('Personne', 11, + {'nom': {u'Richelieu Cardinal'}}) + importer.import_entities([richelieu]) + cnx.commit() + rset = cnx.execute('Any X WHERE X is Personne') + self.assertEqual(len(rset), 1) + entity = rset.get_entity(0, 0) + self.assertEqual(entity.nom, u'Richelieu Cardinal') + + +class UseExtidAsCwuriTC(TestCase): + + def test(self): + personne = ExtEntity('Personne', 1, {'nom': set([u'de la lune']), + 'prenom': set([u'Jean'])}) + mapping = {} + set_cwuri = use_extid_as_cwuri(mapping) + list(set_cwuri((personne,))) + self.assertIn('cwuri', personne.values) + self.assertEqual(personne.values['cwuri'], set(['1'])) + mapping[1] = 'whatever' + personne.values.pop('cwuri') + list(set_cwuri((personne,))) + self.assertNotIn('cwuri', personne.values) + + +def extentities_from_csv(fpath): + """Yield ExtEntity read from `fpath` CSV file.""" + with open(fpath) as f: + for uri, name, knows in ucsvreader(f, skipfirst=True, skip_empty=False): + yield ExtEntity('Personne', uri, + {'nom': set([name]), 'connait': set([knows])}) + + +class DataimportFunctionalTC(CubicWebTC): + + def test_csv(self): + extenties = extentities_from_csv(self.datapath('people.csv')) + with self.admin_access.repo_cnx() as cnx: + store = RQLObjectStore(cnx) + importer = ExtEntitiesImporter(self.schema, store) + importer.import_entities(extenties) + cnx.commit() + rset = cnx.execute('String N WHERE X nom N, X connait Y, Y nom "Alice"') + self.assertEqual(rset[0][0], u'Bob') + + +if __name__ == '__main__': + unittest_main() diff -r d4d36b583f40 -r a4fcee1e9789 dbapi.py --- a/dbapi.py Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,836 +0,0 @@ -# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved. -# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr -# -# This file is part of CubicWeb. -# -# CubicWeb is free software: you can redistribute it and/or modify it under the -# terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 2.1 of the License, or (at your option) -# any later version. -# -# CubicWeb is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License along -# with CubicWeb. If not, see . -"""DB-API 2.0 compliant module - -Take a look at http://www.python.org/peps/pep-0249.html - -(most parts of this document are reported here in docstrings) -""" - -__docformat__ = "restructuredtext en" - -from threading import currentThread -from logging import getLogger -from time import time, clock -from itertools import count -from warnings import warn -from os.path import join -from uuid import uuid4 -from urlparse import urlparse - -from logilab.common.logging_ext import set_log_methods -from logilab.common.decorators import monkeypatch, cachedproperty -from logilab.common.deprecation import deprecated - -from cubicweb import (ETYPE_NAME_MAP, AuthenticationError, ProgrammingError, - cwvreg, cwconfig) -from cubicweb.repoapi import get_repository -from cubicweb.req import RequestSessionBase - - -_MARKER = object() - -def _fake_property_value(self, name): - try: - return super(DBAPIRequest, self).property_value(name) - except KeyError: - return '' - -def fake(*args, **kwargs): - return None - -def multiple_connections_fix(): - """some monkey patching necessary when an application has to deal with - several connections to different repositories. It tries to hide buggy class - attributes since classes are not designed to be shared among multiple - registries. - """ - defaultcls = cwvreg.CWRegistryStore.REGISTRY_FACTORY[None] - - etypescls = cwvreg.CWRegistryStore.REGISTRY_FACTORY['etypes'] - orig_etype_class = etypescls.orig_etype_class = etypescls.etype_class - @monkeypatch(defaultcls) - def etype_class(self, etype): - """return an entity class for the given entity type. - Try to find out a specific class for this kind of entity or - default to a dump of the class registered for 'Any' - """ - usercls = orig_etype_class(self, etype) - if etype == 'Any': - return usercls - usercls.e_schema = self.schema.eschema(etype) - return usercls - -def multiple_connections_unfix(): - etypescls = cwvreg.CWRegistryStore.REGISTRY_FACTORY['etypes'] - etypescls.etype_class = etypescls.orig_etype_class - - -class ConnectionProperties(object): - def __init__(self, cnxtype=None, close=True, log=False): - if cnxtype is not None: - warn('[3.16] cnxtype argument is deprecated', DeprecationWarning, - stacklevel=2) - self.cnxtype = cnxtype - self.log_queries = log - self.close_on_del = close - - -@deprecated('[3.19] the dbapi is deprecated. Have a look at the new repoapi.') -def _repo_connect(repo, login, **kwargs): - """Constructor to create a new connection to the given CubicWeb repository. - - Returns a Connection instance. - - Raises AuthenticationError if authentication failed - """ - cnxid = repo.connect(unicode(login), **kwargs) - cnx = Connection(repo, cnxid, kwargs.get('cnxprops')) - if cnx.is_repo_in_memory: - cnx.vreg = repo.vreg - return cnx - -def connect(database, login=None, - cnxprops=None, setvreg=True, mulcnx=True, initlog=True, **kwargs): - """Constructor for creating a connection to the CubicWeb repository. - Returns a :class:`Connection` object. - - Typical usage:: - - cnx = connect('myinstance', login='me', password='toto') - - `database` may be: - - * a simple instance id for in-memory connection - - * a uri like scheme://host:port/instanceid where scheme may be one of - 'pyro', 'inmemory' or 'zmqpickle' - - * if scheme is 'pyro', determine the name server address. If - not specified (e.g. 'pyro:///instanceid'), it will be detected through a - broadcast query. The instance id is the name of the instance in the name - server and may be prefixed by a group (e.g. - 'pyro:///:cubicweb.instanceid') - - * if scheme is handled by ZMQ (eg 'tcp'), you should not specify an - instance id - - Other arguments: - - :login: - the user login to use to authenticate. - - :cnxprops: - a :class:`ConnectionProperties` instance, allowing to specify - the connection method (eg in memory or pyro). A Pyro connection will be - established if you don't specify that argument. - - :setvreg: - flag telling if a registry should be initialized for the connection. - Don't change this unless you know what you're doing. - - :mulcnx: - Will disappear at some point. Try to deal with connections to differents - instances in the same process unless specified otherwise by setting this - flag to False. Don't change this unless you know what you're doing. - - :initlog: - flag telling if logging should be initialized. You usually don't want - logging initialization when establishing the connection from a process - where it's already initialized. - - :kwargs: - there goes authentication tokens. You usually have to specify a password - for the given user, using a named 'password' argument. - """ - if not urlparse(database).scheme: - warn('[3.16] give an qualified URI as database instead of using ' - 'host/cnxprops to specify the connection method', - DeprecationWarning, stacklevel=2) - if cnxprops and cnxprops.cnxtype == 'zmq': - database = kwargs.pop('host') - elif cnxprops and cnxprops.cnxtype == 'inmemory': - database = 'inmemory://' + database - else: - host = kwargs.pop('host', None) - if host is None: - host = '' - group = kwargs.pop('group', None) - if group is None: - group = 'cubicweb' - database = 'pyro://%s/%s.%s' % (host, group, database) - puri = urlparse(database) - method = puri.scheme.lower() - if method == 'inmemory': - config = cwconfig.instance_configuration(puri.netloc) - else: - config = cwconfig.CubicWebNoAppConfiguration() - repo = get_repository(database, config=config) - if method == 'inmemory': - vreg = repo.vreg - elif setvreg: - if mulcnx: - multiple_connections_fix() - vreg = cwvreg.CWRegistryStore(config, initlog=initlog) - schema = repo.get_schema() - for oldetype, newetype in ETYPE_NAME_MAP.items(): - if oldetype in schema: - print 'aliasing', newetype, 'to', oldetype - schema._entities[newetype] = schema._entities[oldetype] - vreg.set_schema(schema) - else: - vreg = None - cnx = _repo_connect(repo, login, cnxprops=cnxprops, **kwargs) - cnx.vreg = vreg - return cnx - -def in_memory_repo(config): - """Return and in_memory Repository object from a config (or vreg)""" - if isinstance(config, cwvreg.CWRegistryStore): - vreg = config - config = None - else: - vreg = None - # get local access to the repository - return get_repository('inmemory://', config=config, vreg=vreg) - -def in_memory_repo_cnx(config, login, **kwargs): - """useful method for testing and scripting to get a dbapi.Connection - object connected to an in-memory repository instance - """ - # connection to the CubicWeb repository - repo = in_memory_repo(config) - return repo, _repo_connect(repo, login, **kwargs) - -# XXX web only method, move to webconfig? -def anonymous_session(vreg): - """return a new anonymous session - - raises an AuthenticationError if anonymous usage is not allowed - """ - anoninfo = vreg.config.anonymous_user() - if anoninfo[0] is None: # no anonymous user - raise AuthenticationError('anonymous access is not authorized') - anon_login, anon_password = anoninfo - # use vreg's repository cache - repo = vreg.config.repository(vreg) - anon_cnx = _repo_connect(repo, anon_login, password=anon_password) - anon_cnx.vreg = vreg - return DBAPISession(anon_cnx, anon_login) - - -class _NeedAuthAccessMock(object): - def __getattribute__(self, attr): - raise AuthenticationError() - def __nonzero__(self): - return False - -class DBAPISession(object): - def __init__(self, cnx, login=None): - self.cnx = cnx - self.data = {} - self.login = login - # dbapi session identifier is the same as the first connection - # identifier, but may later differ in case of auto-reconnection as done - # by the web authentication manager (in cw.web.views.authentication) - if cnx is not None: - self.sessionid = cnx.sessionid - else: - self.sessionid = uuid4().hex - - @property - def anonymous_session(self): - return not self.cnx or self.cnx.anonymous_connection - - def __repr__(self): - return '' % self.sessionid - - -class DBAPIRequest(RequestSessionBase): - #: Request language identifier eg: 'en' - lang = None - - def __init__(self, vreg, session=None): - super(DBAPIRequest, self).__init__(vreg) - #: 'language' => translation_function() mapping - try: - # no vreg or config which doesn't handle translations - self.translations = vreg.config.translations - except AttributeError: - self.translations = {} - #: cache entities built during the request - self._eid_cache = {} - if session is not None: - self.set_session(session) - else: - # these args are initialized after a connection is - # established - self.session = DBAPISession(None) - self.cnx = self.user = _NeedAuthAccessMock() - self.set_default_language(vreg) - - def get_option_value(self, option, foreid=None): - if foreid is not None: - warn('[3.19] foreid argument is deprecated', DeprecationWarning, - stacklevel=2) - return self.cnx.get_option_value(option) - - def set_session(self, session): - """method called by the session handler when the user is authenticated - or an anonymous connection is open - """ - self.session = session - if session.cnx: - self.cnx = session.cnx - self.execute = session.cnx.cursor(self).execute - self.user = self.cnx.user(self) - self.set_entity_cache(self.user) - - def execute(self, *args, **kwargs): # pylint: disable=E0202 - """overriden when session is set. By default raise authentication error - so authentication is requested. - """ - raise AuthenticationError() - - def set_default_language(self, vreg): - try: - lang = vreg.property_value('ui.language') - except Exception: # property may not be registered - lang = 'en' - try: - self.set_language(lang) - except KeyError: - # this occurs usually during test execution - self._ = self.__ = unicode - self.pgettext = lambda x, y: unicode(y) - - # server-side service call ################################################# - - def call_service(self, regid, **kwargs): - return self.cnx.call_service(regid, **kwargs) - - # entities cache management ############################################### - - def entity_cache(self, eid): - return self._eid_cache[eid] - - def set_entity_cache(self, entity): - self._eid_cache[entity.eid] = entity - - def cached_entities(self): - return self._eid_cache.values() - - def drop_entity_cache(self, eid=None): - if eid is None: - self._eid_cache = {} - else: - del self._eid_cache[eid] - - # low level session data management ####################################### - - @deprecated('[3.19] use session or transaction data') - def get_shared_data(self, key, default=None, pop=False, txdata=False): - """see :meth:`Connection.get_shared_data`""" - return self.cnx.get_shared_data(key, default, pop, txdata) - - @deprecated('[3.19] use session or transaction data') - def set_shared_data(self, key, value, txdata=False, querydata=None): - """see :meth:`Connection.set_shared_data`""" - if querydata is not None: - txdata = querydata - warn('[3.10] querydata argument has been renamed to txdata', - DeprecationWarning, stacklevel=2) - return self.cnx.set_shared_data(key, value, txdata) - - # server session compat layer ############################################# - - def entity_metas(self, eid): - """return a tuple (type, sourceuri, extid) for the entity with id """ - return self.cnx.entity_metas(eid) - - def source_defs(self): - """return the definition of sources used by the repository.""" - return self.cnx.source_defs() - - @deprecated('[3.19] use .entity_metas(eid) instead') - def describe(self, eid, asdict=False): - """return a tuple (type, sourceuri, extid) for the entity with id """ - return self.cnx.describe(eid, asdict) - - # these are overridden by set_log_methods below - # only defining here to prevent pylint from complaining - info = warning = error = critical = exception = debug = lambda msg,*a,**kw: None - -set_log_methods(DBAPIRequest, getLogger('cubicweb.dbapi')) - - - -# cursor / connection objects ################################################## - -class Cursor(object): - """These objects represent a database cursor, which is used to manage the - context of a fetch operation. Cursors created from the same connection are - not isolated, i.e., any changes done to the database by a cursor are - immediately visible by the other cursors. Cursors created from different - connections are isolated. - """ - - def __init__(self, connection, repo, req=None): - """This read-only attribute return a reference to the Connection - object on which the cursor was created. - """ - self.connection = connection - """optionnal issuing request instance""" - self.req = req - self._repo = repo - self._sessid = connection.sessionid - - def close(self): - """no effect""" - pass - - def _txid(self): - return self.connection._txid(self) - - def execute(self, rql, args=None, build_descr=True): - """execute a rql query, return resulting rows and their description in - a :class:`~cubicweb.rset.ResultSet` object - - * `rql` should be a Unicode string or a plain ASCII string, containing - the rql query - - * `args` the optional args dictionary associated to the query, with key - matching named substitution in `rql` - - * `build_descr` is a boolean flag indicating if the description should - be built on select queries (if false, the description will be en empty - list) - - on INSERT queries, there will be one row for each inserted entity, - containing its eid - - on SET queries, XXX describe - - DELETE queries returns no result. - - .. Note:: - to maximize the rql parsing/analyzing cache performance, you should - always use substitute arguments in queries, i.e. avoid query such as:: - - execute('Any X WHERE X eid 123') - - use:: - - execute('Any X WHERE X eid %(x)s', {'x': 123}) - """ - rset = self._repo.execute(self._sessid, rql, args, - build_descr=build_descr, **self._txid()) - rset.req = self.req - return rset - - -class LogCursor(Cursor): - """override the standard cursor to log executed queries""" - - def execute(self, operation, parameters=None, build_descr=True): - """override the standard cursor to log executed queries""" - tstart, cstart = time(), clock() - rset = Cursor.execute(self, operation, parameters, build_descr=build_descr) - self.connection.executed_queries.append((operation, parameters, - time() - tstart, clock() - cstart)) - return rset - -def check_not_closed(func): - def decorator(self, *args, **kwargs): - if self._closed is not None: - raise ProgrammingError('Closed connection %s' % self.sessionid) - return func(self, *args, **kwargs) - return decorator - -class Connection(object): - """DB-API 2.0 compatible Connection object for CubicWeb - """ - # make exceptions available through the connection object - ProgrammingError = ProgrammingError - # attributes that may be overriden per connection instance - cursor_class = Cursor - vreg = None - _closed = None - - def __init__(self, repo, cnxid, cnxprops=None): - self._repo = repo - self.sessionid = cnxid - self._close_on_del = getattr(cnxprops, 'close_on_del', True) - self._web_request = False - if cnxprops and cnxprops.log_queries: - self.executed_queries = [] - self.cursor_class = LogCursor - - @property - def is_repo_in_memory(self): - """return True if this is a local, aka in-memory, connection to the - repository - """ - try: - from cubicweb.server.repository import Repository - except ImportError: - # code not available, no way - return False - return isinstance(self._repo, Repository) - - @property # could be a cached property but we want to prevent assigment to - # catch potential programming error. - def anonymous_connection(self): - login = self._repo.user_info(self.sessionid)[1] - anon_login = self.vreg.config.get('anonymous-user') - return login == anon_login - - def __repr__(self): - if self.anonymous_connection: - return '' % self.sessionid - return '' % self.sessionid - - def __enter__(self): - return self.cursor() - - def __exit__(self, exc_type, exc_val, exc_tb): - if exc_type is None: - self.commit() - else: - self.rollback() - return False #propagate the exception - - def __del__(self): - """close the remote connection if necessary""" - if self._closed is None and self._close_on_del: - try: - self.close() - except Exception: - pass - - # server-side service call ################################################# - - @check_not_closed - def call_service(self, regid, **kwargs): - return self._repo.call_service(self.sessionid, regid, **kwargs) - - # connection initialization methods ######################################## - - def load_appobjects(self, cubes=_MARKER, subpath=None, expand=True): - config = self.vreg.config - if cubes is _MARKER: - cubes = self._repo.get_cubes() - elif cubes is None: - cubes = () - else: - if not isinstance(cubes, (list, tuple)): - cubes = (cubes,) - if expand: - cubes = config.expand_cubes(cubes) - if subpath is None: - subpath = esubpath = ('entities', 'views') - else: - esubpath = subpath - if 'views' in subpath: - esubpath = list(subpath) - esubpath.remove('views') - esubpath.append(join('web', 'views')) - # first load available configs, necessary for proper persistent - # properties initialization - config.load_available_configs() - # then init cubes - config.init_cubes(cubes) - # then load appobjects into the registry - vpath = config.build_appobjects_path(reversed(config.cubes_path()), - evobjpath=esubpath, - tvobjpath=subpath) - self.vreg.register_objects(vpath) - - def use_web_compatible_requests(self, baseurl, sitetitle=None): - """monkey patch DBAPIRequest to fake a cw.web.request, so you should - able to call html views using rset from a simple dbapi connection. - - You should call `load_appobjects` at some point to register those views. - """ - DBAPIRequest.property_value = _fake_property_value - DBAPIRequest.next_tabindex = count().next - DBAPIRequest.relative_path = fake - DBAPIRequest.url = fake - DBAPIRequest.get_page_data = fake - DBAPIRequest.set_page_data = fake - # XXX could ask the repo for it's base-url configuration - self.vreg.config.set_option('base-url', baseurl) - self.vreg.config.uiprops = {} - self.vreg.config.datadir_url = baseurl + '/data' - # XXX why is this needed? if really needed, could be fetched by a query - if sitetitle is not None: - self.vreg['propertydefs']['ui.site-title'] = {'default': sitetitle} - self._web_request = True - - def request(self): - if self._web_request: - from cubicweb.web.request import DBAPICubicWebRequestBase - req = DBAPICubicWebRequestBase(self.vreg, False) - req.get_header = lambda x, default=None: default - req.set_session = lambda session: DBAPIRequest.set_session( - req, session) - req.relative_path = lambda includeparams=True: '' - else: - req = DBAPIRequest(self.vreg) - req.set_session(DBAPISession(self)) - return req - - @check_not_closed - def user(self, req=None, props=None): - """return the User object associated to this connection""" - # cnx validity is checked by the call to .user_info - eid, login, groups, properties = self._repo.user_info(self.sessionid, - props) - if req is None: - req = self.request() - rset = req.eid_rset(eid, 'CWUser') - if self.vreg is not None and 'etypes' in self.vreg: - user = self.vreg['etypes'].etype_class('CWUser')( - req, rset, row=0, groups=groups, properties=properties) - else: - from cubicweb.entity import Entity - user = Entity(req, rset, row=0) - user.cw_attr_cache['login'] = login # cache login - return user - - @check_not_closed - def check(self): - """raise `BadConnectionId` if the connection is no more valid, else - return its latest activity timestamp. - """ - return self._repo.check_session(self.sessionid) - - def _txid(self, cursor=None): # pylint: disable=E0202 - # XXX could now handle various isolation level! - # return a dict as bw compat trick - return {'txid': currentThread().getName()} - - # session data methods ##################################################### - - @check_not_closed - def get_shared_data(self, key, default=None, pop=False, txdata=False): - """return value associated to key in the session's data dictionary or - session's transaction's data if `txdata` is true. - - If pop is True, value will be removed from the dictionary. - - If key isn't defined in the dictionary, value specified by the - `default` argument will be returned. - """ - return self._repo.get_shared_data(self.sessionid, key, default, pop, txdata) - - @check_not_closed - def set_shared_data(self, key, value, txdata=False): - """set value associated to `key` in shared data - - if `txdata` is true, the value will be added to the repository - session's query data which are cleared on commit/rollback of the current - transaction. - """ - return self._repo.set_shared_data(self.sessionid, key, value, txdata) - - # meta-data accessors ###################################################### - - @check_not_closed - def source_defs(self): - """Return the definition of sources used by the repository.""" - return self._repo.source_defs() - - @check_not_closed - def get_schema(self): - """Return the schema currently used by the repository.""" - return self._repo.get_schema() - - @check_not_closed - def get_option_value(self, option, foreid=None): - """Return the value for `option` in the configuration. - - `foreid` argument is deprecated and now useless (as of 3.19). - """ - if foreid is not None: - warn('[3.19] foreid argument is deprecated', DeprecationWarning, - stacklevel=2) - return self._repo.get_option_value(option) - - - @check_not_closed - def entity_metas(self, eid): - """return a tuple (type, sourceuri, extid) for the entity with id """ - try: - return self._repo.entity_metas(self.sessionid, eid, **self._txid()) - except AttributeError: - # talking to pre 3.19 repository - metas = self._repo.describe(self.sessionid, eid, **self._txid()) - if len(metas) == 3: # even older backward compat - metas = list(metas) - metas.append(metas[1]) - return dict(zip(('type', 'source', 'extid', 'asource'), metas)) - - - @deprecated('[3.19] use .entity_metas(eid) instead') - @check_not_closed - def describe(self, eid, asdict=False): - try: - metas = self._repo.entity_metas(self.sessionid, eid, **self._txid()) - except AttributeError: - metas = self._repo.describe(self.sessionid, eid, **self._txid()) - # talking to pre 3.19 repository - if len(metas) == 3: # even older backward compat - metas = list(metas) - metas.append(metas[1]) - if asdict: - return dict(zip(('type', 'source', 'extid', 'asource'), metas)) - return metas[:-1] - if asdict: - metas['asource'] = meta['source'] # XXX pre 3.19 client compat - return metas - return metas['type'], metas['source'], metas['extid'] - - - # db-api like interface #################################################### - - @check_not_closed - def commit(self): - """Commit pending transaction for this connection to the repository. - - may raises `Unauthorized` or `ValidationError` if we attempted to do - something we're not allowed to for security or integrity reason. - - If the transaction is undoable, a transaction id will be returned. - """ - return self._repo.commit(self.sessionid, **self._txid()) - - @check_not_closed - def rollback(self): - """This method is optional since not all databases provide transaction - support. - - In case a database does provide transactions this method causes the the - database to roll back to the start of any pending transaction. Closing - a connection without committing the changes first will cause an implicit - rollback to be performed. - """ - self._repo.rollback(self.sessionid, **self._txid()) - - @check_not_closed - def cursor(self, req=None): - """Return a new Cursor Object using the connection. - - On pyro connection, you should get cursor after calling if - load_appobjects method if desired (which you should call if you intend - to use ORM abilities). - """ - if req is None: - req = self.request() - return self.cursor_class(self, self._repo, req=req) - - @check_not_closed - def close(self): - """Close the connection now (rather than whenever __del__ is called). - - The connection will be unusable from this point forward; an Error (or - subclass) exception will be raised if any operation is attempted with - the connection. The same applies to all cursor objects trying to use the - connection. Note that closing a connection without committing the - changes first will cause an implicit rollback to be performed. - """ - self._repo.close(self.sessionid, **self._txid()) - del self._repo # necessary for proper garbage collection - self._closed = 1 - - # undo support ############################################################ - - @check_not_closed - def undoable_transactions(self, ueid=None, req=None, **actionfilters): - """Return a list of undoable transaction objects by the connection's - user, ordered by descendant transaction time. - - Managers may filter according to user (eid) who has done the transaction - using the `ueid` argument. Others will only see their own transactions. - - Additional filtering capabilities is provided by using the following - named arguments: - - * `etype` to get only transactions creating/updating/deleting entities - of the given type - - * `eid` to get only transactions applied to entity of the given eid - - * `action` to get only transactions doing the given action (action in - 'C', 'U', 'D', 'A', 'R'). If `etype`, action can only be 'C', 'U' or - 'D'. - - * `public`: when additional filtering is provided, their are by default - only searched in 'public' actions, unless a `public` argument is given - and set to false. - """ - actionfilters.update(self._txid()) - txinfos = self._repo.undoable_transactions(self.sessionid, ueid, - **actionfilters) - if req is None: - req = self.request() - for txinfo in txinfos: - txinfo.req = req - return txinfos - - @check_not_closed - def transaction_info(self, txuuid, req=None): - """Return transaction object for the given uid. - - raise `NoSuchTransaction` if not found or if session's user is not - allowed (eg not in managers group and the transaction doesn't belong to - him). - """ - txinfo = self._repo.transaction_info(self.sessionid, txuuid, - **self._txid()) - if req is None: - req = self.request() - txinfo.req = req - return txinfo - - @check_not_closed - def transaction_actions(self, txuuid, public=True): - """Return an ordered list of action effectued during that transaction. - - If public is true, return only 'public' actions, eg not ones triggered - under the cover by hooks, else return all actions. - - raise `NoSuchTransaction` if the transaction is not found or if - session's user is not allowed (eg not in managers group and the - transaction doesn't belong to him). - """ - return self._repo.transaction_actions(self.sessionid, txuuid, public, - **self._txid()) - - @check_not_closed - def undo_transaction(self, txuuid): - """Undo the given transaction. Return potential restoration errors. - - raise `NoSuchTransaction` if not found or if session's user is not - allowed (eg not in managers group and the transaction doesn't belong to - him). - """ - return self._repo.undo_transaction(self.sessionid, txuuid, - **self._txid()) - -in_memory_cnx = deprecated('[3.16] use _repo_connect instead)')(_repo_connect) diff -r d4d36b583f40 -r a4fcee1e9789 debian/changelog --- a/debian/changelog Mon Mar 21 18:08:47 2016 +0100 +++ b/debian/changelog Thu Mar 24 09:43:25 2016 +0100 @@ -1,3 +1,51 @@ +cubicweb (3.21.6-1) unstable; urgency=medium + + * new upstream release + + -- Julien Cristau Tue, 16 Feb 2016 18:53:15 +0100 + +cubicweb (3.21.5-2) unstable; urgency=medium + + * Fix conflict between cubicweb-server and cubicweb-dev. + + -- Julien Cristau Thu, 17 Dec 2015 14:56:07 +0100 + +cubicweb (3.21.5-1) unstable; urgency=medium + + * New upstream release. + + -- Rémi Cardona Tue, 15 Dec 2015 17:33:05 +0100 + +cubicweb (3.21.4-1) unstable; urgency=medium + + * New upstream release. + + -- Rémi Cardona Tue, 15 Dec 2015 11:59:58 +0100 + +cubicweb (3.21.3-1) unstable; urgency=medium + + * New upstream release. + + -- Rémi Cardona Wed, 09 Dec 2015 18:29:39 +0100 + +cubicweb (3.21.2-1) unstable; urgency=medium + + * New upstream release. + + -- Rémi Cardona Fri, 09 Oct 2015 18:00:39 +0200 + +cubicweb (3.21.1-1) unstable; urgency=medium + + * new upstream release + + -- Julien Cristau Tue, 28 Jul 2015 18:05:55 +0200 + +cubicweb (3.21.0-1) unstable; urgency=low + + * New upstream release. + + -- Julien Cristau Fri, 10 Jul 2015 17:04:11 +0200 + cubicweb (3.20.14-1) unstable; urgency=medium * new upstream release diff -r d4d36b583f40 -r a4fcee1e9789 debian/control --- a/debian/control Mon Mar 21 18:08:47 2016 +0100 +++ b/debian/control Thu Mar 24 09:43:25 2016 +0100 @@ -20,7 +20,7 @@ python-lxml, Standards-Version: 3.9.1 Homepage: http://www.cubicweb.org -XS-Python-Version: >= 2.6 +X-Python-Version: >= 2.6 Package: cubicweb Architecture: all @@ -58,10 +58,10 @@ | python-pysqlite2, python-passlib Recommends: - pyro (<< 4.0.0), - cubicweb-documentation (= ${source:Version}) + cubicweb-documentation (= ${source:Version}), Suggests: - python-zmq + python-zmq, + python-cwclientlib (>= 0.4.0), Description: server part of the CubicWeb framework CubicWeb is a semantic web application framework. . @@ -109,7 +109,6 @@ cubicweb-ctl (= ${source:Version}), python-twisted-web Recommends: - pyro (<< 4.0.0), cubicweb-documentation (= ${source:Version}) Description: twisted-based web interface for the CubicWeb framework CubicWeb is a semantic web application framework. @@ -137,6 +136,7 @@ Breaks: cubicweb-inlinedit (<< 1.1.1), cubicweb-bootstrap (<< 0.6.6), + cubicweb-folder (<< 1.10.0), Description: web interface library for the CubicWeb framework CubicWeb is a semantic web application framework. . diff -r d4d36b583f40 -r a4fcee1e9789 debian/cubicweb-common.install --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/debian/cubicweb-common.install Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,4 @@ +usr/lib/python2*/*-packages/cubicweb/entities/ +usr/lib/python2*/*-packages/cubicweb/ext/ +usr/share/cubicweb/cubes/ +usr/lib/python2*/*-packages/cubicweb/*.py diff -r d4d36b583f40 -r a4fcee1e9789 debian/cubicweb-common.install.in --- a/debian/cubicweb-common.install.in Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -usr/lib/PY_VERSION/*-packages/cubicweb/entities/ -usr/lib/PY_VERSION/*-packages/cubicweb/ext/ -usr/share/cubicweb/cubes/ -usr/lib/PY_VERSION/*-packages/cubicweb/*.py diff -r d4d36b583f40 -r a4fcee1e9789 debian/cubicweb-ctl.cubicweb.init --- a/debian/cubicweb-ctl.cubicweb.init Mon Mar 21 18:08:47 2016 +0100 +++ b/debian/cubicweb-ctl.cubicweb.init Thu Mar 24 09:43:25 2016 +0100 @@ -4,16 +4,14 @@ # Provides: cubicweb # Required-Start: $remote_fs $syslog $local_fs $network # Required-Stop: $remote_fs $syslog $local_fs $network -# Should-Start: postgresql pyro-nsd -# Should-Stop: postgresql pyro-nsd +# Should-Start: postgresql +# Should-Stop: postgresql # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start cubicweb application at boot time ### END INIT INFO # FIXME Seems to be inadequate here -# FIXME If related to pyro, try instead: -# export PYRO_STORAGE="/tmp" cd /tmp # FIXME Work-around about the following lintian error diff -r d4d36b583f40 -r a4fcee1e9789 debian/cubicweb-ctl.install --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/debian/cubicweb-ctl.install Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,3 @@ +usr/bin/cubicweb-ctl usr/bin/ +usr/lib/python2*/*-packages/cubicweb/cwctl.py +../cubicweb-ctl.bash_completion etc/bash_completion.d/cubicweb-ctl diff -r d4d36b583f40 -r a4fcee1e9789 debian/cubicweb-ctl.install.in --- a/debian/cubicweb-ctl.install.in Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -usr/bin/cubicweb-ctl usr/bin/ -usr/lib/PY_VERSION/*-packages/cubicweb/cwctl.py -../cubicweb-ctl.bash_completion etc/bash_completion.d/cubicweb-ctl diff -r d4d36b583f40 -r a4fcee1e9789 debian/cubicweb-ctl.postinst --- a/debian/cubicweb-ctl.postinst Mon Mar 21 18:08:47 2016 +0100 +++ b/debian/cubicweb-ctl.postinst Thu Mar 24 09:43:25 2016 +0100 @@ -10,32 +10,6 @@ ;; esac -if [ "$1" = configure ]; then - # XXX bw compat: erudi -> cubicweb migration - if [ -e "/etc/erudi.d/" ]; then - mv /etc/erudi.d/* /etc/cubicweb.d/ && ( - echo 'moved /etc/erudi.d/* to /etc/cubicweb.d/' - sed -i s/ginco/cubicweb/g /etc/*/*.py - sed -i s/erudi/cubicweb/ */*.conf - ) || true # empty dir - fi - if [ -e "/var/log/erudi/" ]; then - mv /var/log/erudi/* /var/log/cubicweb/ && ( - echo 'moved /var/log/erudi/* to /var/log/cubicweb/' - ) || true # empty dir - fi - if [ -e "/var/lib/erudi/backup" ]; then - mv /var/lib/erudi/backup/* /var/lib/cubicweb/backup/ && ( - echo 'moved /var/lib/erudi/backup/* to /var/lib/cubicweb/backup/' - ) || true # empty dir - fi - if [ -e "/var/lib/erudi/instances" ]; then - mv /var/lib/erudi/instances/* /var/lib/cubicweb/instances/ && ( - echo 'moved /var/lib/erudi/instances/* to /var/lib/cubicweb/instances/' - ) || true # empty dir - fi -fi - #DEBHELPER# exit 0 diff -r d4d36b583f40 -r a4fcee1e9789 debian/cubicweb-ctl.postrm --- a/debian/cubicweb-ctl.postrm Mon Mar 21 18:08:47 2016 +0100 +++ b/debian/cubicweb-ctl.postrm Thu Mar 24 09:43:25 2016 +0100 @@ -1,8 +1,15 @@ #!/bin/sh -e -if [ "$1" = "purge" ] ; then + +if [ "$1" = "remove" ]; then update-rc.d cubicweb remove >/dev/null fi +if [ "$1" = "purge" ] ; then + rm -rf /etc/cubicweb.d/ + rm -rf /var/log/cubicweb/ + rm -rf /var/lib/cubicweb/ +fi + #DEBHELPER# exit 0 diff -r d4d36b583f40 -r a4fcee1e9789 debian/cubicweb-ctl.prerm --- a/debian/cubicweb-ctl.prerm Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -#! /bin/sh -e - -case "$1" in - purge) - rm -rf /etc/cubicweb.d/ - rm -rf /var/log/cubicweb/ - rm -rf /var/lib/cubicweb/ - ;; -esac - -#DEBHELPER# - -exit 0 diff -r d4d36b583f40 -r a4fcee1e9789 debian/cubicweb-dev.install --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/debian/cubicweb-dev.install Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,11 @@ +usr/lib/python2*/*-packages/cubicweb/devtools/ +usr/lib/python2*/*-packages/cubicweb/skeleton/ +usr/lib/python2*/*-packages/cubicweb/test +usr/lib/python2*/*-packages/cubicweb/dataimport/test +usr/lib/python2*/*-packages/cubicweb/entities/test +usr/lib/python2*/*-packages/cubicweb/ext/test +usr/lib/python2*/*-packages/cubicweb/server/test +usr/lib/python2*/*-packages/cubicweb/sobjects/test +usr/lib/python2*/*-packages/cubicweb/hooks/test +usr/lib/python2*/*-packages/cubicweb/web/test +usr/lib/python2*/*-packages/cubicweb/etwist/test diff -r d4d36b583f40 -r a4fcee1e9789 debian/cubicweb-dev.install.in --- a/debian/cubicweb-dev.install.in Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -usr/lib/PY_VERSION/*-packages/cubicweb/devtools/ -usr/lib/PY_VERSION/*-packages/cubicweb/skeleton/ -usr/lib/PY_VERSION/*-packages/cubicweb/test -usr/lib/PY_VERSION/*-packages/cubicweb/entities/test -usr/lib/PY_VERSION/*-packages/cubicweb/ext/test -usr/lib/PY_VERSION/*-packages/cubicweb/server/test -usr/lib/PY_VERSION/*-packages/cubicweb/sobjects/test -usr/lib/PY_VERSION/*-packages/cubicweb/hooks/test -usr/lib/PY_VERSION/*-packages/cubicweb/web/test -usr/lib/PY_VERSION/*-packages/cubicweb/etwist/test diff -r d4d36b583f40 -r a4fcee1e9789 debian/cubicweb-doc --- a/debian/cubicweb-doc Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -Document: cubicweb-doc -Title: CubicWeb documentation -Author: Logilab -Abstract: Some base documentation for CubicWeb users and developpers -Section: Apps/Programming - -Format: HTML -Index: /usr/share/doc/cubicweb-documentation/index.html -Files: /usr/share/doc/cubicweb-documentation/*.html diff -r d4d36b583f40 -r a4fcee1e9789 debian/cubicweb-documentation.doc-base --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/debian/cubicweb-documentation.doc-base Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,9 @@ +Document: cubicweb-doc +Title: CubicWeb documentation +Author: Logilab +Abstract: Some base documentation for CubicWeb users and developpers +Section: Apps/Programming + +Format: HTML +Index: /usr/share/doc/cubicweb-documentation/index.html +Files: /usr/share/doc/cubicweb-documentation/*.html diff -r d4d36b583f40 -r a4fcee1e9789 debian/cubicweb-documentation.install --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/debian/cubicweb-documentation.install Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,2 @@ +../../doc/book usr/share/doc/cubicweb-documentation +../../doc/_build/html usr/share/doc/cubicweb-documentation diff -r d4d36b583f40 -r a4fcee1e9789 debian/cubicweb-documentation.install.in --- a/debian/cubicweb-documentation.install.in Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -../../doc/book usr/share/doc/cubicweb-documentation -../../doc/html usr/share/doc/cubicweb-documentation -../../debian/cubicweb-doc usr/share/doc-base/cubicweb-doc diff -r d4d36b583f40 -r a4fcee1e9789 debian/cubicweb-documentation.postinst --- a/debian/cubicweb-documentation.postinst Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -#! /bin/sh -e -# - -if [ "$1" = configure ]; then - if which install-docs >/dev/null 2>&1; then - install-docs -i /usr/share/doc-base/cubicweb-doc - fi -fi - - -#DEBHELPER# - -exit 0 diff -r d4d36b583f40 -r a4fcee1e9789 debian/cubicweb-documentation.prerm --- a/debian/cubicweb-documentation.prerm Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -#! /bin/sh -e -# - -if [ "$1" = remove -o "$1" = upgrade ]; then - if which install-docs >/dev/null 2>&1; then - install-docs -r cubicweb-doc - fi -fi - -#DEBHELPER# - -exit 0 diff -r d4d36b583f40 -r a4fcee1e9789 debian/cubicweb-server.install --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/debian/cubicweb-server.install Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,6 @@ +usr/lib/python2*/*-packages/cubicweb/dataimport/ +usr/lib/python2*/*-packages/cubicweb/server/ +usr/lib/python2*/*-packages/cubicweb/hooks/ +usr/lib/python2*/*-packages/cubicweb/sobjects/ +usr/lib/python2*/*-packages/cubicweb/schemas/ +usr/share/cubicweb/migration/ diff -r d4d36b583f40 -r a4fcee1e9789 debian/cubicweb-server.install.in --- a/debian/cubicweb-server.install.in Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -usr/lib/PY_VERSION/*-packages/cubicweb/server/ -usr/lib/PY_VERSION/*-packages/cubicweb/hooks/ -usr/lib/PY_VERSION/*-packages/cubicweb/sobjects/ -usr/lib/PY_VERSION/*-packages/cubicweb/schemas/ -usr/share/cubicweb/migration/ diff -r d4d36b583f40 -r a4fcee1e9789 debian/cubicweb-twisted.install --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/debian/cubicweb-twisted.install Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,1 @@ +usr/lib/python2*/*-packages/cubicweb/etwist/ diff -r d4d36b583f40 -r a4fcee1e9789 debian/cubicweb-twisted.install.in --- a/debian/cubicweb-twisted.install.in Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -usr/lib/PY_VERSION/*-packages/cubicweb/etwist/ diff -r d4d36b583f40 -r a4fcee1e9789 debian/cubicweb-web.install --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/debian/cubicweb-web.install Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,4 @@ +usr/lib/python2*/*-packages/cubicweb/web +usr/lib/python2*/*-packages/cubicweb/wsgi +usr/share/cubicweb/cubes/shared/data +usr/share/cubicweb/cubes/shared/wdoc diff -r d4d36b583f40 -r a4fcee1e9789 debian/cubicweb-web.install.in --- a/debian/cubicweb-web.install.in Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -usr/lib/PY_VERSION/*-packages/cubicweb/web -usr/lib/PY_VERSION/*-packages/cubicweb/wsgi -usr/share/cubicweb/cubes/shared/data -usr/share/cubicweb/cubes/shared/wdoc diff -r d4d36b583f40 -r a4fcee1e9789 debian/pycompat --- a/debian/pycompat Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -2 diff -r d4d36b583f40 -r a4fcee1e9789 debian/rules --- a/debian/rules Mon Mar 21 18:08:47 2016 +0100 +++ b/debian/rules Thu Mar 24 09:43:25 2016 +0100 @@ -5,8 +5,6 @@ # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 -PY_VERSION:=$(shell pyversions -d) - build: build-stamp build-stamp: dh_testdir @@ -17,7 +15,7 @@ # documentation build is now made optional since it can break for old # distributions and we don't want to block a new release of Cubicweb # because of documentation issues. - -PYTHONPATH=$${PYTHONPATH:+$${PYTHONPATH}:}$(CURDIR)/debian/pythonpath $(MAKE) -C doc/book/en all + -PYTHONPATH=$${PYTHONPATH:+$${PYTHONPATH}:}$(CURDIR)/debian/pythonpath $(MAKE) -C doc all rm -rf debian/pythonpath touch build-stamp @@ -27,10 +25,10 @@ rm -rf build #rm -rf debian/cubicweb-*/ find . -name "*.pyc" -delete - rm -f $(basename $(wildcard debian/*.in)) + -$(MAKE) -C doc clean dh_clean -install: build $(basename $(wildcard debian/*.in)) +install: build dh_testdir dh_testroot dh_clean @@ -49,30 +47,29 @@ dh_lintian # Remove unittests directory (should be available in cubicweb-dev only) - rm -rf debian/cubicweb-server/usr/lib/${PY_VERSION}/*-packages/cubicweb/server/test - rm -rf debian/cubicweb-server/usr/lib/${PY_VERSION}/*-packages/cubicweb/hooks/test - rm -rf debian/cubicweb-server/usr/lib/${PY_VERSION}/*-packages/cubicweb/sobjects/test - rm -rf debian/cubicweb-web/usr/lib/${PY_VERSION}/*-packages/cubicweb/web/test - rm -rf debian/cubicweb-twisted/usr/lib/${PY_VERSION}/*-packages/cubicweb/etwist/test - rm -rf debian/cubicweb-common/usr/lib/${PY_VERSION}/*-packages/cubicweb/ext/test - rm -rf debian/cubicweb-common/usr/lib/${PY_VERSION}/*-packages/cubicweb/entities/test + rm -rf debian/cubicweb-server/usr/lib/python2*/*-packages/cubicweb/dataimport/test + rm -rf debian/cubicweb-server/usr/lib/python2*/*-packages/cubicweb/server/test + rm -rf debian/cubicweb-server/usr/lib/python2*/*-packages/cubicweb/hooks/test + rm -rf debian/cubicweb-server/usr/lib/python2*/*-packages/cubicweb/sobjects/test + rm -rf debian/cubicweb-web/usr/lib/python2*/*-packages/cubicweb/web/test + rm -rf debian/cubicweb-twisted/usr/lib/python2*/*-packages/cubicweb/etwist/test + rm -rf debian/cubicweb-common/usr/lib/python2*/*-packages/cubicweb/ext/test + rm -rf debian/cubicweb-common/usr/lib/python2*/*-packages/cubicweb/entities/test -%: %.in - sed "s/PY_VERSION/${PY_VERSION}/g" < $< > $@ - # Build architecture-independent files here. binary-indep: build install dh_testdir dh_testroot -i dh_python2 -i + dh_python2 -i /usr/share/cubicweb dh_installinit -i -n --name cubicweb -u"defaults 99" dh_installlogrotate -i dh_installdocs -i -A README dh_installman -i - dh_installchangelogs -i + dh_installchangelogs -i -Xdoc/changes dh_link -i - dh_compress -i -X.py -X.ini -X.xml -X.js -X.rst -X.txt + dh_compress -i -X.py -X.ini -X.xml -X.js -X.rst -X.txt -Xchangelog.html dh_fixperms -i dh_installdeb -i dh_gencontrol -i diff -r d4d36b583f40 -r a4fcee1e9789 devtools/__init__.py --- a/devtools/__init__.py Mon Mar 21 18:08:47 2016 +0100 +++ b/devtools/__init__.py Thu Mar 24 09:43:25 2016 +0100 @@ -26,7 +26,6 @@ import shutil import pickle import glob -import random import subprocess import warnings import tempfile @@ -93,8 +92,6 @@ DEFAULT_PSQL_SOURCES = DEFAULT_SOURCES.copy() DEFAULT_PSQL_SOURCES['system'] = DEFAULT_SOURCES['system'].copy() DEFAULT_PSQL_SOURCES['system']['db-driver'] = 'postgres' -DEFAULT_PSQL_SOURCES['system']['db-host'] = '/tmp' -DEFAULT_PSQL_SOURCES['system']['db-port'] = str(random.randrange(5432, 2**16)) DEFAULT_PSQL_SOURCES['system']['db-user'] = unicode(getpass.getuser()) DEFAULT_PSQL_SOURCES['system']['db-password'] = None @@ -176,8 +173,8 @@ return self._apphome appdatahome = apphome - def load_configuration(self): - super(TestServerConfiguration, self).load_configuration() + def load_configuration(self, **kw): + super(TestServerConfiguration, self).load_configuration(**kw) # no undo support in tests self.global_set_option('undo-enabled', 'n') @@ -237,10 +234,6 @@ def available_languages(self, *args): return self.cw_languages() - def pyro_enabled(self): - # but export PYRO_MULTITHREAD=0 or you get problems with sqlite and - # threads - return True # XXX merge with BaseApptestConfiguration ? class ApptestConfiguration(BaseApptestConfiguration): @@ -251,7 +244,7 @@ skip_db_create_and_restore = False def __init__(self, appid, apphome=None, - log_threshold=logging.CRITICAL, sourcefile=None): + log_threshold=logging.WARNING, sourcefile=None): BaseApptestConfiguration.__init__(self, appid, apphome, log_threshold=log_threshold) self.init_repository = sourcefile is None @@ -303,6 +296,14 @@ # pure consistency check assert self.system_source['db-driver'] == self.DRIVER + # some handlers want to store info here, avoid a warning + from cubicweb.server.sources.native import NativeSQLSource + NativeSQLSource.options += ( + ('global-db-name', + {'type': 'string', 'help': 'for internal use only' + }), + ) + def _ensure_test_backup_db_dir(self): """Return path of directory for database backup. @@ -398,9 +399,9 @@ def _new_repo(self, config): """Factory method to create a new Repository Instance""" - from cubicweb.dbapi import in_memory_repo + from cubicweb.repoapi import _get_inmemory_repo config._cubes = None - repo = in_memory_repo(config) + repo = _get_inmemory_repo(config) config.repository = lambda x=None: repo # extending Repository class repo._has_started = False @@ -499,7 +500,7 @@ repo = self.get_repo(startup=True) cnx = self.get_cnx() with cnx: - pre_setup_func(cnx._cnx, self.config) + pre_setup_func(cnx, self.config) cnx.commit() self.backup_database(test_db_id) @@ -534,6 +535,48 @@ ### postgres test database handling ############################################ +def startpgcluster(pyfile): + """Start a postgresql cluster next to pyfile""" + datadir = join(os.path.dirname(pyfile), 'data', + 'pgdb-%s' % os.path.splitext(os.path.basename(pyfile))[0]) + if not exists(datadir): + try: + subprocess.check_call(['initdb', '-D', datadir, '-E', 'utf-8', '--locale=C']) + + except OSError, err: + if err.errno == errno.ENOENT: + raise OSError('"initdb" could not be found. ' + 'You should add the postgresql bin folder to your PATH ' + '(/usr/lib/postgresql/9.1/bin for example).') + raise + datadir = os.path.abspath(datadir) + pgport = '5432' + env = os.environ.copy() + sockdir = tempfile.mkdtemp(prefix='cwpg') + DEFAULT_PSQL_SOURCES['system']['db-host'] = sockdir + DEFAULT_PSQL_SOURCES['system']['db-port'] = pgport + options = '-h "" -k %s -p %s' % (sockdir, pgport) + options += ' -c fsync=off -c full_page_writes=off' + options += ' -c synchronous_commit=off' + try: + subprocess.check_call(['pg_ctl', 'start', '-w', '-D', datadir, + '-o', options], + env=env) + except OSError, err: + if err.errno == errno.ENOENT: + raise OSError('"pg_ctl" could not be found. ' + 'You should add the postgresql bin folder to your PATH ' + '(/usr/lib/postgresql/9.1/bin for example).') + raise + + +def stoppgcluster(pyfile): + """Kill the postgresql cluster running next to pyfile""" + datadir = join(os.path.dirname(pyfile), 'data', + 'pgdb-%s' % os.path.splitext(os.path.basename(pyfile))[0]) + subprocess.call(['pg_ctl', 'stop', '-D', datadir, '-m', 'fast']) + + class PostgresTestDataBaseHandler(TestDataBaseHandler): DRIVER = 'postgres' @@ -543,45 +586,11 @@ __CTL = set() - @classmethod - def killall(cls): - for datadir in cls.__CTL: - subprocess.call(['pg_ctl', 'stop', '-D', datadir, '-m', 'fast']) - def __init__(self, *args, **kwargs): super(PostgresTestDataBaseHandler, self).__init__(*args, **kwargs) - datadir = realpath(join(self.config.apphome, 'pgdb')) - if datadir in self.__CTL: - return - if not exists(datadir): - try: - subprocess.check_call(['initdb', '-D', datadir, '-E', 'utf-8', '--locale=C']) - - except OSError, err: - if err.errno == errno.ENOENT: - raise OSError('"initdb" could not be found. ' - 'You should add the postgresql bin folder to your PATH ' - '(/usr/lib/postgresql/9.1/bin for example).') - raise - port = self.system_source['db-port'] - directory = self.system_source['db-host'] - env = os.environ.copy() - env['PGPORT'] = str(port) - env['PGHOST'] = str(directory) - options = '-h "" -k %s -p %s' % (directory, port) - options += ' -c fsync=off -c full_page_writes=off' - options += ' -c synchronous_commit=off' - try: - subprocess.check_call(['pg_ctl', 'start', '-w', '-D', datadir, - '-o', options], - env=env) - except OSError, err: - if err.errno == errno.ENOENT: - raise OSError('"pg_ctl" could not be found. ' - 'You should add the postgresql bin folder to your PATH ' - '(/usr/lib/postgresql/9.1/bin for example).') - raise - self.__CTL.add(datadir) + if 'global-db-name' not in self.system_source: + self.system_source['global-db-name'] = self.system_source['db-name'] + self.system_source['db-name'] = self.system_source['db-name'] + str(os.getpid()) @property @cached @@ -590,6 +599,10 @@ return get_db_helper('postgres') @property + def dbname(self): + return self.system_source['global-db-name'] + + @property def dbcnx(self): try: return self._cnx @@ -615,13 +628,18 @@ return backup_name return None + def has_cache(self, db_id): + backup_name = self._backup_name(db_id) + return (super(PostgresTestDataBaseHandler, self).has_cache(db_id) + and backup_name in self.helper.list_databases(self.cursor)) + def init_test_database(self): """initialize a fresh postgresql database used for testing purpose""" from cubicweb.server import init_repository from cubicweb.server.serverctl import system_source_cnx, createdb # connect on the dbms system base to create our base try: - self._drop(self.dbname) + self._drop(self.system_source['db-name']) createdb(self.helper, self.system_source, self.dbcnx, self.cursor) self.dbcnx.commit() cnx = system_source_cnx(self.system_source, special_privs='LANGUAGE C', @@ -699,7 +717,7 @@ """Actual restore of the current database. Use the value tostored in db_cache as input """ - self._drop(self.dbname) + self._drop(self.system_source['db-name']) createdb(self.helper, self.system_source, self.dbcnx, self.cursor, template=backup_coordinates) self.dbcnx.commit() @@ -771,7 +789,7 @@ dbfile = self.absolute_dbfile() backup_file = self.absolute_backup_file(db_id, 'sqlite') shutil.copy(dbfile, backup_file) - # Usefull to debug WHO write a database + # Useful to debug WHO writes a database # backup_stack = self.absolute_backup_file(db_id, '.stack') #with open(backup_stack, 'w') as backup_stack_file: # import traceback @@ -800,7 +818,6 @@ import atexit atexit.register(SQLiteTestDataBaseHandler._cleanup_all_tmpdb) -atexit.register(PostgresTestDataBaseHandler.killall) def install_sqlite_patch(querier): diff -r d4d36b583f40 -r a4fcee1e9789 devtools/data/qunit.css --- a/devtools/data/qunit.css Mon Mar 21 18:08:47 2016 +0100 +++ b/devtools/data/qunit.css Thu Mar 24 09:43:25 2016 +0100 @@ -1,119 +1,291 @@ +/*! + * QUnit 1.18.0 + * http://qunitjs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-04-03T10:23Z + */ -ol#qunit-tests { - font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; - margin:0; - padding:0; - list-style-position:inside; +/** Font Family and Sizes */ + +#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult { + font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif; +} + +#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; } +#qunit-tests { font-size: smaller; } + + +/** Resets */ + +#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter { + margin: 0; + padding: 0; +} + + +/** Header */ + +#qunit-header { + padding: 0.5em 0 0.5em 1em; - font-size: smaller; + color: #8699A4; + background-color: #0D3349; + + font-size: 1.5em; + line-height: 1em; + font-weight: 400; + + border-radius: 5px 5px 0 0; +} + +#qunit-header a { + text-decoration: none; + color: #C2CCD1; } -ol#qunit-tests li{ - padding:0.4em 0.5em 0.4em 2.5em; - border-bottom:1px solid #fff; - font-size:small; - list-style-position:inside; + +#qunit-header a:hover, +#qunit-header a:focus { + color: #FFF; +} + +#qunit-testrunner-toolbar label { + display: inline-block; + padding: 0 0.5em 0 0.1em; +} + +#qunit-banner { + height: 5px; +} + +#qunit-testrunner-toolbar { + padding: 0.5em 1em 0.5em 1em; + color: #5E740B; + background-color: #EEE; + overflow: hidden; } -ol#qunit-tests li ol{ - box-shadow: inset 0px 2px 13px #999; - -moz-box-shadow: inset 0px 2px 13px #999; - -webkit-box-shadow: inset 0px 2px 13px #999; - margin-top:0.5em; - margin-left:0; - padding:0.5em; - background-color:#fff; - border-radius:15px; - -moz-border-radius: 15px; - -webkit-border-radius: 15px; + +#qunit-userAgent { + padding: 0.5em 1em 0.5em 1em; + background-color: #2B81AF; + color: #FFF; + text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px; +} + +#qunit-modulefilter-container { + float: right; + padding: 0.2em; +} + +.qunit-url-config { + display: inline-block; + padding: 0.1em; +} + +.qunit-filter { + display: block; + float: right; + margin-left: 1em; +} + +/** Tests: Pass/Fail */ + +#qunit-tests { + list-style-position: inside; +} + +#qunit-tests li { + padding: 0.4em 1em 0.4em 1em; + border-bottom: 1px solid #FFF; + list-style-position: inside; } -ol#qunit-tests li li{ - border-bottom:none; - margin:0.5em; - background-color:#fff; - list-style-position: inside; - padding:0.4em 0.5em 0.4em 0.5em; + +#qunit-tests > li { + display: none; +} + +#qunit-tests li.running, +#qunit-tests li.pass, +#qunit-tests li.fail, +#qunit-tests li.skipped { + display: list-item; +} + +#qunit-tests.hidepass li.running, +#qunit-tests.hidepass li.pass { + visibility: hidden; + position: absolute; + width: 0px; + height: 0px; + padding: 0; + border: 0; + margin: 0; +} + +#qunit-tests li strong { + cursor: pointer; +} + +#qunit-tests li.skipped strong { + cursor: default; +} + +#qunit-tests li a { + padding: 0.5em; + color: #C2CCD1; + text-decoration: none; } -ol#qunit-tests li li.pass{ - border-left:26px solid #C6E746; - background-color:#fff; - color:#5E740B; - } -ol#qunit-tests li li.fail{ - border-left:26px solid #EE5757; - background-color:#fff; - color:#710909; +#qunit-tests li p a { + padding: 0.25em; + color: #6B6464; +} +#qunit-tests li a:hover, +#qunit-tests li a:focus { + color: #000; +} + +#qunit-tests li .runtime { + float: right; + font-size: smaller; } -ol#qunit-tests li.pass{ - background-color:#D2E0E6; - color:#528CE0; + +.qunit-assert-list { + margin-top: 0.5em; + padding: 0.5em; + + background-color: #FFF; + + border-radius: 5px; } -ol#qunit-tests li.fail{ - background-color:#EE5757; - color:#000; + +.qunit-collapsed { + display: none; +} + +#qunit-tests table { + border-collapse: collapse; + margin-top: 0.2em; } -ol#qunit-tests li strong { - cursor:pointer; + +#qunit-tests th { + text-align: right; + vertical-align: top; + padding: 0 0.5em 0 0; +} + +#qunit-tests td { + vertical-align: top; +} + +#qunit-tests pre { + margin: 0; + white-space: pre-wrap; + word-wrap: break-word; } -h1#qunit-header{ - background-color:#0d3349; - margin:0; - padding:0.5em 0 0.5em 1em; - color:#fff; - font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; - border-top-right-radius:15px; - border-top-left-radius:15px; - -moz-border-radius-topright:15px; - -moz-border-radius-topleft:15px; - -webkit-border-top-right-radius:15px; - -webkit-border-top-left-radius:15px; - text-shadow: rgba(0, 0, 0, 0.5) 4px 4px 1px; + +#qunit-tests del { + background-color: #E0F2BE; + color: #374E0C; + text-decoration: none; +} + +#qunit-tests ins { + background-color: #FFCACA; + color: #500; + text-decoration: none; } -h2#qunit-banner{ - font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; - height:5px; - margin:0; - padding:0; + +/*** Test Counts */ + +#qunit-tests b.counts { color: #000; } +#qunit-tests b.passed { color: #5E740B; } +#qunit-tests b.failed { color: #710909; } + +#qunit-tests li li { + padding: 5px; + background-color: #FFF; + border-bottom: none; + list-style-position: inside; } -h2#qunit-banner.qunit-pass{ - background-color:#C6E746; -} -h2#qunit-banner.qunit-fail, #qunit-testrunner-toolbar { - background-color:#EE5757; + +/*** Passing Styles */ + +#qunit-tests li li.pass { + color: #3C510C; + background-color: #FFF; + border-left: 10px solid #C6E746; } -#qunit-testrunner-toolbar { - font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; - padding:0; - /*width:80%;*/ - padding:0em 0 0.5em 2em; - font-size: small; + +#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; } +#qunit-tests .pass .test-name { color: #366097; } + +#qunit-tests .pass .test-actual, +#qunit-tests .pass .test-expected { color: #999; } + +#qunit-banner.qunit-pass { background-color: #C6E746; } + +/*** Failing Styles */ + +#qunit-tests li li.fail { + color: #710909; + background-color: #FFF; + border-left: 10px solid #EE5757; + white-space: pre; +} + +#qunit-tests > li:last-child { + border-radius: 0 0 5px 5px; } -h2#qunit-userAgent { - font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; - background-color:#2b81af; - margin:0; - padding:0; - color:#fff; - font-size: small; - padding:0.5em 0 0.5em 2.5em; - text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px; + +#qunit-tests .fail { color: #000; background-color: #EE5757; } +#qunit-tests .fail .test-name, +#qunit-tests .fail .module-name { color: #000; } + +#qunit-tests .fail .test-actual { color: #EE5757; } +#qunit-tests .fail .test-expected { color: #008000; } + +#qunit-banner.qunit-fail { background-color: #EE5757; } + +/*** Skipped tests */ + +#qunit-tests .skipped { + background-color: #EBECE9; +} + +#qunit-tests .qunit-skipped-label { + background-color: #F4FF77; + display: inline-block; + font-style: normal; + color: #366097; + line-height: 1.8em; + padding: 0 0.5em; + margin: -0.4em 0.4em -0.4em 0; } -p#qunit-testresult{ - font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; - margin:0; - font-size: small; - color:#2b81af; - border-bottom-right-radius:15px; - border-bottom-left-radius:15px; - -moz-border-radius-bottomright:15px; - -moz-border-radius-bottomleft:15px; - -webkit-border-bottom-right-radius:15px; - -webkit-border-bottom-left-radius:15px; - background-color:#D2E0E6; - padding:0.5em 0.5em 0.5em 2.5em; + +/** Result */ + +#qunit-testresult { + padding: 0.5em 1em 0.5em 1em; + + color: #2B81AF; + background-color: #D2E0E6; + + border-bottom: 1px solid #FFF; } -strong b.fail{ - color:#710909; - } -strong b.pass{ - color:#5E740B; - } +#qunit-testresult .module-name { + font-weight: 700; +} + +/** Fixture */ + +#qunit-fixture { + position: absolute; + top: -10000px; + left: -10000px; + width: 1000px; + height: 1000px; +} diff -r d4d36b583f40 -r a4fcee1e9789 devtools/data/qunit.js --- a/devtools/data/qunit.js Mon Mar 21 18:08:47 2016 +0100 +++ b/devtools/data/qunit.js Thu Mar 24 09:43:25 2016 +0100 @@ -1,643 +1,713 @@ -/* - * QUnit - A JavaScript Unit Testing Framework - * - * http://docs.jquery.com/QUnit +/*! + * QUnit 1.18.0 + * http://qunitjs.com/ * - * Copyright (c) 2009 John Resig, Jörn Zaefferer - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-04-03T10:23Z */ -(function(window) { - -var QUnit = { - - // Initialize the configuration options - init: function() { - config = { - stats: { all: 0, bad: 0 }, - moduleStats: { all: 0, bad: 0 }, - started: +new Date, - updateRate: 1000, - blocking: false, - autorun: false, - assertions: [], - filters: [], - queue: [] - }; - - var tests = id("qunit-tests"), - banner = id("qunit-banner"), - result = id("qunit-testresult"); - - if ( tests ) { - tests.innerHTML = ""; - } - - if ( banner ) { - banner.className = ""; - } - - if ( result ) { - result.parentNode.removeChild( result ); +(function( window ) { + +var QUnit, + config, + onErrorFnPrev, + loggingCallbacks = {}, + fileName = ( sourceFromStacktrace( 0 ) || "" ).replace( /(:\d+)+\)?/, "" ).replace( /.+\//, "" ), + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + // Keep a local reference to Date (GH-283) + Date = window.Date, + now = Date.now || function() { + return new Date().getTime(); + }, + globalStartCalled = false, + runStarted = false, + setTimeout = window.setTimeout, + clearTimeout = window.clearTimeout, + defined = { + document: window.document !== undefined, + setTimeout: window.setTimeout !== undefined, + sessionStorage: (function() { + var x = "qunit-test-string"; + try { + sessionStorage.setItem( x, x ); + sessionStorage.removeItem( x ); + return true; + } catch ( e ) { + return false; + } + }()) + }, + /** + * Provides a normalized error string, correcting an issue + * with IE 7 (and prior) where Error.prototype.toString is + * not properly implemented + * + * Based on http://es5.github.com/#x15.11.4.4 + * + * @param {String|Error} error + * @return {String} error message + */ + errorString = function( error ) { + var name, message, + errorString = error.toString(); + if ( errorString.substring( 0, 7 ) === "[object" ) { + name = error.name ? error.name.toString() : "Error"; + message = error.message ? error.message.toString() : ""; + if ( name && message ) { + return name + ": " + message; + } else if ( name ) { + return name; + } else if ( message ) { + return message; + } else { + return "Error"; + } + } else { + return errorString; } }, - - // call on start of module test to prepend name to all tests - module: function(name, testEnvironment) { - config.currentModule = name; - - synchronize(function() { - if ( config.currentModule ) { - QUnit.moduleDone( config.currentModule, config.moduleStats.bad, config.moduleStats.all ); + /** + * Makes a clone of an object using only Array or Object as base, + * and copies over the own enumerable properties. + * + * @param {Object} obj + * @return {Object} New object with only the own properties (recursively). + */ + objectValues = function( obj ) { + var key, val, + vals = QUnit.is( "array", obj ) ? [] : {}; + for ( key in obj ) { + if ( hasOwn.call( obj, key ) ) { + val = obj[ key ]; + vals[ key ] = val === Object( val ) ? objectValues( val ) : val; } - - config.currentModule = name; - config.moduleTestEnvironment = testEnvironment; - config.moduleStats = { all: 0, bad: 0 }; - - QUnit.moduleStart( name, testEnvironment ); - }); + } + return vals; + }; + +QUnit = {}; + +/** + * Config object: Maintain internal state + * Later exposed as QUnit.config + * `config` initialized at top of scope + */ +config = { + // The queue of tests to run + queue: [], + + // block until document ready + blocking: true, + + // by default, run previously failed tests first + // very useful in combination with "Hide passed tests" checked + reorder: true, + + // by default, modify document.title when suite is done + altertitle: true, + + // by default, scroll to top of the page when suite is done + scrolltop: true, + + // when enabled, all tests must call expect() + requireExpects: false, + + // depth up-to which object will be dumped + maxDepth: 5, + + // add checkboxes that are persisted in the query-string + // when enabled, the id is set to `true` as a `QUnit.config` property + urlConfig: [ + { + id: "hidepassed", + label: "Hide passed tests", + tooltip: "Only show tests and assertions that fail. Stored as query-strings." + }, + { + id: "noglobals", + label: "Check for Globals", + tooltip: "Enabling this will test if any test introduces new properties on the " + + "`window` object. Stored as query-strings." + }, + { + id: "notrycatch", + label: "No try-catch", + tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging " + + "exceptions in IE reasonable. Stored as query-strings." + } + ], + + // Set of all modules. + modules: [], + + // The first unnamed module + currentModule: { + name: "", + tests: [] }, - asyncTest: function(testName, expected, callback) { + callbacks: {} +}; + +// Push a loose unnamed module to the modules collection +config.modules.push( config.currentModule ); + +// Initialize more QUnit.config and QUnit.urlParams +(function() { + var i, current, + location = window.location || { search: "", protocol: "file:" }, + params = location.search.slice( 1 ).split( "&" ), + length = params.length, + urlParams = {}; + + if ( params[ 0 ] ) { + for ( i = 0; i < length; i++ ) { + current = params[ i ].split( "=" ); + current[ 0 ] = decodeURIComponent( current[ 0 ] ); + + // allow just a key to turn on a flag, e.g., test.html?noglobals + current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true; + if ( urlParams[ current[ 0 ] ] ) { + urlParams[ current[ 0 ] ] = [].concat( urlParams[ current[ 0 ] ], current[ 1 ] ); + } else { + urlParams[ current[ 0 ] ] = current[ 1 ]; + } + } + } + + if ( urlParams.filter === true ) { + delete urlParams.filter; + } + + QUnit.urlParams = urlParams; + + // String search anywhere in moduleName+testName + config.filter = urlParams.filter; + + if ( urlParams.maxDepth ) { + config.maxDepth = parseInt( urlParams.maxDepth, 10 ) === -1 ? + Number.POSITIVE_INFINITY : + urlParams.maxDepth; + } + + config.testId = []; + if ( urlParams.testId ) { + + // Ensure that urlParams.testId is an array + urlParams.testId = decodeURIComponent( urlParams.testId ).split( "," ); + for ( i = 0; i < urlParams.testId.length; i++ ) { + config.testId.push( urlParams.testId[ i ] ); + } + } + + // Figure out if we're running the tests from a server or not + QUnit.isLocal = location.protocol === "file:"; + + // Expose the current QUnit version + QUnit.version = "1.18.0"; +}()); + +// Root QUnit object. +// `QUnit` initialized at top of scope +extend( QUnit, { + + // call on start of module test to prepend name to all tests + module: function( name, testEnvironment ) { + var currentModule = { + name: name, + testEnvironment: testEnvironment, + tests: [] + }; + + // DEPRECATED: handles setup/teardown functions, + // beforeEach and afterEach should be used instead + if ( testEnvironment && testEnvironment.setup ) { + testEnvironment.beforeEach = testEnvironment.setup; + delete testEnvironment.setup; + } + if ( testEnvironment && testEnvironment.teardown ) { + testEnvironment.afterEach = testEnvironment.teardown; + delete testEnvironment.teardown; + } + + config.modules.push( currentModule ); + config.currentModule = currentModule; + }, + + // DEPRECATED: QUnit.asyncTest() will be removed in QUnit 2.0. + asyncTest: function( testName, expected, callback ) { if ( arguments.length === 2 ) { callback = expected; - expected = 0; + expected = null; } - QUnit.test(testName, expected, callback, true); + QUnit.test( testName, expected, callback, true ); }, - - test: function(testName, expected, callback, async) { - var name = testName, testEnvironment, testEnvironmentArg; + + test: function( testName, expected, callback, async ) { + var test; if ( arguments.length === 2 ) { callback = expected; expected = null; } - // is 2nd argument a testEnvironment? - if ( expected && typeof expected === 'object') { - testEnvironmentArg = expected; - expected = null; - } - - if ( config.currentModule ) { - name = config.currentModule + " module: " + name; - } - - if ( !validTest(name) ) { - return; - } - - synchronize(function() { - QUnit.testStart( testName ); - - testEnvironment = extend({ - setup: function() {}, - teardown: function() {} - }, config.moduleTestEnvironment); - if (testEnvironmentArg) { - extend(testEnvironment,testEnvironmentArg); - } - - // allow utility functions to access the current test environment - QUnit.current_testEnvironment = testEnvironment; - - config.assertions = []; - config.expected = expected; - - try { - if ( !config.pollution ) { - saveGlobal(); - } - - testEnvironment.setup.call(testEnvironment); - } catch(e) { - QUnit.ok( false, "Setup failed on " + name + ": " + e.message ); - } - - if ( async ) { - QUnit.stop(); - } - - try { - callback.call(testEnvironment); - } catch(e) { - fail("Test " + name + " died, exception and test follows", e, callback); - QUnit.ok( false, "Died on test #" + (config.assertions.length + 1) + ": " + e.message ); - // else next test will carry the responsibility - saveGlobal(); - - // Restart the tests if they're blocking - if ( config.blocking ) { - start(); - } - } + + test = new Test({ + testName: testName, + expected: expected, + async: async, + callback: callback + }); + + test.queue(); + }, + + skip: function( testName ) { + var test = new Test({ + testName: testName, + skip: true }); - synchronize(function() { - try { - checkPollution(); - testEnvironment.teardown.call(testEnvironment); - } catch(e) { - QUnit.ok( false, "Teardown failed on " + name + ": " + e.message ); - } - - try { - QUnit.reset(); - } catch(e) { - fail("reset() failed, following Test " + name + ", exception and reset fn follows", e, reset); - } - - if ( config.expected && config.expected != config.assertions.length ) { - QUnit.ok( false, "Expected " + config.expected + " assertions, but " + config.assertions.length + " were run" ); + test.queue(); + }, + + // DEPRECATED: The functionality of QUnit.start() will be altered in QUnit 2.0. + // In QUnit 2.0, invoking it will ONLY affect the `QUnit.config.autostart` blocking behavior. + start: function( count ) { + var globalStartAlreadyCalled = globalStartCalled; + + if ( !config.current ) { + globalStartCalled = true; + + if ( runStarted ) { + throw new Error( "Called start() outside of a test context while already started" ); + } else if ( globalStartAlreadyCalled || count > 1 ) { + throw new Error( "Called start() outside of a test context too many times" ); + } else if ( config.autostart ) { + throw new Error( "Called start() outside of a test context when " + + "QUnit.config.autostart was true" ); + } else if ( !config.pageLoaded ) { + + // The page isn't completely loaded yet, so bail out and let `QUnit.load` handle it + config.autostart = true; + return; } - - var good = 0, bad = 0, - tests = id("qunit-tests"); - - config.stats.all += config.assertions.length; - config.moduleStats.all += config.assertions.length; - - if ( tests ) { - var ol = document.createElement("ol"); - ol.style.display = "none"; - - for ( var i = 0; i < config.assertions.length; i++ ) { - var assertion = config.assertions[i]; - - var li = document.createElement("li"); - li.className = assertion.result ? "pass" : "fail"; - li.appendChild(document.createTextNode(assertion.message || "(no message)")); - ol.appendChild( li ); - - if ( assertion.result ) { - good++; - } else { - bad++; - config.stats.bad++; - config.moduleStats.bad++; - } - } - - var b = document.createElement("strong"); - b.innerHTML = name + " (" + bad + ", " + good + ", " + config.assertions.length + ")"; - - addEvent(b, "click", function() { - var next = b.nextSibling, display = next.style.display; - next.style.display = display === "none" ? "block" : "none"; - }); - - addEvent(b, "dblclick", function(e) { - var target = e && e.target ? e.target : window.event.srcElement; - if ( target.nodeName.toLowerCase() === "strong" ) { - var text = "", node = target.firstChild; - - while ( node.nodeType === 3 ) { - text += node.nodeValue; - node = node.nextSibling; - } - - text = text.replace(/(^\s*|\s*$)/g, ""); - - if ( window.location ) { - window.location.href = window.location.href.match(/^(.+?)(\?.*)?$/)[1] + "?" + encodeURIComponent(text); - } - } - }); - - var li = document.createElement("li"); - li.className = bad ? "fail" : "pass"; - li.appendChild( b ); - li.appendChild( ol ); - tests.appendChild( li ); - - if ( bad ) { - var toolbar = id("qunit-testrunner-toolbar"); - if ( toolbar ) { - toolbar.style.display = "block"; - id("qunit-filter-pass").disabled = null; - id("qunit-filter-missing").disabled = null; - } - } - - } else { - for ( var i = 0; i < config.assertions.length; i++ ) { - if ( !config.assertions[i].result ) { - bad++; - config.stats.bad++; - config.moduleStats.bad++; - } - } + } else { + + // If a test is running, adjust its semaphore + config.current.semaphore -= count || 1; + + // Don't start until equal number of stop-calls + if ( config.current.semaphore > 0 ) { + return; } - QUnit.testDone( testName, bad, config.assertions.length ); - - if ( !window.setTimeout && !config.queue.length ) { - done(); + // throw an Error if start is called more often than stop + if ( config.current.semaphore < 0 ) { + config.current.semaphore = 0; + + QUnit.pushFailure( + "Called start() while already started (test's semaphore was 0 already)", + sourceFromStacktrace( 2 ) + ); + return; } - }); - - if ( window.setTimeout && !config.doneTimer ) { - config.doneTimer = window.setTimeout(function(){ - if ( !config.queue.length ) { - done(); - } else { - synchronize( done ); - } - }, 13); } - }, - - /** - * Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through. - */ - expect: function(asserts) { - config.expected = asserts; + + resumeProcessing(); }, - /** - * Asserts true. - * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" ); - */ - ok: function(a, msg) { - QUnit.log(a, msg); - - config.assertions.push({ - result: !!a, - message: msg - }); - }, - - /** - * Checks that the first two arguments are equal, with an optional message. - * Prints out both actual and expected values. - * - * Prefered to ok( actual == expected, message ) - * - * @example equal( format("Received {0} bytes.", 2), "Received 2 bytes." ); - * - * @param Object actual - * @param Object expected - * @param String message (optional) - */ - equal: function(actual, expected, message) { - push(expected == actual, actual, expected, message); - }, - - notEqual: function(actual, expected, message) { - push(expected != actual, actual, expected, message); - }, - - deepEqual: function(a, b, message) { - push(QUnit.equiv(a, b), a, b, message); - }, - - notDeepEqual: function(a, b, message) { - push(!QUnit.equiv(a, b), a, b, message); - }, - - strictEqual: function(actual, expected, message) { - push(expected === actual, actual, expected, message); - }, - - notStrictEqual: function(actual, expected, message) { - push(expected !== actual, actual, expected, message); + // DEPRECATED: QUnit.stop() will be removed in QUnit 2.0. + stop: function( count ) { + + // If there isn't a test running, don't allow QUnit.stop() to be called + if ( !config.current ) { + throw new Error( "Called stop() outside of a test context" ); + } + + // If a test is running, adjust its semaphore + config.current.semaphore += count || 1; + + pauseProcessing(); }, - - start: function() { - // A slight delay, to avoid any current callbacks - if ( window.setTimeout ) { - window.setTimeout(function() { - if ( config.timeout ) { - clearTimeout(config.timeout); - } - - config.blocking = false; - process(); - }, 13); - } else { - config.blocking = false; - process(); - } - }, - - stop: function(timeout) { - config.blocking = true; - - if ( timeout && window.setTimeout ) { - config.timeout = window.setTimeout(function() { - QUnit.ok( false, "Test timed out" ); - QUnit.start(); - }, timeout); - } - }, - - /** - * Resets the test setup. Useful for tests that modify the DOM. - */ - reset: function() { - if ( window.jQuery ) { - jQuery("#main").html( config.fixture ); - jQuery.event.global = {}; - jQuery.ajaxSettings = extend({}, config.ajaxSettings); - } - }, - - /** - * Trigger an event on an element. - * - * @example triggerEvent( document.body, "click" ); - * - * @param DOMElement elem - * @param String type - */ - triggerEvent: function( elem, type, event ) { - if ( document.createEvent ) { - event = document.createEvent("MouseEvents"); - event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView, - 0, 0, 0, 0, 0, false, false, false, false, 0, null); - elem.dispatchEvent( event ); - - } else if ( elem.fireEvent ) { - elem.fireEvent("on"+type); - } - }, - + + config: config, + // Safe object type checking is: function( type, obj ) { - return Object.prototype.toString.call( obj ) === "[object "+ type +"]"; + return QUnit.objectType( obj ) === type; }, - - // Logging callbacks - done: function(failures, total) {}, - log: function(result, message) {}, - testStart: function(name) {}, - testDone: function(name, failures, total) {}, - moduleStart: function(name, testEnvironment) {}, - moduleDone: function(name, failures, total) {} -}; - -// Backwards compatibility, deprecated -QUnit.equals = QUnit.equal; -QUnit.same = QUnit.deepEqual; - -// Maintain internal state -var config = { - // The queue of tests to run - queue: [], - - // block until document ready - blocking: true -}; - -// Load paramaters -(function() { - var location = window.location || { search: "", protocol: "file:" }, - GETParams = location.search.slice(1).split('&'); - - for ( var i = 0; i < GETParams.length; i++ ) { - GETParams[i] = decodeURIComponent( GETParams[i] ); - if ( GETParams[i] === "noglobals" ) { - GETParams.splice( i, 1 ); - i--; - config.noglobals = true; - } else if ( GETParams[i].search('=') > -1 ) { - GETParams.splice( i, 1 ); - i--; + + objectType: function( obj ) { + if ( typeof obj === "undefined" ) { + return "undefined"; + } + + // Consider: typeof null === object + if ( obj === null ) { + return "null"; + } + + var match = toString.call( obj ).match( /^\[object\s(.*)\]$/ ), + type = match && match[ 1 ] || ""; + + switch ( type ) { + case "Number": + if ( isNaN( obj ) ) { + return "nan"; + } + return "number"; + case "String": + case "Boolean": + case "Array": + case "Date": + case "RegExp": + case "Function": + return type.toLowerCase(); + } + if ( typeof obj === "object" ) { + return "object"; + } + return undefined; + }, + + extend: extend, + + load: function() { + config.pageLoaded = true; + + // Initialize the configuration options + extend( config, { + stats: { all: 0, bad: 0 }, + moduleStats: { all: 0, bad: 0 }, + started: 0, + updateRate: 1000, + autostart: true, + filter: "" + }, true ); + + config.blocking = false; + + if ( config.autostart ) { + resumeProcessing(); } } - - // restrict modules/tests by get parameters - config.filters = GETParams; - - // Figure out if we're running the tests from a server or not - QUnit.isLocal = !!(location.protocol === 'file:'); -})(); - -// Expose the API as global variables, unless an 'exports' -// object exists, in that case we assume we're in CommonJS -if ( typeof exports === "undefined" || typeof require === "undefined" ) { - extend(window, QUnit); - window.QUnit = QUnit; -} else { - extend(exports, QUnit); - exports.QUnit = QUnit; -} - -if ( typeof document === "undefined" || document.readyState === "complete" ) { - config.autorun = true; -} - -addEvent(window, "load", function() { - // Initialize the config, saving the execution queue - var oldconfig = extend({}, config); - QUnit.init(); - extend(config, oldconfig); - - config.blocking = false; - - var userAgent = id("qunit-userAgent"); - if ( userAgent ) { - userAgent.innerHTML = navigator.userAgent; +}); + +// Register logging callbacks +(function() { + var i, l, key, + callbacks = [ "begin", "done", "log", "testStart", "testDone", + "moduleStart", "moduleDone" ]; + + function registerLoggingCallback( key ) { + var loggingCallback = function( callback ) { + if ( QUnit.objectType( callback ) !== "function" ) { + throw new Error( + "QUnit logging methods require a callback function as their first parameters." + ); + } + + config.callbacks[ key ].push( callback ); + }; + + // DEPRECATED: This will be removed on QUnit 2.0.0+ + // Stores the registered functions allowing restoring + // at verifyLoggingCallbacks() if modified + loggingCallbacks[ key ] = loggingCallback; + + return loggingCallback; } - - var toolbar = id("qunit-testrunner-toolbar"); - if ( toolbar ) { - toolbar.style.display = "none"; - - var filter = document.createElement("input"); - filter.type = "checkbox"; - filter.id = "qunit-filter-pass"; - filter.disabled = true; - addEvent( filter, "click", function() { - var li = document.getElementsByTagName("li"); - for ( var i = 0; i < li.length; i++ ) { - if ( li[i].className.indexOf("pass") > -1 ) { - li[i].style.display = filter.checked ? "none" : ""; - } + + for ( i = 0, l = callbacks.length; i < l; i++ ) { + key = callbacks[ i ]; + + // Initialize key collection of logging callback + if ( QUnit.objectType( config.callbacks[ key ] ) === "undefined" ) { + config.callbacks[ key ] = []; + } + + QUnit[ key ] = registerLoggingCallback( key ); + } +})(); + +// `onErrorFnPrev` initialized at top of scope +// Preserve other handlers +onErrorFnPrev = window.onerror; + +// Cover uncaught exceptions +// Returning true will suppress the default browser handler, +// returning false will let it run. +window.onerror = function( error, filePath, linerNr ) { + var ret = false; + if ( onErrorFnPrev ) { + ret = onErrorFnPrev( error, filePath, linerNr ); + } + + // Treat return value as window.onerror itself does, + // Only do our handling if not suppressed. + if ( ret !== true ) { + if ( QUnit.config.current ) { + if ( QUnit.config.current.ignoreGlobalErrors ) { + return true; } - }); - toolbar.appendChild( filter ); - - var label = document.createElement("label"); - label.setAttribute("for", "qunit-filter-pass"); - label.innerHTML = "Hide passed tests"; - toolbar.appendChild( label ); - - var missing = document.createElement("input"); - missing.type = "checkbox"; - missing.id = "qunit-filter-missing"; - missing.disabled = true; - addEvent( missing, "click", function() { - var li = document.getElementsByTagName("li"); - for ( var i = 0; i < li.length; i++ ) { - if ( li[i].className.indexOf("fail") > -1 && li[i].innerHTML.indexOf('missing test - untested code is broken code') > - 1 ) { - li[i].parentNode.parentNode.style.display = missing.checked ? "none" : "block"; - } - } - }); - toolbar.appendChild( missing ); - - label = document.createElement("label"); - label.setAttribute("for", "qunit-filter-missing"); - label.innerHTML = "Hide missing tests (untested code is broken code)"; - toolbar.appendChild( label ); + QUnit.pushFailure( error, filePath + ":" + linerNr ); + } else { + QUnit.test( "global failure", extend(function() { + QUnit.pushFailure( error, filePath + ":" + linerNr ); + }, { validTest: true } ) ); + } + return false; } - var main = id('main'); - if ( main ) { - config.fixture = main.innerHTML; - } - - if ( window.jQuery ) { - config.ajaxSettings = window.jQuery.ajaxSettings; - } - - QUnit.start(); -}); + return ret; +}; function done() { - if ( config.doneTimer && window.clearTimeout ) { - window.clearTimeout( config.doneTimer ); - config.doneTimer = null; - } - - if ( config.queue.length ) { - config.doneTimer = window.setTimeout(function(){ - if ( !config.queue.length ) { - done(); - } else { - synchronize( done ); - } - }, 13); - - return; - } + var runtime, passed; config.autorun = true; // Log the last module results - if ( config.currentModule ) { - QUnit.moduleDone( config.currentModule, config.moduleStats.bad, config.moduleStats.all ); - } - - var banner = id("qunit-banner"), - tests = id("qunit-tests"), - html = ['Tests completed in ', - +new Date - config.started, ' milliseconds.
', - '', config.stats.all - config.stats.bad, ' tests of ', config.stats.all, ' passed, ', config.stats.bad,' failed.'].join(''); - - if ( banner ) { - banner.className = (config.stats.bad ? "qunit-fail" : "qunit-pass"); - } - - if ( tests ) { - var result = id("qunit-testresult"); - - if ( !result ) { - result = document.createElement("p"); - result.id = "qunit-testresult"; - result.className = "result"; - tests.parentNode.insertBefore( result, tests.nextSibling ); - } - - result.innerHTML = html; + if ( config.previousModule ) { + runLoggingCallbacks( "moduleDone", { + name: config.previousModule.name, + tests: config.previousModule.tests, + failed: config.moduleStats.bad, + passed: config.moduleStats.all - config.moduleStats.bad, + total: config.moduleStats.all, + runtime: now() - config.moduleStats.started + }); } - - QUnit.done( config.stats.bad, config.stats.all ); + delete config.previousModule; + + runtime = now() - config.started; + passed = config.stats.all - config.stats.bad; + + runLoggingCallbacks( "done", { + failed: config.stats.bad, + passed: passed, + total: config.stats.all, + runtime: runtime + }); } -function validTest( name ) { - var i = config.filters.length, - run = false; - - if ( !i ) { - return true; +// Doesn't support IE6 to IE9, it will return undefined on these browsers +// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack +function extractStacktrace( e, offset ) { + offset = offset === undefined ? 4 : offset; + + var stack, include, i; + + if ( e.stack ) { + stack = e.stack.split( "\n" ); + if ( /^error$/i.test( stack[ 0 ] ) ) { + stack.shift(); + } + if ( fileName ) { + include = []; + for ( i = offset; i < stack.length; i++ ) { + if ( stack[ i ].indexOf( fileName ) !== -1 ) { + break; + } + include.push( stack[ i ] ); + } + if ( include.length ) { + return include.join( "\n" ); + } + } + return stack[ offset ]; + + // Support: Safari <=6 only + } else if ( e.sourceURL ) { + + // exclude useless self-reference for generated Error objects + if ( /qunit.js$/.test( e.sourceURL ) ) { + return; + } + + // for actual exceptions, this is useful + return e.sourceURL + ":" + e.line; } - - while ( i-- ) { - var filter = config.filters[i], - not = filter.charAt(0) == '!'; - - if ( not ) { - filter = filter.slice(1); - } - - if ( name.indexOf(filter) !== -1 ) { - return !not; - } - - if ( not ) { - run = true; +} + +function sourceFromStacktrace( offset ) { + var error = new Error(); + + // Support: Safari <=7 only, IE <=10 - 11 only + // Not all browsers generate the `stack` property for `new Error()`, see also #636 + if ( !error.stack ) { + try { + throw error; + } catch ( err ) { + error = err; } } - return run; + return extractStacktrace( error, offset ); } -function push(result, actual, expected, message) { - message = message || (result ? "okay" : "failed"); - QUnit.ok( result, result ? message + ": " + QUnit.jsDump.parse(expected) : message + ", expected: " + QUnit.jsDump.parse(expected) + " result: " + QUnit.jsDump.parse(actual) ); -} - -function synchronize( callback ) { +function synchronize( callback, last ) { + if ( QUnit.objectType( callback ) === "array" ) { + while ( callback.length ) { + synchronize( callback.shift() ); + } + return; + } config.queue.push( callback ); if ( config.autorun && !config.blocking ) { - process(); + process( last ); } } -function process() { - var start = (new Date()).getTime(); +function process( last ) { + function next() { + process( last ); + } + var start = now(); + config.depth = ( config.depth || 0 ) + 1; while ( config.queue.length && !config.blocking ) { - if ( config.updateRate <= 0 || (((new Date()).getTime() - start) < config.updateRate) ) { + if ( !defined.setTimeout || config.updateRate <= 0 || + ( ( now() - start ) < config.updateRate ) ) { + if ( config.current ) { + + // Reset async tracking for each phase of the Test lifecycle + config.current.usedAsync = false; + } config.queue.shift()(); - } else { - setTimeout( process, 13 ); + setTimeout( next, 13 ); break; } } + config.depth--; + if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) { + done(); + } +} + +function begin() { + var i, l, + modulesLog = []; + + // If the test run hasn't officially begun yet + if ( !config.started ) { + + // Record the time of the test run's beginning + config.started = now(); + + verifyLoggingCallbacks(); + + // Delete the loose unnamed module if unused. + if ( config.modules[ 0 ].name === "" && config.modules[ 0 ].tests.length === 0 ) { + config.modules.shift(); + } + + // Avoid unnecessary information by not logging modules' test environments + for ( i = 0, l = config.modules.length; i < l; i++ ) { + modulesLog.push({ + name: config.modules[ i ].name, + tests: config.modules[ i ].tests + }); + } + + // The test run is officially beginning now + runLoggingCallbacks( "begin", { + totalTests: Test.count, + modules: modulesLog + }); + } + + config.blocking = false; + process( true ); +} + +function resumeProcessing() { + runStarted = true; + + // A slight delay to allow this iteration of the event loop to finish (more assertions, etc.) + if ( defined.setTimeout ) { + setTimeout(function() { + if ( config.current && config.current.semaphore > 0 ) { + return; + } + if ( config.timeout ) { + clearTimeout( config.timeout ); + } + + begin(); + }, 13 ); + } else { + begin(); + } +} + +function pauseProcessing() { + config.blocking = true; + + if ( config.testTimeout && defined.setTimeout ) { + clearTimeout( config.timeout ); + config.timeout = setTimeout(function() { + if ( config.current ) { + config.current.semaphore = 0; + QUnit.pushFailure( "Test timed out", sourceFromStacktrace( 2 ) ); + } else { + throw new Error( "Test timed out" ); + } + resumeProcessing(); + }, config.testTimeout ); + } } function saveGlobal() { config.pollution = []; - + if ( config.noglobals ) { for ( var key in window ) { - config.pollution.push( key ); + if ( hasOwn.call( window, key ) ) { + // in Opera sometimes DOM element ids show up here, ignore them + if ( /^qunit-test-output/.test( key ) ) { + continue; + } + config.pollution.push( key ); + } } } } -function checkPollution( name ) { - var old = config.pollution; +function checkPollution() { + var newGlobals, + deletedGlobals, + old = config.pollution; + saveGlobal(); - - var newGlobals = diff( old, config.pollution ); + + newGlobals = diff( config.pollution, old ); if ( newGlobals.length > 0 ) { - ok( false, "Introduced global variable(s): " + newGlobals.join(", ") ); - config.expected++; + QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join( ", " ) ); } - var deletedGlobals = diff( config.pollution, old ); + deletedGlobals = diff( old, config.pollution ); if ( deletedGlobals.length > 0 ) { - ok( false, "Deleted global variable(s): " + deletedGlobals.join(", ") ); - config.expected++; + QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join( ", " ) ); } } // returns a new Array with the elements that are in a but not in b function diff( a, b ) { - var result = a.slice(); - for ( var i = 0; i < result.length; i++ ) { - for ( var j = 0; j < b.length; j++ ) { - if ( result[i] === b[j] ) { - result.splice(i, 1); + var i, j, + result = a.slice(); + + for ( i = 0; i < result.length; i++ ) { + for ( j = 0; j < b.length; j++ ) { + if ( result[ i ] === b[ j ] ) { + result.splice( i, 1 ); i--; break; } @@ -646,424 +716,3113 @@ return result; } -function fail(message, exception, callback) { - if ( typeof console !== "undefined" && console.error && console.warn ) { - console.error(message); - console.error(exception); - console.warn(callback.toString()); - - } else if ( window.opera && opera.postError ) { - opera.postError(message, exception, callback.toString); - } -} - -function extend(a, b) { +function extend( a, b, undefOnly ) { for ( var prop in b ) { - a[prop] = b[prop]; + if ( hasOwn.call( b, prop ) ) { + + // Avoid "Member not found" error in IE8 caused by messing with window.constructor + if ( !( prop === "constructor" && a === window ) ) { + if ( b[ prop ] === undefined ) { + delete a[ prop ]; + } else if ( !( undefOnly && typeof a[ prop ] !== "undefined" ) ) { + a[ prop ] = b[ prop ]; + } + } + } } return a; } -function addEvent(elem, type, fn) { - if ( elem.addEventListener ) { - elem.addEventListener( type, fn, false ); - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, fn ); +function runLoggingCallbacks( key, args ) { + var i, l, callbacks; + + callbacks = config.callbacks[ key ]; + for ( i = 0, l = callbacks.length; i < l; i++ ) { + callbacks[ i ]( args ); + } +} + +// DEPRECATED: This will be removed on 2.0.0+ +// This function verifies if the loggingCallbacks were modified by the user +// If so, it will restore it, assign the given callback and print a console warning +function verifyLoggingCallbacks() { + var loggingCallback, userCallback; + + for ( loggingCallback in loggingCallbacks ) { + if ( QUnit[ loggingCallback ] !== loggingCallbacks[ loggingCallback ] ) { + + userCallback = QUnit[ loggingCallback ]; + + // Restore the callback function + QUnit[ loggingCallback ] = loggingCallbacks[ loggingCallback ]; + + // Assign the deprecated given callback + QUnit[ loggingCallback ]( userCallback ); + + if ( window.console && window.console.warn ) { + window.console.warn( + "QUnit." + loggingCallback + " was replaced with a new value.\n" + + "Please, check out the documentation on how to apply logging callbacks.\n" + + "Reference: http://api.qunitjs.com/category/callbacks/" + ); + } + } + } +} + +// from jquery.js +function inArray( elem, array ) { + if ( array.indexOf ) { + return array.indexOf( elem ); + } + + for ( var i = 0, length = array.length; i < length; i++ ) { + if ( array[ i ] === elem ) { + return i; + } + } + + return -1; +} + +function Test( settings ) { + var i, l; + + ++Test.count; + + extend( this, settings ); + this.assertions = []; + this.semaphore = 0; + this.usedAsync = false; + this.module = config.currentModule; + this.stack = sourceFromStacktrace( 3 ); + + // Register unique strings + for ( i = 0, l = this.module.tests; i < l.length; i++ ) { + if ( this.module.tests[ i ].name === this.testName ) { + this.testName += " "; + } + } + + this.testId = generateHash( this.module.name, this.testName ); + + this.module.tests.push({ + name: this.testName, + testId: this.testId + }); + + if ( settings.skip ) { + + // Skipped tests will fully ignore any sent callback + this.callback = function() {}; + this.async = false; + this.expected = 0; } else { - fn(); + this.assert = new Assert( this ); } } -function id(name) { - return !!(typeof document !== "undefined" && document && document.getElementById) && - document.getElementById( name ); +Test.count = 0; + +Test.prototype = { + before: function() { + if ( + + // Emit moduleStart when we're switching from one module to another + this.module !== config.previousModule || + + // They could be equal (both undefined) but if the previousModule property doesn't + // yet exist it means this is the first test in a suite that isn't wrapped in a + // module, in which case we'll just emit a moduleStart event for 'undefined'. + // Without this, reporters can get testStart before moduleStart which is a problem. + !hasOwn.call( config, "previousModule" ) + ) { + if ( hasOwn.call( config, "previousModule" ) ) { + runLoggingCallbacks( "moduleDone", { + name: config.previousModule.name, + tests: config.previousModule.tests, + failed: config.moduleStats.bad, + passed: config.moduleStats.all - config.moduleStats.bad, + total: config.moduleStats.all, + runtime: now() - config.moduleStats.started + }); + } + config.previousModule = this.module; + config.moduleStats = { all: 0, bad: 0, started: now() }; + runLoggingCallbacks( "moduleStart", { + name: this.module.name, + tests: this.module.tests + }); + } + + config.current = this; + + this.testEnvironment = extend( {}, this.module.testEnvironment ); + delete this.testEnvironment.beforeEach; + delete this.testEnvironment.afterEach; + + this.started = now(); + runLoggingCallbacks( "testStart", { + name: this.testName, + module: this.module.name, + testId: this.testId + }); + + if ( !config.pollution ) { + saveGlobal(); + } + }, + + run: function() { + var promise; + + config.current = this; + + if ( this.async ) { + QUnit.stop(); + } + + this.callbackStarted = now(); + + if ( config.notrycatch ) { + promise = this.callback.call( this.testEnvironment, this.assert ); + this.resolvePromise( promise ); + return; + } + + try { + promise = this.callback.call( this.testEnvironment, this.assert ); + this.resolvePromise( promise ); + } catch ( e ) { + this.pushFailure( "Died on test #" + ( this.assertions.length + 1 ) + " " + + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) ); + + // else next test will carry the responsibility + saveGlobal(); + + // Restart the tests if they're blocking + if ( config.blocking ) { + QUnit.start(); + } + } + }, + + after: function() { + checkPollution(); + }, + + queueHook: function( hook, hookName ) { + var promise, + test = this; + return function runHook() { + config.current = test; + if ( config.notrycatch ) { + promise = hook.call( test.testEnvironment, test.assert ); + test.resolvePromise( promise, hookName ); + return; + } + try { + promise = hook.call( test.testEnvironment, test.assert ); + test.resolvePromise( promise, hookName ); + } catch ( error ) { + test.pushFailure( hookName + " failed on " + test.testName + ": " + + ( error.message || error ), extractStacktrace( error, 0 ) ); + } + }; + }, + + // Currently only used for module level hooks, can be used to add global level ones + hooks: function( handler ) { + var hooks = []; + + // Hooks are ignored on skipped tests + if ( this.skip ) { + return hooks; + } + + if ( this.module.testEnvironment && + QUnit.objectType( this.module.testEnvironment[ handler ] ) === "function" ) { + hooks.push( this.queueHook( this.module.testEnvironment[ handler ], handler ) ); + } + + return hooks; + }, + + finish: function() { + config.current = this; + if ( config.requireExpects && this.expected === null ) { + this.pushFailure( "Expected number of assertions to be defined, but expect() was " + + "not called.", this.stack ); + } else if ( this.expected !== null && this.expected !== this.assertions.length ) { + this.pushFailure( "Expected " + this.expected + " assertions, but " + + this.assertions.length + " were run", this.stack ); + } else if ( this.expected === null && !this.assertions.length ) { + this.pushFailure( "Expected at least one assertion, but none were run - call " + + "expect(0) to accept zero assertions.", this.stack ); + } + + var i, + bad = 0; + + this.runtime = now() - this.started; + config.stats.all += this.assertions.length; + config.moduleStats.all += this.assertions.length; + + for ( i = 0; i < this.assertions.length; i++ ) { + if ( !this.assertions[ i ].result ) { + bad++; + config.stats.bad++; + config.moduleStats.bad++; + } + } + + runLoggingCallbacks( "testDone", { + name: this.testName, + module: this.module.name, + skipped: !!this.skip, + failed: bad, + passed: this.assertions.length - bad, + total: this.assertions.length, + runtime: this.runtime, + + // HTML Reporter use + assertions: this.assertions, + testId: this.testId, + + // DEPRECATED: this property will be removed in 2.0.0, use runtime instead + duration: this.runtime + }); + + // QUnit.reset() is deprecated and will be replaced for a new + // fixture reset function on QUnit 2.0/2.1. + // It's still called here for backwards compatibility handling + QUnit.reset(); + + config.current = undefined; + }, + + queue: function() { + var bad, + test = this; + + if ( !this.valid() ) { + return; + } + + function run() { + + // each of these can by async + synchronize([ + function() { + test.before(); + }, + + test.hooks( "beforeEach" ), + + function() { + test.run(); + }, + + test.hooks( "afterEach" ).reverse(), + + function() { + test.after(); + }, + function() { + test.finish(); + } + ]); + } + + // `bad` initialized at top of scope + // defer when previous test run passed, if storage is available + bad = QUnit.config.reorder && defined.sessionStorage && + +sessionStorage.getItem( "qunit-test-" + this.module.name + "-" + this.testName ); + + if ( bad ) { + run(); + } else { + synchronize( run, true ); + } + }, + + push: function( result, actual, expected, message ) { + var source, + details = { + module: this.module.name, + name: this.testName, + result: result, + message: message, + actual: actual, + expected: expected, + testId: this.testId, + runtime: now() - this.started + }; + + if ( !result ) { + source = sourceFromStacktrace(); + + if ( source ) { + details.source = source; + } + } + + runLoggingCallbacks( "log", details ); + + this.assertions.push({ + result: !!result, + message: message + }); + }, + + pushFailure: function( message, source, actual ) { + if ( !this instanceof Test ) { + throw new Error( "pushFailure() assertion outside test context, was " + + sourceFromStacktrace( 2 ) ); + } + + var details = { + module: this.module.name, + name: this.testName, + result: false, + message: message || "error", + actual: actual || null, + testId: this.testId, + runtime: now() - this.started + }; + + if ( source ) { + details.source = source; + } + + runLoggingCallbacks( "log", details ); + + this.assertions.push({ + result: false, + message: message + }); + }, + + resolvePromise: function( promise, phase ) { + var then, message, + test = this; + if ( promise != null ) { + then = promise.then; + if ( QUnit.objectType( then ) === "function" ) { + QUnit.stop(); + then.call( + promise, + QUnit.start, + function( error ) { + message = "Promise rejected " + + ( !phase ? "during" : phase.replace( /Each$/, "" ) ) + + " " + test.testName + ": " + ( error.message || error ); + test.pushFailure( message, extractStacktrace( error, 0 ) ); + + // else next test will carry the responsibility + saveGlobal(); + + // Unblock + QUnit.start(); + } + ); + } + } + }, + + valid: function() { + var include, + filter = config.filter && config.filter.toLowerCase(), + module = QUnit.urlParams.module && QUnit.urlParams.module.toLowerCase(), + fullName = ( this.module.name + ": " + this.testName ).toLowerCase(); + + // Internally-generated tests are always valid + if ( this.callback && this.callback.validTest ) { + return true; + } + + if ( config.testId.length > 0 && inArray( this.testId, config.testId ) < 0 ) { + return false; + } + + if ( module && ( !this.module.name || this.module.name.toLowerCase() !== module ) ) { + return false; + } + + if ( !filter ) { + return true; + } + + include = filter.charAt( 0 ) !== "!"; + if ( !include ) { + filter = filter.slice( 1 ); + } + + // If the filter matches, we need to honour include + if ( fullName.indexOf( filter ) !== -1 ) { + return include; + } + + // Otherwise, do the opposite + return !include; + } + +}; + +// Resets the test setup. Useful for tests that modify the DOM. +/* +DEPRECATED: Use multiple tests instead of resetting inside a test. +Use testStart or testDone for custom cleanup. +This method will throw an error in 2.0, and will be removed in 2.1 +*/ +QUnit.reset = function() { + + // Return on non-browser environments + // This is necessary to not break on node tests + if ( typeof window === "undefined" ) { + return; + } + + var fixture = defined.document && document.getElementById && + document.getElementById( "qunit-fixture" ); + + if ( fixture ) { + fixture.innerHTML = config.fixture; + } +}; + +QUnit.pushFailure = function() { + if ( !QUnit.config.current ) { + throw new Error( "pushFailure() assertion outside test context, in " + + sourceFromStacktrace( 2 ) ); + } + + // Gets current test obj + var currentTest = QUnit.config.current; + + return currentTest.pushFailure.apply( currentTest, arguments ); +}; + +// Based on Java's String.hashCode, a simple but not +// rigorously collision resistant hashing function +function generateHash( module, testName ) { + var hex, + i = 0, + hash = 0, + str = module + "\x1C" + testName, + len = str.length; + + for ( ; i < len; i++ ) { + hash = ( ( hash << 5 ) - hash ) + str.charCodeAt( i ); + hash |= 0; + } + + // Convert the possibly negative integer hash code into an 8 character hex string, which isn't + // strictly necessary but increases user understanding that the id is a SHA-like hash + hex = ( 0x100000000 + hash ).toString( 16 ); + if ( hex.length < 8 ) { + hex = "0000000" + hex; + } + + return hex.slice( -8 ); } +function Assert( testContext ) { + this.test = testContext; +} + +// Assert helpers +QUnit.assert = Assert.prototype = { + + // Specify the number of expected assertions to guarantee that failed test + // (no assertions are run at all) don't slip through. + expect: function( asserts ) { + if ( arguments.length === 1 ) { + this.test.expected = asserts; + } else { + return this.test.expected; + } + }, + + // Increment this Test's semaphore counter, then return a single-use function that + // decrements that counter a maximum of once. + async: function() { + var test = this.test, + popped = false; + + test.semaphore += 1; + test.usedAsync = true; + pauseProcessing(); + + return function done() { + if ( !popped ) { + test.semaphore -= 1; + popped = true; + resumeProcessing(); + } else { + test.pushFailure( "Called the callback returned from `assert.async` more than once", + sourceFromStacktrace( 2 ) ); + } + }; + }, + + // Exports test.push() to the user API + push: function( /* result, actual, expected, message */ ) { + var assert = this, + currentTest = ( assert instanceof Assert && assert.test ) || QUnit.config.current; + + // Backwards compatibility fix. + // Allows the direct use of global exported assertions and QUnit.assert.* + // Although, it's use is not recommended as it can leak assertions + // to other tests from async tests, because we only get a reference to the current test, + // not exactly the test where assertion were intended to be called. + if ( !currentTest ) { + throw new Error( "assertion outside test context, in " + sourceFromStacktrace( 2 ) ); + } + + if ( currentTest.usedAsync === true && currentTest.semaphore === 0 ) { + currentTest.pushFailure( "Assertion after the final `assert.async` was resolved", + sourceFromStacktrace( 2 ) ); + + // Allow this assertion to continue running anyway... + } + + if ( !( assert instanceof Assert ) ) { + assert = currentTest.assert; + } + return assert.test.push.apply( assert.test, arguments ); + }, + + ok: function( result, message ) { + message = message || ( result ? "okay" : "failed, expected argument to be truthy, was: " + + QUnit.dump.parse( result ) ); + this.push( !!result, result, true, message ); + }, + + notOk: function( result, message ) { + message = message || ( !result ? "okay" : "failed, expected argument to be falsy, was: " + + QUnit.dump.parse( result ) ); + this.push( !result, result, false, message ); + }, + + equal: function( actual, expected, message ) { + /*jshint eqeqeq:false */ + this.push( expected == actual, actual, expected, message ); + }, + + notEqual: function( actual, expected, message ) { + /*jshint eqeqeq:false */ + this.push( expected != actual, actual, expected, message ); + }, + + propEqual: function( actual, expected, message ) { + actual = objectValues( actual ); + expected = objectValues( expected ); + this.push( QUnit.equiv( actual, expected ), actual, expected, message ); + }, + + notPropEqual: function( actual, expected, message ) { + actual = objectValues( actual ); + expected = objectValues( expected ); + this.push( !QUnit.equiv( actual, expected ), actual, expected, message ); + }, + + deepEqual: function( actual, expected, message ) { + this.push( QUnit.equiv( actual, expected ), actual, expected, message ); + }, + + notDeepEqual: function( actual, expected, message ) { + this.push( !QUnit.equiv( actual, expected ), actual, expected, message ); + }, + + strictEqual: function( actual, expected, message ) { + this.push( expected === actual, actual, expected, message ); + }, + + notStrictEqual: function( actual, expected, message ) { + this.push( expected !== actual, actual, expected, message ); + }, + + "throws": function( block, expected, message ) { + var actual, expectedType, + expectedOutput = expected, + ok = false, + currentTest = ( this instanceof Assert && this.test ) || QUnit.config.current; + + // 'expected' is optional unless doing string comparison + if ( message == null && typeof expected === "string" ) { + message = expected; + expected = null; + } + + currentTest.ignoreGlobalErrors = true; + try { + block.call( currentTest.testEnvironment ); + } catch (e) { + actual = e; + } + currentTest.ignoreGlobalErrors = false; + + if ( actual ) { + expectedType = QUnit.objectType( expected ); + + // we don't want to validate thrown error + if ( !expected ) { + ok = true; + expectedOutput = null; + + // expected is a regexp + } else if ( expectedType === "regexp" ) { + ok = expected.test( errorString( actual ) ); + + // expected is a string + } else if ( expectedType === "string" ) { + ok = expected === errorString( actual ); + + // expected is a constructor, maybe an Error constructor + } else if ( expectedType === "function" && actual instanceof expected ) { + ok = true; + + // expected is an Error object + } else if ( expectedType === "object" ) { + ok = actual instanceof expected.constructor && + actual.name === expected.name && + actual.message === expected.message; + + // expected is a validation function which returns true if validation passed + } else if ( expectedType === "function" && expected.call( {}, actual ) === true ) { + expectedOutput = null; + ok = true; + } + } + + currentTest.assert.push( ok, actual, expectedOutput, message ); + } +}; + +// Provide an alternative to assert.throws(), for enviroments that consider throws a reserved word +// Known to us are: Closure Compiler, Narwhal +(function() { + /*jshint sub:true */ + Assert.prototype.raises = Assert.prototype[ "throws" ]; +}()); + // Test for equality any JavaScript type. -// Discussions and reference: http://philrathe.com/articles/equiv -// Test suites: http://philrathe.com/tests/equiv // Author: Philippe Rathé -QUnit.equiv = function () { - - var innerEquiv; // the real equiv function - var callers = []; // stack to decide between skip/abort functions - var parents = []; // stack to avoiding loops from circular referencing - - - // Determine what is o. - function hoozit(o) { - if (QUnit.is("String", o)) { - return "string"; - - } else if (QUnit.is("Boolean", o)) { - return "boolean"; - - } else if (QUnit.is("Number", o)) { - - if (isNaN(o)) { - return "nan"; +QUnit.equiv = (function() { + + // Call the o related callback with the given arguments. + function bindCallbacks( o, callbacks, args ) { + var prop = QUnit.objectType( o ); + if ( prop ) { + if ( QUnit.objectType( callbacks[ prop ] ) === "function" ) { + return callbacks[ prop ].apply( callbacks, args ); + } else { + return callbacks[ prop ]; // or undefined + } + } + } + + // the real equiv function + var innerEquiv, + + // stack to decide between skip/abort functions + callers = [], + + // stack to avoiding loops from circular referencing + parents = [], + parentsB = [], + + getProto = Object.getPrototypeOf || function( obj ) { + /* jshint camelcase: false, proto: true */ + return obj.__proto__; + }, + callbacks = (function() { + + // for string, boolean, number and null + function useStrictEquality( b, a ) { + + /*jshint eqeqeq:false */ + if ( b instanceof a.constructor || a instanceof b.constructor ) { + + // to catch short annotation VS 'new' annotation of a + // declaration + // e.g. var i = 1; + // var j = new Number(1); + return a == b; + } else { + return a === b; + } + } + + return { + "string": useStrictEquality, + "boolean": useStrictEquality, + "number": useStrictEquality, + "null": useStrictEquality, + "undefined": useStrictEquality, + + "nan": function( b ) { + return isNaN( b ); + }, + + "date": function( b, a ) { + return QUnit.objectType( b ) === "date" && a.valueOf() === b.valueOf(); + }, + + "regexp": function( b, a ) { + return QUnit.objectType( b ) === "regexp" && + + // the regex itself + a.source === b.source && + + // and its modifiers + a.global === b.global && + + // (gmi) ... + a.ignoreCase === b.ignoreCase && + a.multiline === b.multiline && + a.sticky === b.sticky; + }, + + // - skip when the property is a method of an instance (OOP) + // - abort otherwise, + // initial === would have catch identical references anyway + "function": function() { + var caller = callers[ callers.length - 1 ]; + return caller !== Object && typeof caller !== "undefined"; + }, + + "array": function( b, a ) { + var i, j, len, loop, aCircular, bCircular; + + // b could be an object literal here + if ( QUnit.objectType( b ) !== "array" ) { + return false; + } + + len = a.length; + if ( len !== b.length ) { + // safe and faster + return false; + } + + // track reference to avoid circular references + parents.push( a ); + parentsB.push( b ); + for ( i = 0; i < len; i++ ) { + loop = false; + for ( j = 0; j < parents.length; j++ ) { + aCircular = parents[ j ] === a[ i ]; + bCircular = parentsB[ j ] === b[ i ]; + if ( aCircular || bCircular ) { + if ( a[ i ] === b[ i ] || aCircular && bCircular ) { + loop = true; + } else { + parents.pop(); + parentsB.pop(); + return false; + } + } + } + if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) { + parents.pop(); + parentsB.pop(); + return false; + } + } + parents.pop(); + parentsB.pop(); + return true; + }, + + "object": function( b, a ) { + + /*jshint forin:false */ + var i, j, loop, aCircular, bCircular, + // Default to true + eq = true, + aProperties = [], + bProperties = []; + + // comparing constructors is more strict than using + // instanceof + if ( a.constructor !== b.constructor ) { + + // Allow objects with no prototype to be equivalent to + // objects with Object as their constructor. + if ( !( ( getProto( a ) === null && getProto( b ) === Object.prototype ) || + ( getProto( b ) === null && getProto( a ) === Object.prototype ) ) ) { + return false; + } + } + + // stack constructor before traversing properties + callers.push( a.constructor ); + + // track reference to avoid circular references + parents.push( a ); + parentsB.push( b ); + + // be strict: don't ensure hasOwnProperty and go deep + for ( i in a ) { + loop = false; + for ( j = 0; j < parents.length; j++ ) { + aCircular = parents[ j ] === a[ i ]; + bCircular = parentsB[ j ] === b[ i ]; + if ( aCircular || bCircular ) { + if ( a[ i ] === b[ i ] || aCircular && bCircular ) { + loop = true; + } else { + eq = false; + break; + } + } + } + aProperties.push( i ); + if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) { + eq = false; + break; + } + } + + parents.pop(); + parentsB.pop(); + callers.pop(); // unstack, we are done + + for ( i in b ) { + bProperties.push( i ); // collect b's properties + } + + // Ensures identical properties name + return eq && innerEquiv( aProperties.sort(), bProperties.sort() ); + } + }; + }()); + + innerEquiv = function() { // can take multiple arguments + var args = [].slice.apply( arguments ); + if ( args.length < 2 ) { + return true; // end transition + } + + return ( (function( a, b ) { + if ( a === b ) { + return true; // catch the most you can + } else if ( a === null || b === null || typeof a === "undefined" || + typeof b === "undefined" || + QUnit.objectType( a ) !== QUnit.objectType( b ) ) { + + // don't lose time with error prone cases + return false; + } else { + return bindCallbacks( a, callbacks, [ b, a ] ); + } + + // apply transition with (1..n) arguments + }( args[ 0 ], args[ 1 ] ) ) && + innerEquiv.apply( this, args.splice( 1, args.length - 1 ) ) ); + }; + + return innerEquiv; +}()); + +// Based on jsDump by Ariel Flesler +// http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html +QUnit.dump = (function() { + function quote( str ) { + return "\"" + str.toString().replace( /"/g, "\\\"" ) + "\""; + } + function literal( o ) { + return o + ""; + } + function join( pre, arr, post ) { + var s = dump.separator(), + base = dump.indent(), + inner = dump.indent( 1 ); + if ( arr.join ) { + arr = arr.join( "," + s + inner ); + } + if ( !arr ) { + return pre + post; + } + return [ pre, inner + arr, base + post ].join( s ); + } + function array( arr, stack ) { + var i = arr.length, + ret = new Array( i ); + + if ( dump.maxDepth && dump.depth > dump.maxDepth ) { + return "[object Array]"; + } + + this.up(); + while ( i-- ) { + ret[ i ] = this.parse( arr[ i ], undefined, stack ); + } + this.down(); + return join( "[", ret, "]" ); + } + + var reName = /^function (\w+)/, + dump = { + + // objType is used mostly internally, you can fix a (custom) type in advance + parse: function( obj, objType, stack ) { + stack = stack || []; + var res, parser, parserType, + inStack = inArray( obj, stack ); + + if ( inStack !== -1 ) { + return "recursion(" + ( inStack - stack.length ) + ")"; + } + + objType = objType || this.typeOf( obj ); + parser = this.parsers[ objType ]; + parserType = typeof parser; + + if ( parserType === "function" ) { + stack.push( obj ); + res = parser.call( this, obj, stack ); + stack.pop(); + return res; + } + return ( parserType === "string" ) ? parser : this.parsers.error; + }, + typeOf: function( obj ) { + var type; + if ( obj === null ) { + type = "null"; + } else if ( typeof obj === "undefined" ) { + type = "undefined"; + } else if ( QUnit.is( "regexp", obj ) ) { + type = "regexp"; + } else if ( QUnit.is( "date", obj ) ) { + type = "date"; + } else if ( QUnit.is( "function", obj ) ) { + type = "function"; + } else if ( obj.setInterval !== undefined && + obj.document !== undefined && + obj.nodeType === undefined ) { + type = "window"; + } else if ( obj.nodeType === 9 ) { + type = "document"; + } else if ( obj.nodeType ) { + type = "node"; + } else if ( + + // native arrays + toString.call( obj ) === "[object Array]" || + + // NodeList objects + ( typeof obj.length === "number" && obj.item !== undefined && + ( obj.length ? obj.item( 0 ) === obj[ 0 ] : ( obj.item( 0 ) === null && + obj[ 0 ] === undefined ) ) ) + ) { + type = "array"; + } else if ( obj.constructor === Error.prototype.constructor ) { + type = "error"; + } else { + type = typeof obj; + } + return type; + }, + separator: function() { + return this.multiline ? this.HTML ? "
" : "\n" : this.HTML ? " " : " "; + }, + // extra can be a number, shortcut for increasing-calling-decreasing + indent: function( extra ) { + if ( !this.multiline ) { + return ""; + } + var chr = this.indentChar; + if ( this.HTML ) { + chr = chr.replace( /\t/g, " " ).replace( / /g, " " ); + } + return new Array( this.depth + ( extra || 0 ) ).join( chr ); + }, + up: function( a ) { + this.depth += a || 1; + }, + down: function( a ) { + this.depth -= a || 1; + }, + setParser: function( name, parser ) { + this.parsers[ name ] = parser; + }, + // The next 3 are exposed so you can use them + quote: quote, + literal: literal, + join: join, + // + depth: 1, + maxDepth: QUnit.config.maxDepth, + + // This is the list of parsers, to modify them, use dump.setParser + parsers: { + window: "[Window]", + document: "[Document]", + error: function( error ) { + return "Error(\"" + error.message + "\")"; + }, + unknown: "[Unknown]", + "null": "null", + "undefined": "undefined", + "function": function( fn ) { + var ret = "function", + + // functions never have name in IE + name = "name" in fn ? fn.name : ( reName.exec( fn ) || [] )[ 1 ]; + + if ( name ) { + ret += " " + name; + } + ret += "( "; + + ret = [ ret, dump.parse( fn, "functionArgs" ), "){" ].join( "" ); + return join( ret, dump.parse( fn, "functionCode" ), "}" ); + }, + array: array, + nodelist: array, + "arguments": array, + object: function( map, stack ) { + var keys, key, val, i, nonEnumerableProperties, + ret = []; + + if ( dump.maxDepth && dump.depth > dump.maxDepth ) { + return "[object Object]"; + } + + dump.up(); + keys = []; + for ( key in map ) { + keys.push( key ); + } + + // Some properties are not always enumerable on Error objects. + nonEnumerableProperties = [ "message", "name" ]; + for ( i in nonEnumerableProperties ) { + key = nonEnumerableProperties[ i ]; + if ( key in map && inArray( key, keys ) < 0 ) { + keys.push( key ); + } + } + keys.sort(); + for ( i = 0; i < keys.length; i++ ) { + key = keys[ i ]; + val = map[ key ]; + ret.push( dump.parse( key, "key" ) + ": " + + dump.parse( val, undefined, stack ) ); + } + dump.down(); + return join( "{", ret, "}" ); + }, + node: function( node ) { + var len, i, val, + open = dump.HTML ? "<" : "<", + close = dump.HTML ? ">" : ">", + tag = node.nodeName.toLowerCase(), + ret = open + tag, + attrs = node.attributes; + + if ( attrs ) { + for ( i = 0, len = attrs.length; i < len; i++ ) { + val = attrs[ i ].nodeValue; + + // IE6 includes all attributes in .attributes, even ones not explicitly + // set. Those have values like undefined, null, 0, false, "" or + // "inherit". + if ( val && val !== "inherit" ) { + ret += " " + attrs[ i ].nodeName + "=" + + dump.parse( val, "attribute" ); + } + } + } + ret += close; + + // Show content of TextNode or CDATASection + if ( node.nodeType === 3 || node.nodeType === 4 ) { + ret += node.nodeValue; + } + + return ret + open + "/" + tag + close; + }, + + // function calls it internally, it's the arguments part of the function + functionArgs: function( fn ) { + var args, + l = fn.length; + + if ( !l ) { + return ""; + } + + args = new Array( l ); + while ( l-- ) { + + // 97 is 'a' + args[ l ] = String.fromCharCode( 97 + l ); + } + return " " + args.join( ", " ) + " "; + }, + // object calls it internally, the key part of an item in a map + key: quote, + // function calls it internally, it's the content of the function + functionCode: "[code]", + // node calls it internally, it's an html attribute value + attribute: quote, + string: quote, + date: quote, + regexp: literal, + number: literal, + "boolean": literal + }, + // if true, entities are escaped ( <, >, \t, space and \n ) + HTML: false, + // indentation unit + indentChar: " ", + // if true, items in a collection, are separated by a \n, else just a space. + multiline: true + }; + + return dump; +}()); + +// back compat +QUnit.jsDump = QUnit.dump; + +// For browser, export only select globals +if ( typeof window !== "undefined" ) { + + // Deprecated + // Extend assert methods to QUnit and Global scope through Backwards compatibility + (function() { + var i, + assertions = Assert.prototype; + + function applyCurrent( current ) { + return function() { + var assert = new Assert( QUnit.config.current ); + current.apply( assert, arguments ); + }; + } + + for ( i in assertions ) { + QUnit[ i ] = applyCurrent( assertions[ i ] ); + } + })(); + + (function() { + var i, l, + keys = [ + "test", + "module", + "expect", + "asyncTest", + "start", + "stop", + "ok", + "notOk", + "equal", + "notEqual", + "propEqual", + "notPropEqual", + "deepEqual", + "notDeepEqual", + "strictEqual", + "notStrictEqual", + "throws" + ]; + + for ( i = 0, l = keys.length; i < l; i++ ) { + window[ keys[ i ] ] = QUnit[ keys[ i ] ]; + } + })(); + + window.QUnit = QUnit; +} + +// For nodejs +if ( typeof module !== "undefined" && module && module.exports ) { + module.exports = QUnit; + + // For consistency with CommonJS environments' exports + module.exports.QUnit = QUnit; +} + +// For CommonJS with exports, but without module.exports, like Rhino +if ( typeof exports !== "undefined" && exports ) { + exports.QUnit = QUnit; +} + +if ( typeof define === "function" && define.amd ) { + define( function() { + return QUnit; + } ); + QUnit.config.autostart = false; +} + +// Get a reference to the global object, like window in browsers +}( (function() { + return this; +})() )); + +/*istanbul ignore next */ +// jscs:disable maximumLineLength +/* + * This file is a modified version of google-diff-match-patch's JavaScript implementation + * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js), + * modifications are licensed as more fully set forth in LICENSE.txt. + * + * The original source of google-diff-match-patch is attributable and licensed as follows: + * + * Copyright 2006 Google Inc. + * http://code.google.com/p/google-diff-match-patch/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * More Info: + * https://code.google.com/p/google-diff-match-patch/ + * + * Usage: QUnit.diff(expected, actual) + * + * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) === "the quick brown fox jumpsed} Array of diff tuples. + */ + DiffMatchPatch.prototype.DiffMain = function( text1, text2, optChecklines, optDeadline ) { + var deadline, checklines, commonlength, + commonprefix, commonsuffix, diffs; + // Set a deadline by which time the diff must be complete. + if ( typeof optDeadline === "undefined" ) { + if ( this.DiffTimeout <= 0 ) { + optDeadline = Number.MAX_VALUE; } else { - return "number"; - } - - } else if (typeof o === "undefined") { - return "undefined"; - - // consider: typeof null === object - } else if (o === null) { - return "null"; - - // consider: typeof [] === object - } else if (QUnit.is( "Array", o)) { - return "array"; - - // consider: typeof new Date() === object - } else if (QUnit.is( "Date", o)) { - return "date"; - - // consider: /./ instanceof Object; - // /./ instanceof RegExp; - // typeof /./ === "function"; // => false in IE and Opera, - // true in FF and Safari - } else if (QUnit.is( "RegExp", o)) { - return "regexp"; - - } else if (typeof o === "object") { - return "object"; - - } else if (QUnit.is( "Function", o)) { - return "function"; - } else { - return undefined; - } - } - - // Call the o related callback with the given arguments. - function bindCallbacks(o, callbacks, args) { - var prop = hoozit(o); - if (prop) { - if (hoozit(callbacks[prop]) === "function") { - return callbacks[prop].apply(callbacks, args); - } else { - return callbacks[prop]; // or undefined + optDeadline = ( new Date() ).getTime() + this.DiffTimeout * 1000; } } - } - - var callbacks = function () { - - // for string, boolean, number and null - function useStrictEquality(b, a) { - if (b instanceof a.constructor || a instanceof b.constructor) { - // to catch short annotaion VS 'new' annotation of a declaration - // e.g. var i = 1; - // var j = new Number(1); - return a == b; - } else { - return a === b; + deadline = optDeadline; + + // Check for null inputs. + if ( text1 === null || text2 === null ) { + throw new Error( "Null input. (DiffMain)" ); + } + + // Check for equality (speedup). + if ( text1 === text2 ) { + if ( text1 ) { + return [ + [ DIFF_EQUAL, text1 ] + ]; + } + return []; + } + + if ( typeof optChecklines === "undefined" ) { + optChecklines = true; + } + + checklines = optChecklines; + + // Trim off common prefix (speedup). + commonlength = this.diffCommonPrefix( text1, text2 ); + commonprefix = text1.substring( 0, commonlength ); + text1 = text1.substring( commonlength ); + text2 = text2.substring( commonlength ); + + // Trim off common suffix (speedup). + ///////// + commonlength = this.diffCommonSuffix( text1, text2 ); + commonsuffix = text1.substring( text1.length - commonlength ); + text1 = text1.substring( 0, text1.length - commonlength ); + text2 = text2.substring( 0, text2.length - commonlength ); + + // Compute the diff on the middle block. + diffs = this.diffCompute( text1, text2, checklines, deadline ); + + // Restore the prefix and suffix. + if ( commonprefix ) { + diffs.unshift( [ DIFF_EQUAL, commonprefix ] ); + } + if ( commonsuffix ) { + diffs.push( [ DIFF_EQUAL, commonsuffix ] ); + } + this.diffCleanupMerge( diffs ); + return diffs; + }; + + /** + * Reduce the number of edits by eliminating operationally trivial equalities. + * @param {!Array.} diffs Array of diff tuples. + */ + DiffMatchPatch.prototype.diffCleanupEfficiency = function( diffs ) { + var changes, equalities, equalitiesLength, lastequality, + pointer, preIns, preDel, postIns, postDel; + changes = false; + equalities = []; // Stack of indices where equalities are found. + equalitiesLength = 0; // Keeping our own length var is faster in JS. + /** @type {?string} */ + lastequality = null; + // Always equal to diffs[equalities[equalitiesLength - 1]][1] + pointer = 0; // Index of current position. + // Is there an insertion operation before the last equality. + preIns = false; + // Is there a deletion operation before the last equality. + preDel = false; + // Is there an insertion operation after the last equality. + postIns = false; + // Is there a deletion operation after the last equality. + postDel = false; + while ( pointer < diffs.length ) { + if ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) { // Equality found. + if ( diffs[ pointer ][ 1 ].length < this.DiffEditCost && ( postIns || postDel ) ) { + // Candidate found. + equalities[ equalitiesLength++ ] = pointer; + preIns = postIns; + preDel = postDel; + lastequality = diffs[ pointer ][ 1 ]; + } else { + // Not a candidate, and can never become one. + equalitiesLength = 0; + lastequality = null; + } + postIns = postDel = false; + } else { // An insertion or deletion. + if ( diffs[ pointer ][ 0 ] === DIFF_DELETE ) { + postDel = true; + } else { + postIns = true; + } + /* + * Five types to be split: + * ABXYCD + * AXCD + * ABXC + * AXCD + * ABXC + */ + if ( lastequality && ( ( preIns && preDel && postIns && postDel ) || + ( ( lastequality.length < this.DiffEditCost / 2 ) && + ( preIns + preDel + postIns + postDel ) === 3 ) ) ) { + // Duplicate record. + diffs.splice( equalities[equalitiesLength - 1], 0, [ DIFF_DELETE, lastequality ] ); + // Change second copy to insert. + diffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT; + equalitiesLength--; // Throw away the equality we just deleted; + lastequality = null; + if (preIns && preDel) { + // No changes made which could affect previous entry, keep going. + postIns = postDel = true; + equalitiesLength = 0; + } else { + equalitiesLength--; // Throw away the previous equality. + pointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1; + postIns = postDel = false; + } + changes = true; + } + } + pointer++; + } + + if ( changes ) { + this.diffCleanupMerge( diffs ); + } + }; + + /** + * Convert a diff array into a pretty HTML report. + * @param {!Array.} diffs Array of diff tuples. + * @param {integer} string to be beautified. + * @return {string} HTML representation. + */ + DiffMatchPatch.prototype.diffPrettyHtml = function( diffs ) { + var op, data, x, html = []; + for ( x = 0; x < diffs.length; x++ ) { + op = diffs[x][0]; // Operation (insert, delete, equal) + data = diffs[x][1]; // Text of change. + switch ( op ) { + case DIFF_INSERT: + html[x] = "" + data + ""; + break; + case DIFF_DELETE: + html[x] = "" + data + ""; + break; + case DIFF_EQUAL: + html[x] = "" + data + ""; + break; } } - - return { - "string": useStrictEquality, - "boolean": useStrictEquality, - "number": useStrictEquality, - "null": useStrictEquality, - "undefined": useStrictEquality, - - "nan": function (b) { - return isNaN(b); - }, - - "date": function (b, a) { - return hoozit(b) === "date" && a.valueOf() === b.valueOf(); - }, - - "regexp": function (b, a) { - return hoozit(b) === "regexp" && - a.source === b.source && // the regex itself - a.global === b.global && // and its modifers (gmi) ... - a.ignoreCase === b.ignoreCase && - a.multiline === b.multiline; - }, - - // - skip when the property is a method of an instance (OOP) - // - abort otherwise, - // initial === would have catch identical references anyway - "function": function () { - var caller = callers[callers.length - 1]; - return caller !== Object && - typeof caller !== "undefined"; - }, - - "array": function (b, a) { - var i, j, loop; - var len; - - // b could be an object literal here - if ( ! (hoozit(b) === "array")) { - return false; - } - - len = a.length; - if (len !== b.length) { // safe and faster - return false; + return html.join(""); + }; + + /** + * Determine the common prefix of two strings. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {number} The number of characters common to the start of each + * string. + */ + DiffMatchPatch.prototype.diffCommonPrefix = function( text1, text2 ) { + var pointermid, pointermax, pointermin, pointerstart; + // Quick check for common null cases. + if ( !text1 || !text2 || text1.charAt(0) !== text2.charAt(0) ) { + return 0; + } + // Binary search. + // Performance analysis: http://neil.fraser.name/news/2007/10/09/ + pointermin = 0; + pointermax = Math.min( text1.length, text2.length ); + pointermid = pointermax; + pointerstart = 0; + while ( pointermin < pointermid ) { + if ( text1.substring( pointerstart, pointermid ) === text2.substring( pointerstart, pointermid ) ) { + pointermin = pointermid; + pointerstart = pointermin; + } else { + pointermax = pointermid; + } + pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin ); + } + return pointermid; + }; + + /** + * Determine the common suffix of two strings. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {number} The number of characters common to the end of each string. + */ + DiffMatchPatch.prototype.diffCommonSuffix = function( text1, text2 ) { + var pointermid, pointermax, pointermin, pointerend; + // Quick check for common null cases. + if (!text1 || !text2 || text1.charAt(text1.length - 1) !== text2.charAt(text2.length - 1)) { + return 0; + } + // Binary search. + // Performance analysis: http://neil.fraser.name/news/2007/10/09/ + pointermin = 0; + pointermax = Math.min(text1.length, text2.length); + pointermid = pointermax; + pointerend = 0; + while ( pointermin < pointermid ) { + if (text1.substring( text1.length - pointermid, text1.length - pointerend ) === + text2.substring( text2.length - pointermid, text2.length - pointerend ) ) { + pointermin = pointermid; + pointerend = pointermin; + } else { + pointermax = pointermid; + } + pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin ); + } + return pointermid; + }; + + /** + * Find the differences between two texts. Assumes that the texts do not + * have any common prefix or suffix. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {boolean} checklines Speedup flag. If false, then don't run a + * line-level diff first to identify the changed areas. + * If true, then run a faster, slightly less optimal diff. + * @param {number} deadline Time when the diff should be complete by. + * @return {!Array.} Array of diff tuples. + * @private + */ + DiffMatchPatch.prototype.diffCompute = function( text1, text2, checklines, deadline ) { + var diffs, longtext, shorttext, i, hm, + text1A, text2A, text1B, text2B, + midCommon, diffsA, diffsB; + + if ( !text1 ) { + // Just add some text (speedup). + return [ + [ DIFF_INSERT, text2 ] + ]; + } + + if (!text2) { + // Just delete some text (speedup). + return [ + [ DIFF_DELETE, text1 ] + ]; + } + + longtext = text1.length > text2.length ? text1 : text2; + shorttext = text1.length > text2.length ? text2 : text1; + i = longtext.indexOf( shorttext ); + if ( i !== -1 ) { + // Shorter text is inside the longer text (speedup). + diffs = [ + [ DIFF_INSERT, longtext.substring( 0, i ) ], + [ DIFF_EQUAL, shorttext ], + [ DIFF_INSERT, longtext.substring( i + shorttext.length ) ] + ]; + // Swap insertions for deletions if diff is reversed. + if ( text1.length > text2.length ) { + diffs[0][0] = diffs[2][0] = DIFF_DELETE; + } + return diffs; + } + + if ( shorttext.length === 1 ) { + // Single character string. + // After the previous speedup, the character can't be an equality. + return [ + [ DIFF_DELETE, text1 ], + [ DIFF_INSERT, text2 ] + ]; + } + + // Check to see if the problem can be split in two. + hm = this.diffHalfMatch(text1, text2); + if (hm) { + // A half-match was found, sort out the return data. + text1A = hm[0]; + text1B = hm[1]; + text2A = hm[2]; + text2B = hm[3]; + midCommon = hm[4]; + // Send both pairs off for separate processing. + diffsA = this.DiffMain(text1A, text2A, checklines, deadline); + diffsB = this.DiffMain(text1B, text2B, checklines, deadline); + // Merge the results. + return diffsA.concat([ + [ DIFF_EQUAL, midCommon ] + ], diffsB); + } + + if (checklines && text1.length > 100 && text2.length > 100) { + return this.diffLineMode(text1, text2, deadline); + } + + return this.diffBisect(text1, text2, deadline); + }; + + /** + * Do the two texts share a substring which is at least half the length of the + * longer text? + * This speedup can produce non-minimal diffs. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {Array.} Five element Array, containing the prefix of + * text1, the suffix of text1, the prefix of text2, the suffix of + * text2 and the common middle. Or null if there was no match. + * @private + */ + DiffMatchPatch.prototype.diffHalfMatch = function(text1, text2) { + var longtext, shorttext, dmp, + text1A, text2B, text2A, text1B, midCommon, + hm1, hm2, hm; + if (this.DiffTimeout <= 0) { + // Don't risk returning a non-optimal diff if we have unlimited time. + return null; + } + longtext = text1.length > text2.length ? text1 : text2; + shorttext = text1.length > text2.length ? text2 : text1; + if (longtext.length < 4 || shorttext.length * 2 < longtext.length) { + return null; // Pointless. + } + dmp = this; // 'this' becomes 'window' in a closure. + + /** + * Does a substring of shorttext exist within longtext such that the substring + * is at least half the length of longtext? + * Closure, but does not reference any external variables. + * @param {string} longtext Longer string. + * @param {string} shorttext Shorter string. + * @param {number} i Start index of quarter length substring within longtext. + * @return {Array.} Five element Array, containing the prefix of + * longtext, the suffix of longtext, the prefix of shorttext, the suffix + * of shorttext and the common middle. Or null if there was no match. + * @private + */ + function diffHalfMatchI(longtext, shorttext, i) { + var seed, j, bestCommon, prefixLength, suffixLength, + bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB; + // Start with a 1/4 length substring at position i as a seed. + seed = longtext.substring(i, i + Math.floor(longtext.length / 4)); + j = -1; + bestCommon = ""; + while ((j = shorttext.indexOf(seed, j + 1)) !== -1) { + prefixLength = dmp.diffCommonPrefix(longtext.substring(i), + shorttext.substring(j)); + suffixLength = dmp.diffCommonSuffix(longtext.substring(0, i), + shorttext.substring(0, j)); + if (bestCommon.length < suffixLength + prefixLength) { + bestCommon = shorttext.substring(j - suffixLength, j) + + shorttext.substring(j, j + prefixLength); + bestLongtextA = longtext.substring(0, i - suffixLength); + bestLongtextB = longtext.substring(i + prefixLength); + bestShorttextA = shorttext.substring(0, j - suffixLength); + bestShorttextB = shorttext.substring(j + prefixLength); } - - //track reference to avoid circular references - parents.push(a); - for (i = 0; i < len; i++) { - loop = false; - for(j=0;j= longtext.length) { + return [ bestLongtextA, bestLongtextB, + bestShorttextA, bestShorttextB, bestCommon + ]; + } else { + return null; + } + } + + // First check if the second quarter is the seed for a half-match. + hm1 = diffHalfMatchI(longtext, shorttext, + Math.ceil(longtext.length / 4)); + // Check again based on the third quarter. + hm2 = diffHalfMatchI(longtext, shorttext, + Math.ceil(longtext.length / 2)); + if (!hm1 && !hm2) { + return null; + } else if (!hm2) { + hm = hm1; + } else if (!hm1) { + hm = hm2; + } else { + // Both matched. Select the longest. + hm = hm1[4].length > hm2[4].length ? hm1 : hm2; + } + + // A half-match was found, sort out the return data. + text1A, text1B, text2A, text2B; + if (text1.length > text2.length) { + text1A = hm[0]; + text1B = hm[1]; + text2A = hm[2]; + text2B = hm[3]; + } else { + text2A = hm[0]; + text2B = hm[1]; + text1A = hm[2]; + text1B = hm[3]; + } + midCommon = hm[4]; + return [ text1A, text1B, text2A, text2B, midCommon ]; + }; + + /** + * Do a quick line-level diff on both strings, then rediff the parts for + * greater accuracy. + * This speedup can produce non-minimal diffs. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {number} deadline Time when the diff should be complete by. + * @return {!Array.} Array of diff tuples. + * @private + */ + DiffMatchPatch.prototype.diffLineMode = function(text1, text2, deadline) { + var a, diffs, linearray, pointer, countInsert, + countDelete, textInsert, textDelete, j; + // Scan the text on a line-by-line basis first. + a = this.diffLinesToChars(text1, text2); + text1 = a.chars1; + text2 = a.chars2; + linearray = a.lineArray; + + diffs = this.DiffMain(text1, text2, false, deadline); + + // Convert the diff back to original text. + this.diffCharsToLines(diffs, linearray); + // Eliminate freak matches (e.g. blank lines) + this.diffCleanupSemantic(diffs); + + // Rediff any replacement blocks, this time character-by-character. + // Add a dummy entry at the end. + diffs.push( [ DIFF_EQUAL, "" ] ); + pointer = 0; + countDelete = 0; + countInsert = 0; + textDelete = ""; + textInsert = ""; + while (pointer < diffs.length) { + switch ( diffs[pointer][0] ) { + case DIFF_INSERT: + countInsert++; + textInsert += diffs[pointer][1]; + break; + case DIFF_DELETE: + countDelete++; + textDelete += diffs[pointer][1]; + break; + case DIFF_EQUAL: + // Upon reaching an equality, check for prior redundancies. + if (countDelete >= 1 && countInsert >= 1) { + // Delete the offending records and add the merged ones. + diffs.splice(pointer - countDelete - countInsert, + countDelete + countInsert); + pointer = pointer - countDelete - countInsert; + a = this.DiffMain(textDelete, textInsert, false, deadline); + for (j = a.length - 1; j >= 0; j--) { + diffs.splice( pointer, 0, a[j] ); } + pointer = pointer + a.length; } - if (!loop && ! innerEquiv(a[i], b[i])) { - parents.pop(); - return false; - } + countInsert = 0; + countDelete = 0; + textDelete = ""; + textInsert = ""; + break; + } + pointer++; + } + diffs.pop(); // Remove the dummy entry at the end. + + return diffs; + }; + + /** + * Find the 'middle snake' of a diff, split the problem in two + * and return the recursively constructed diff. + * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {number} deadline Time at which to bail if not yet complete. + * @return {!Array.} Array of diff tuples. + * @private + */ + DiffMatchPatch.prototype.diffBisect = function(text1, text2, deadline) { + var text1Length, text2Length, maxD, vOffset, vLength, + v1, v2, x, delta, front, k1start, k1end, k2start, + k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2; + // Cache the text lengths to prevent multiple calls. + text1Length = text1.length; + text2Length = text2.length; + maxD = Math.ceil((text1Length + text2Length) / 2); + vOffset = maxD; + vLength = 2 * maxD; + v1 = new Array(vLength); + v2 = new Array(vLength); + // Setting all elements to -1 is faster in Chrome & Firefox than mixing + // integers and undefined. + for (x = 0; x < vLength; x++) { + v1[x] = -1; + v2[x] = -1; + } + v1[vOffset + 1] = 0; + v2[vOffset + 1] = 0; + delta = text1Length - text2Length; + // If the total number of characters is odd, then the front path will collide + // with the reverse path. + front = (delta % 2 !== 0); + // Offsets for start and end of k loop. + // Prevents mapping of space beyond the grid. + k1start = 0; + k1end = 0; + k2start = 0; + k2end = 0; + for (d = 0; d < maxD; d++) { + // Bail out if deadline is reached. + if ((new Date()).getTime() > deadline) { + break; + } + + // Walk the front path one step. + for (k1 = -d + k1start; k1 <= d - k1end; k1 += 2) { + k1Offset = vOffset + k1; + if ( k1 === -d || ( k1 !== d && v1[ k1Offset - 1 ] < v1[ k1Offset + 1 ] ) ) { + x1 = v1[k1Offset + 1]; + } else { + x1 = v1[k1Offset - 1] + 1; } - parents.pop(); - return true; - }, - - "object": function (b, a) { - var i, j, loop; - var eq = true; // unless we can proove it - var aProperties = [], bProperties = []; // collection of strings - - // comparing constructors is more strict than using instanceof - if ( a.constructor !== b.constructor) { - return false; + y1 = x1 - k1; + while (x1 < text1Length && y1 < text2Length && + text1.charAt(x1) === text2.charAt(y1)) { + x1++; + y1++; } - - // stack constructor before traversing properties - callers.push(a.constructor); - //track reference to avoid circular references - parents.push(a); - - for (i in a) { // be strict: don't ensures hasOwnProperty and go deep - loop = false; - for(j=0;j text1Length) { + // Ran off the right of the graph. + k1end += 2; + } else if (y1 > text2Length) { + // Ran off the bottom of the graph. + k1start += 2; + } else if (front) { + k2Offset = vOffset + delta - k1; + if (k2Offset >= 0 && k2Offset < vLength && v2[k2Offset] !== -1) { + // Mirror x2 onto top-left coordinate system. + x2 = text1Length - v2[k2Offset]; + if (x1 >= x2) { + // Overlap detected. + return this.diffBisectSplit(text1, text2, x1, y1, deadline); + } } } - - callers.pop(); // unstack, we are done - parents.pop(); - - for (i in b) { - bProperties.push(i); // collect b's properties + } + + // Walk the reverse path one step. + for (k2 = -d + k2start; k2 <= d - k2end; k2 += 2) { + k2Offset = vOffset + k2; + if ( k2 === -d || (k2 !== d && v2[ k2Offset - 1 ] < v2[ k2Offset + 1 ] ) ) { + x2 = v2[k2Offset + 1]; + } else { + x2 = v2[k2Offset - 1] + 1; + } + y2 = x2 - k2; + while (x2 < text1Length && y2 < text2Length && + text1.charAt(text1Length - x2 - 1) === + text2.charAt(text2Length - y2 - 1)) { + x2++; + y2++; + } + v2[k2Offset] = x2; + if (x2 > text1Length) { + // Ran off the left of the graph. + k2end += 2; + } else if (y2 > text2Length) { + // Ran off the top of the graph. + k2start += 2; + } else if (!front) { + k1Offset = vOffset + delta - k2; + if (k1Offset >= 0 && k1Offset < vLength && v1[k1Offset] !== -1) { + x1 = v1[k1Offset]; + y1 = vOffset + x1 - k1Offset; + // Mirror x2 onto top-left coordinate system. + x2 = text1Length - x2; + if (x1 >= x2) { + // Overlap detected. + return this.diffBisectSplit(text1, text2, x1, y1, deadline); + } + } + } + } + } + // Diff took too long and hit the deadline or + // number of diffs equals number of characters, no commonality at all. + return [ + [ DIFF_DELETE, text1 ], + [ DIFF_INSERT, text2 ] + ]; + }; + + /** + * Given the location of the 'middle snake', split the diff in two parts + * and recurse. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {number} x Index of split point in text1. + * @param {number} y Index of split point in text2. + * @param {number} deadline Time at which to bail if not yet complete. + * @return {!Array.} Array of diff tuples. + * @private + */ + DiffMatchPatch.prototype.diffBisectSplit = function( text1, text2, x, y, deadline ) { + var text1a, text1b, text2a, text2b, diffs, diffsb; + text1a = text1.substring(0, x); + text2a = text2.substring(0, y); + text1b = text1.substring(x); + text2b = text2.substring(y); + + // Compute both diffs serially. + diffs = this.DiffMain(text1a, text2a, false, deadline); + diffsb = this.DiffMain(text1b, text2b, false, deadline); + + return diffs.concat(diffsb); + }; + + /** + * Reduce the number of edits by eliminating semantically trivial equalities. + * @param {!Array.} diffs Array of diff tuples. + */ + DiffMatchPatch.prototype.diffCleanupSemantic = function(diffs) { + var changes, equalities, equalitiesLength, lastequality, + pointer, lengthInsertions2, lengthDeletions2, lengthInsertions1, + lengthDeletions1, deletion, insertion, overlapLength1, overlapLength2; + changes = false; + equalities = []; // Stack of indices where equalities are found. + equalitiesLength = 0; // Keeping our own length var is faster in JS. + /** @type {?string} */ + lastequality = null; + // Always equal to diffs[equalities[equalitiesLength - 1]][1] + pointer = 0; // Index of current position. + // Number of characters that changed prior to the equality. + lengthInsertions1 = 0; + lengthDeletions1 = 0; + // Number of characters that changed after the equality. + lengthInsertions2 = 0; + lengthDeletions2 = 0; + while (pointer < diffs.length) { + if (diffs[pointer][0] === DIFF_EQUAL) { // Equality found. + equalities[equalitiesLength++] = pointer; + lengthInsertions1 = lengthInsertions2; + lengthDeletions1 = lengthDeletions2; + lengthInsertions2 = 0; + lengthDeletions2 = 0; + lastequality = diffs[pointer][1]; + } else { // An insertion or deletion. + if (diffs[pointer][0] === DIFF_INSERT) { + lengthInsertions2 += diffs[pointer][1].length; + } else { + lengthDeletions2 += diffs[pointer][1].length; + } + // Eliminate an equality that is smaller or equal to the edits on both + // sides of it. + if (lastequality && (lastequality.length <= + Math.max(lengthInsertions1, lengthDeletions1)) && + (lastequality.length <= Math.max(lengthInsertions2, + lengthDeletions2))) { + // Duplicate record. + diffs.splice( equalities[ equalitiesLength - 1 ], 0, [ DIFF_DELETE, lastequality ] ); + // Change second copy to insert. + diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT; + // Throw away the equality we just deleted. + equalitiesLength--; + // Throw away the previous equality (it needs to be reevaluated). + equalitiesLength--; + pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1; + lengthInsertions1 = 0; // Reset the counters. + lengthDeletions1 = 0; + lengthInsertions2 = 0; + lengthDeletions2 = 0; + lastequality = null; + changes = true; } - - // Ensures identical properties name - return eq && innerEquiv(aProperties.sort(), bProperties.sort()); + } + pointer++; + } + + // Normalize the diff. + if (changes) { + this.diffCleanupMerge(diffs); + } + + // Find any overlaps between deletions and insertions. + // e.g: abcxxxxxxdef + // -> abcxxxdef + // e.g: xxxabcdefxxx + // -> defxxxabc + // Only extract an overlap if it is as big as the edit ahead or behind it. + pointer = 1; + while (pointer < diffs.length) { + if (diffs[pointer - 1][0] === DIFF_DELETE && + diffs[pointer][0] === DIFF_INSERT) { + deletion = diffs[pointer - 1][1]; + insertion = diffs[pointer][1]; + overlapLength1 = this.diffCommonOverlap(deletion, insertion); + overlapLength2 = this.diffCommonOverlap(insertion, deletion); + if (overlapLength1 >= overlapLength2) { + if (overlapLength1 >= deletion.length / 2 || + overlapLength1 >= insertion.length / 2) { + // Overlap found. Insert an equality and trim the surrounding edits. + diffs.splice( pointer, 0, [ DIFF_EQUAL, insertion.substring( 0, overlapLength1 ) ] ); + diffs[pointer - 1][1] = + deletion.substring(0, deletion.length - overlapLength1); + diffs[pointer + 1][1] = insertion.substring(overlapLength1); + pointer++; + } + } else { + if (overlapLength2 >= deletion.length / 2 || + overlapLength2 >= insertion.length / 2) { + // Reverse overlap found. + // Insert an equality and swap and trim the surrounding edits. + diffs.splice( pointer, 0, [ DIFF_EQUAL, deletion.substring( 0, overlapLength2 ) ] ); + diffs[pointer - 1][0] = DIFF_INSERT; + diffs[pointer - 1][1] = + insertion.substring(0, insertion.length - overlapLength2); + diffs[pointer + 1][0] = DIFF_DELETE; + diffs[pointer + 1][1] = + deletion.substring(overlapLength2); + pointer++; + } + } + pointer++; } + pointer++; + } + }; + + /** + * Determine if the suffix of one string is the prefix of another. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {number} The number of characters common to the end of the first + * string and the start of the second string. + * @private + */ + DiffMatchPatch.prototype.diffCommonOverlap = function(text1, text2) { + var text1Length, text2Length, textLength, + best, length, pattern, found; + // Cache the text lengths to prevent multiple calls. + text1Length = text1.length; + text2Length = text2.length; + // Eliminate the null case. + if (text1Length === 0 || text2Length === 0) { + return 0; + } + // Truncate the longer string. + if (text1Length > text2Length) { + text1 = text1.substring(text1Length - text2Length); + } else if (text1Length < text2Length) { + text2 = text2.substring(0, text1Length); + } + textLength = Math.min(text1Length, text2Length); + // Quick check for the worst case. + if (text1 === text2) { + return textLength; + } + + // Start by looking for a single character match + // and increase length until no match is found. + // Performance analysis: http://neil.fraser.name/news/2010/11/04/ + best = 0; + length = 1; + while (true) { + pattern = text1.substring(textLength - length); + found = text2.indexOf(pattern); + if (found === -1) { + return best; + } + length += found; + if (found === 0 || text1.substring(textLength - length) === + text2.substring(0, length)) { + best = length; + length++; + } + } + }; + + /** + * Split two texts into an array of strings. Reduce the texts to a string of + * hashes where each Unicode character represents one line. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {{chars1: string, chars2: string, lineArray: !Array.}} + * An object containing the encoded text1, the encoded text2 and + * the array of unique strings. + * The zeroth element of the array of unique strings is intentionally blank. + * @private + */ + DiffMatchPatch.prototype.diffLinesToChars = function(text1, text2) { + var lineArray, lineHash, chars1, chars2; + lineArray = []; // e.g. lineArray[4] === 'Hello\n' + lineHash = {}; // e.g. lineHash['Hello\n'] === 4 + + // '\x00' is a valid character, but various debuggers don't like it. + // So we'll insert a junk entry to avoid generating a null character. + lineArray[0] = ""; + + /** + * Split a text into an array of strings. Reduce the texts to a string of + * hashes where each Unicode character represents one line. + * Modifies linearray and linehash through being a closure. + * @param {string} text String to encode. + * @return {string} Encoded string. + * @private + */ + function diffLinesToCharsMunge(text) { + var chars, lineStart, lineEnd, lineArrayLength, line; + chars = ""; + // Walk the text, pulling out a substring for each line. + // text.split('\n') would would temporarily double our memory footprint. + // Modifying text would create many large strings to garbage collect. + lineStart = 0; + lineEnd = -1; + // Keeping our own length variable is faster than looking it up. + lineArrayLength = lineArray.length; + while (lineEnd < text.length - 1) { + lineEnd = text.indexOf("\n", lineStart); + if (lineEnd === -1) { + lineEnd = text.length - 1; + } + line = text.substring(lineStart, lineEnd + 1); + lineStart = lineEnd + 1; + + if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) : + (lineHash[line] !== undefined)) { + chars += String.fromCharCode( lineHash[ line ] ); + } else { + chars += String.fromCharCode(lineArrayLength); + lineHash[line] = lineArrayLength; + lineArray[lineArrayLength++] = line; + } + } + return chars; + } + + chars1 = diffLinesToCharsMunge(text1); + chars2 = diffLinesToCharsMunge(text2); + return { + chars1: chars1, + chars2: chars2, + lineArray: lineArray }; - }(); - - innerEquiv = function () { // can take multiple arguments - var args = Array.prototype.slice.apply(arguments); - if (args.length < 2) { - return true; // end transition + }; + + /** + * Rehydrate the text in a diff from a string of line hashes to real lines of + * text. + * @param {!Array.} diffs Array of diff tuples. + * @param {!Array.} lineArray Array of unique strings. + * @private + */ + DiffMatchPatch.prototype.diffCharsToLines = function( diffs, lineArray ) { + var x, chars, text, y; + for ( x = 0; x < diffs.length; x++ ) { + chars = diffs[x][1]; + text = []; + for ( y = 0; y < chars.length; y++ ) { + text[y] = lineArray[chars.charCodeAt(y)]; + } + diffs[x][1] = text.join(""); + } + }; + + /** + * Reorder and merge like edit sections. Merge equalities. + * Any edit section can move as long as it doesn't cross an equality. + * @param {!Array.} diffs Array of diff tuples. + */ + DiffMatchPatch.prototype.diffCleanupMerge = function(diffs) { + var pointer, countDelete, countInsert, textInsert, textDelete, + commonlength, changes; + diffs.push( [ DIFF_EQUAL, "" ] ); // Add a dummy entry at the end. + pointer = 0; + countDelete = 0; + countInsert = 0; + textDelete = ""; + textInsert = ""; + commonlength; + while (pointer < diffs.length) { + switch ( diffs[ pointer ][ 0 ] ) { + case DIFF_INSERT: + countInsert++; + textInsert += diffs[pointer][1]; + pointer++; + break; + case DIFF_DELETE: + countDelete++; + textDelete += diffs[pointer][1]; + pointer++; + break; + case DIFF_EQUAL: + // Upon reaching an equality, check for prior redundancies. + if (countDelete + countInsert > 1) { + if (countDelete !== 0 && countInsert !== 0) { + // Factor out any common prefixies. + commonlength = this.diffCommonPrefix(textInsert, textDelete); + if (commonlength !== 0) { + if ((pointer - countDelete - countInsert) > 0 && + diffs[pointer - countDelete - countInsert - 1][0] === + DIFF_EQUAL) { + diffs[pointer - countDelete - countInsert - 1][1] += + textInsert.substring(0, commonlength); + } else { + diffs.splice( 0, 0, [ DIFF_EQUAL, + textInsert.substring( 0, commonlength ) + ] ); + pointer++; + } + textInsert = textInsert.substring(commonlength); + textDelete = textDelete.substring(commonlength); + } + // Factor out any common suffixies. + commonlength = this.diffCommonSuffix(textInsert, textDelete); + if (commonlength !== 0) { + diffs[pointer][1] = textInsert.substring(textInsert.length - + commonlength) + diffs[pointer][1]; + textInsert = textInsert.substring(0, textInsert.length - + commonlength); + textDelete = textDelete.substring(0, textDelete.length - + commonlength); + } + } + // Delete the offending records and add the merged ones. + if (countDelete === 0) { + diffs.splice( pointer - countInsert, + countDelete + countInsert, [ DIFF_INSERT, textInsert ] ); + } else if (countInsert === 0) { + diffs.splice( pointer - countDelete, + countDelete + countInsert, [ DIFF_DELETE, textDelete ] ); + } else { + diffs.splice( pointer - countDelete - countInsert, + countDelete + countInsert, [ DIFF_DELETE, textDelete ], [ DIFF_INSERT, textInsert ] ); + } + pointer = pointer - countDelete - countInsert + + (countDelete ? 1 : 0) + (countInsert ? 1 : 0) + 1; + } else if (pointer !== 0 && diffs[pointer - 1][0] === DIFF_EQUAL) { + // Merge this equality with the previous one. + diffs[pointer - 1][1] += diffs[pointer][1]; + diffs.splice(pointer, 1); + } else { + pointer++; + } + countInsert = 0; + countDelete = 0; + textDelete = ""; + textInsert = ""; + break; + } + } + if (diffs[diffs.length - 1][1] === "") { + diffs.pop(); // Remove the dummy entry at the end. + } + + // Second pass: look for single edits surrounded on both sides by equalities + // which can be shifted sideways to eliminate an equality. + // e.g: ABAC -> ABAC + changes = false; + pointer = 1; + // Intentionally ignore the first and last element (don't need checking). + while (pointer < diffs.length - 1) { + if (diffs[pointer - 1][0] === DIFF_EQUAL && + diffs[pointer + 1][0] === DIFF_EQUAL) { + // This is a single edit surrounded by equalities. + if ( diffs[ pointer ][ 1 ].substring( diffs[ pointer ][ 1 ].length - + diffs[ pointer - 1 ][ 1 ].length ) === diffs[ pointer - 1 ][ 1 ] ) { + // Shift the edit over the previous equality. + diffs[pointer][1] = diffs[pointer - 1][1] + + diffs[pointer][1].substring(0, diffs[pointer][1].length - + diffs[pointer - 1][1].length); + diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1]; + diffs.splice(pointer - 1, 1); + changes = true; + } else if ( diffs[ pointer ][ 1 ].substring( 0, diffs[ pointer + 1 ][ 1 ].length ) === + diffs[ pointer + 1 ][ 1 ] ) { + // Shift the edit over the next equality. + diffs[pointer - 1][1] += diffs[pointer + 1][1]; + diffs[pointer][1] = + diffs[pointer][1].substring(diffs[pointer + 1][1].length) + + diffs[pointer + 1][1]; + diffs.splice(pointer + 1, 1); + changes = true; + } + } + pointer++; } - - return (function (a, b) { - if (a === b) { - return true; // catch the most you can - } else if (a === null || b === null || typeof a === "undefined" || typeof b === "undefined" || hoozit(a) !== hoozit(b)) { - return false; // don't lose time with error prone cases - } else { - return bindCallbacks(a, callbacks, [b, a]); - } - - // apply transition with (1..n) arguments - })(args[0], args[1]) && arguments.callee.apply(this, args.splice(1, args.length -1)); + // If shifts were made, the diff needs reordering and another shift sweep. + if (changes) { + this.diffCleanupMerge(diffs); + } + }; + + return function(o, n) { + var diff, output, text; + diff = new DiffMatchPatch(); + output = diff.DiffMain(o, n); + //console.log(output); + diff.diffCleanupEfficiency(output); + text = diff.diffPrettyHtml(output); + + return text; }; - - return innerEquiv; - -}(); +}()); +// jscs:enable + +(function() { + +// Deprecated QUnit.init - Ref #530 +// Re-initialize the configuration options +QUnit.init = function() { + var tests, banner, result, qunit, + config = QUnit.config; + + config.stats = { all: 0, bad: 0 }; + config.moduleStats = { all: 0, bad: 0 }; + config.started = 0; + config.updateRate = 1000; + config.blocking = false; + config.autostart = true; + config.autorun = false; + config.filter = ""; + config.queue = []; + + // Return on non-browser environments + // This is necessary to not break on node tests + if ( typeof window === "undefined" ) { + return; + } + + qunit = id( "qunit" ); + if ( qunit ) { + qunit.innerHTML = + "

" + escapeText( document.title ) + "

" + + "

" + + "
" + + "

" + + "
    "; + } + + tests = id( "qunit-tests" ); + banner = id( "qunit-banner" ); + result = id( "qunit-testresult" ); + + if ( tests ) { + tests.innerHTML = ""; + } + + if ( banner ) { + banner.className = ""; + } + + if ( result ) { + result.parentNode.removeChild( result ); + } + + if ( tests ) { + result = document.createElement( "p" ); + result.id = "qunit-testresult"; + result.className = "result"; + tests.parentNode.insertBefore( result, tests ); + result.innerHTML = "Running...
     "; + } +}; + +// Don't load the HTML Reporter on non-Browser environments +if ( typeof window === "undefined" ) { + return; +} + +var config = QUnit.config, + hasOwn = Object.prototype.hasOwnProperty, + defined = { + document: window.document !== undefined, + sessionStorage: (function() { + var x = "qunit-test-string"; + try { + sessionStorage.setItem( x, x ); + sessionStorage.removeItem( x ); + return true; + } catch ( e ) { + return false; + } + }()) + }, + modulesList = []; + +/** +* Escape text for attribute or text content. +*/ +function escapeText( s ) { + if ( !s ) { + return ""; + } + s = s + ""; + + // Both single quotes and double quotes (for attributes) + return s.replace( /['"<>&]/g, function( s ) { + switch ( s ) { + case "'": + return "'"; + case "\"": + return """; + case "<": + return "<"; + case ">": + return ">"; + case "&": + return "&"; + } + }); +} + +/** + * @param {HTMLElement} elem + * @param {string} type + * @param {Function} fn + */ +function addEvent( elem, type, fn ) { + if ( elem.addEventListener ) { + + // Standards-based browsers + elem.addEventListener( type, fn, false ); + } else if ( elem.attachEvent ) { + + // support: IE <9 + elem.attachEvent( "on" + type, function() { + var event = window.event; + if ( !event.target ) { + event.target = event.srcElement || document; + } + + fn.call( elem, event ); + }); + } +} /** - * jsDump - * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com - * Licensed under BSD (http://www.opensource.org/licenses/bsd-license.php) - * Date: 5/15/2008 - * @projectDescription Advanced and extensible data dumping for Javascript. - * @version 1.0.0 - * @author Ariel Flesler - * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html} + * @param {Array|NodeList} elems + * @param {string} type + * @param {Function} fn */ -QUnit.jsDump = (function() { - function quote( str ) { - return '"' + str.toString().replace(/"/g, '\\"') + '"'; - }; - function literal( o ) { - return o + ''; - }; - function join( pre, arr, post ) { - var s = jsDump.separator(), - base = jsDump.indent(), - inner = jsDump.indent(1); - if ( arr.join ) - arr = arr.join( ',' + s + inner ); - if ( !arr ) - return pre + post; - return [ pre, inner + arr, base + post ].join(s); - }; - function array( arr ) { - var i = arr.length, ret = Array(i); - this.up(); - while ( i-- ) - ret[i] = this.parse( arr[i] ); - this.down(); - return join( '[', ret, ']' ); - }; - - var reName = /^function (\w+)/; - - var jsDump = { - parse:function( obj, type ) { //type is used mostly internally, you can fix a (custom)type in advance - var parser = this.parsers[ type || this.typeOf(obj) ]; - type = typeof parser; - - return type == 'function' ? parser.call( this, obj ) : - type == 'string' ? parser : - this.parsers.error; - }, - typeOf:function( obj ) { - var type; - if ( obj === null ) { - type = "null"; - } else if (typeof obj === "undefined") { - type = "undefined"; - } else if (QUnit.is("RegExp", obj)) { - type = "regexp"; - } else if (QUnit.is("Date", obj)) { - type = "date"; - } else if (QUnit.is("Function", obj)) { - type = "function"; - } else if (obj.setInterval && obj.document && !obj.nodeType) { - type = "window"; - } else if (obj.nodeType === 9) { - type = "document"; - } else if (obj.nodeType) { - type = "node"; - } else if (typeof obj === "object" && typeof obj.length === "number" && obj.length >= 0) { - type = "array"; +function addEvents( elems, type, fn ) { + var i = elems.length; + while ( i-- ) { + addEvent( elems[ i ], type, fn ); + } +} + +function hasClass( elem, name ) { + return ( " " + elem.className + " " ).indexOf( " " + name + " " ) >= 0; +} + +function addClass( elem, name ) { + if ( !hasClass( elem, name ) ) { + elem.className += ( elem.className ? " " : "" ) + name; + } +} + +function toggleClass( elem, name ) { + if ( hasClass( elem, name ) ) { + removeClass( elem, name ); + } else { + addClass( elem, name ); + } +} + +function removeClass( elem, name ) { + var set = " " + elem.className + " "; + + // Class name may appear multiple times + while ( set.indexOf( " " + name + " " ) >= 0 ) { + set = set.replace( " " + name + " ", " " ); + } + + // trim for prettiness + elem.className = typeof set.trim === "function" ? set.trim() : set.replace( /^\s+|\s+$/g, "" ); +} + +function id( name ) { + return defined.document && document.getElementById && document.getElementById( name ); +} + +function getUrlConfigHtml() { + var i, j, val, + escaped, escapedTooltip, + selection = false, + len = config.urlConfig.length, + urlConfigHtml = ""; + + for ( i = 0; i < len; i++ ) { + val = config.urlConfig[ i ]; + if ( typeof val === "string" ) { + val = { + id: val, + label: val + }; + } + + escaped = escapeText( val.id ); + escapedTooltip = escapeText( val.tooltip ); + + if ( config[ val.id ] === undefined ) { + config[ val.id ] = QUnit.urlParams[ val.id ]; + } + + if ( !val.value || typeof val.value === "string" ) { + urlConfigHtml += ""; + } else { + urlConfigHtml += ""; + } + } + + return urlConfigHtml; +} + +// Handle "click" events on toolbar checkboxes and "change" for select menus. +// Updates the URL with the new state of `config.urlConfig` values. +function toolbarChanged() { + var updatedUrl, value, + field = this, + params = {}; + + // Detect if field is a select menu or a checkbox + if ( "selectedIndex" in field ) { + value = field.options[ field.selectedIndex ].value || undefined; + } else { + value = field.checked ? ( field.defaultValue || true ) : undefined; + } + + params[ field.name ] = value; + updatedUrl = setUrl( params ); + + if ( "hidepassed" === field.name && "replaceState" in window.history ) { + config[ field.name ] = value || false; + if ( value ) { + addClass( id( "qunit-tests" ), "hidepass" ); + } else { + removeClass( id( "qunit-tests" ), "hidepass" ); + } + + // It is not necessary to refresh the whole page + window.history.replaceState( null, "", updatedUrl ); + } else { + window.location = updatedUrl; + } +} + +function setUrl( params ) { + var key, + querystring = "?"; + + params = QUnit.extend( QUnit.extend( {}, QUnit.urlParams ), params ); + + for ( key in params ) { + if ( hasOwn.call( params, key ) ) { + if ( params[ key ] === undefined ) { + continue; + } + querystring += encodeURIComponent( key ); + if ( params[ key ] !== true ) { + querystring += "=" + encodeURIComponent( params[ key ] ); } - return type; - }, - separator:function() { - return this.multiline ? this.HTML ? '
    ' : '\n' : this.HTML ? ' ' : ' '; - }, - indent:function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing - if ( !this.multiline ) - return ''; - var chr = this.indentChar; - if ( this.HTML ) - chr = chr.replace(/\t/g,' ').replace(/ /g,' '); - return Array( this._depth_ + (extra||0) ).join(chr); - }, - up:function( a ) { - this._depth_ += a || 1; - }, - down:function( a ) { - this._depth_ -= a || 1; - }, - setParser:function( name, parser ) { - this.parsers[name] = parser; - }, - // The next 3 are exposed so you can use them - quote:quote, - literal:literal, - join:join, - // - _depth_: 1, - // This is the list of parsers, to modify them, use jsDump.setParser - parsers:{ - window: '[Window]', - document: '[Document]', - error:'[ERROR]', //when no parser is found, shouldn't happen - unknown: '[Unknown]', - 'null':'null', - undefined:'undefined', - 'function':function( fn ) { - var ret = 'function', - name = 'name' in fn ? fn.name : (reName.exec(fn)||[])[1];//functions never have name in IE - if ( name ) - ret += ' ' + name; - ret += '('; - - ret = [ ret, this.parse( fn, 'functionArgs' ), '){'].join(''); - return join( ret, this.parse(fn,'functionCode'), '}' ); - }, - array: array, - nodelist: array, - arguments: array, - object:function( map ) { - var ret = [ ]; - this.up(); - for ( var key in map ) - ret.push( this.parse(key,'key') + ': ' + this.parse(map[key]) ); - this.down(); - return join( '{', ret, '}' ); - }, - node:function( node ) { - var open = this.HTML ? '<' : '<', - close = this.HTML ? '>' : '>'; - - var tag = node.nodeName.toLowerCase(), - ret = open + tag; - - for ( var a in this.DOMAttrs ) { - var val = node[this.DOMAttrs[a]]; - if ( val ) - ret += ' ' + a + '=' + this.parse( val, 'attribute' ); - } - return ret + close + open + '/' + tag + close; - }, - functionArgs:function( fn ) {//function calls it internally, it's the arguments part of the function - var l = fn.length; - if ( !l ) return ''; - - var args = Array(l); - while ( l-- ) - args[l] = String.fromCharCode(97+l);//97 is 'a' - return ' ' + args.join(', ') + ' '; - }, - key:quote, //object calls it internally, the key part of an item in a map - functionCode:'[code]', //function calls it internally, it's the content of the function - attribute:quote, //node calls it internally, it's an html attribute value - string:quote, - date:quote, - regexp:literal, //regex - number:literal, - 'boolean':literal - }, - DOMAttrs:{//attributes to dump from nodes, name=>realName - id:'id', - name:'name', - 'class':'className' - }, - HTML:false,//if true, entities are escaped ( <, >, \t, space and \n ) - indentChar:' ',//indentation unit - multiline:false //if true, items in a collection, are separated by a \n, else just a space. - }; - - return jsDump; + querystring += "&"; + } + } + return location.protocol + "//" + location.host + + location.pathname + querystring.slice( 0, -1 ); +} + +function applyUrlParams() { + var selectedModule, + modulesList = id( "qunit-modulefilter" ), + filter = id( "qunit-filter-input" ).value; + + selectedModule = modulesList ? + decodeURIComponent( modulesList.options[ modulesList.selectedIndex ].value ) : + undefined; + + window.location = setUrl({ + module: ( selectedModule === "" ) ? undefined : selectedModule, + filter: ( filter === "" ) ? undefined : filter, + + // Remove testId filter + testId: undefined + }); +} + +function toolbarUrlConfigContainer() { + var urlConfigContainer = document.createElement( "span" ); + + urlConfigContainer.innerHTML = getUrlConfigHtml(); + addClass( urlConfigContainer, "qunit-url-config" ); + + // For oldIE support: + // * Add handlers to the individual elements instead of the container + // * Use "click" instead of "change" for checkboxes + addEvents( urlConfigContainer.getElementsByTagName( "input" ), "click", toolbarChanged ); + addEvents( urlConfigContainer.getElementsByTagName( "select" ), "change", toolbarChanged ); + + return urlConfigContainer; +} + +function toolbarLooseFilter() { + var filter = document.createElement( "form" ), + label = document.createElement( "label" ), + input = document.createElement( "input" ), + button = document.createElement( "button" ); + + addClass( filter, "qunit-filter" ); + + label.innerHTML = "Filter: "; + + input.type = "text"; + input.value = config.filter || ""; + input.name = "filter"; + input.id = "qunit-filter-input"; + + button.innerHTML = "Go"; + + label.appendChild( input ); + + filter.appendChild( label ); + filter.appendChild( button ); + addEvent( filter, "submit", function( ev ) { + applyUrlParams(); + + if ( ev && ev.preventDefault ) { + ev.preventDefault(); + } + + return false; + }); + + return filter; +} + +function toolbarModuleFilterHtml() { + var i, + moduleFilterHtml = ""; + + if ( !modulesList.length ) { + return false; + } + + modulesList.sort(function( a, b ) { + return a.localeCompare( b ); + }); + + moduleFilterHtml += "" + + ""; + + return moduleFilterHtml; +} + +function toolbarModuleFilter() { + var toolbar = id( "qunit-testrunner-toolbar" ), + moduleFilter = document.createElement( "span" ), + moduleFilterHtml = toolbarModuleFilterHtml(); + + if ( !toolbar || !moduleFilterHtml ) { + return false; + } + + moduleFilter.setAttribute( "id", "qunit-modulefilter-container" ); + moduleFilter.innerHTML = moduleFilterHtml; + + addEvent( moduleFilter.lastChild, "change", applyUrlParams ); + + toolbar.appendChild( moduleFilter ); +} + +function appendToolbar() { + var toolbar = id( "qunit-testrunner-toolbar" ); + + if ( toolbar ) { + toolbar.appendChild( toolbarUrlConfigContainer() ); + toolbar.appendChild( toolbarLooseFilter() ); + } +} + +function appendHeader() { + var header = id( "qunit-header" ); + + if ( header ) { + header.innerHTML = "" + header.innerHTML + " "; + } +} + +function appendBanner() { + var banner = id( "qunit-banner" ); + + if ( banner ) { + banner.className = ""; + } +} + +function appendTestResults() { + var tests = id( "qunit-tests" ), + result = id( "qunit-testresult" ); + + if ( result ) { + result.parentNode.removeChild( result ); + } + + if ( tests ) { + tests.innerHTML = ""; + result = document.createElement( "p" ); + result.id = "qunit-testresult"; + result.className = "result"; + tests.parentNode.insertBefore( result, tests ); + result.innerHTML = "Running...
     "; + } +} + +function storeFixture() { + var fixture = id( "qunit-fixture" ); + if ( fixture ) { + config.fixture = fixture.innerHTML; + } +} + +function appendUserAgent() { + var userAgent = id( "qunit-userAgent" ); + + if ( userAgent ) { + userAgent.innerHTML = ""; + userAgent.appendChild( + document.createTextNode( + "QUnit " + QUnit.version + "; " + navigator.userAgent + ) + ); + } +} + +function appendTestsList( modules ) { + var i, l, x, z, test, moduleObj; + + for ( i = 0, l = modules.length; i < l; i++ ) { + moduleObj = modules[ i ]; + + if ( moduleObj.name ) { + modulesList.push( moduleObj.name ); + } + + for ( x = 0, z = moduleObj.tests.length; x < z; x++ ) { + test = moduleObj.tests[ x ]; + + appendTest( test.name, test.testId, moduleObj.name ); + } + } +} + +function appendTest( name, testId, moduleName ) { + var title, rerunTrigger, testBlock, assertList, + tests = id( "qunit-tests" ); + + if ( !tests ) { + return; + } + + title = document.createElement( "strong" ); + title.innerHTML = getNameHtml( name, moduleName ); + + rerunTrigger = document.createElement( "a" ); + rerunTrigger.innerHTML = "Rerun"; + rerunTrigger.href = setUrl({ testId: testId }); + + testBlock = document.createElement( "li" ); + testBlock.appendChild( title ); + testBlock.appendChild( rerunTrigger ); + testBlock.id = "qunit-test-output-" + testId; + + assertList = document.createElement( "ol" ); + assertList.className = "qunit-assert-list"; + + testBlock.appendChild( assertList ); + + tests.appendChild( testBlock ); +} + +// HTML Reporter initialization and load +QUnit.begin(function( details ) { + var qunit = id( "qunit" ); + + // Fixture is the only one necessary to run without the #qunit element + storeFixture(); + + if ( qunit ) { + qunit.innerHTML = + "

    " + escapeText( document.title ) + "

    " + + "

    " + + "
    " + + "

    " + + "
      "; + } + + appendHeader(); + appendBanner(); + appendTestResults(); + appendUserAgent(); + appendToolbar(); + appendTestsList( details.modules ); + toolbarModuleFilter(); + + if ( qunit && config.hidepassed ) { + addClass( qunit.lastChild, "hidepass" ); + } +}); + +QUnit.done(function( details ) { + var i, key, + banner = id( "qunit-banner" ), + tests = id( "qunit-tests" ), + html = [ + "Tests completed in ", + details.runtime, + " milliseconds.
      ", + "", + details.passed, + " assertions of ", + details.total, + " passed, ", + details.failed, + " failed." + ].join( "" ); + + if ( banner ) { + banner.className = details.failed ? "qunit-fail" : "qunit-pass"; + } + + if ( tests ) { + id( "qunit-testresult" ).innerHTML = html; + } + + if ( config.altertitle && defined.document && document.title ) { + + // show ✖ for good, ✔ for bad suite result in title + // use escape sequences in case file gets loaded with non-utf-8-charset + document.title = [ + ( details.failed ? "\u2716" : "\u2714" ), + document.title.replace( /^[\u2714\u2716] /i, "" ) + ].join( " " ); + } + + // clear own sessionStorage items if all tests passed + if ( config.reorder && defined.sessionStorage && details.failed === 0 ) { + for ( i = 0; i < sessionStorage.length; i++ ) { + key = sessionStorage.key( i++ ); + if ( key.indexOf( "qunit-test-" ) === 0 ) { + sessionStorage.removeItem( key ); + } + } + } + + // scroll back to top to show results + if ( config.scrolltop && window.scrollTo ) { + window.scrollTo( 0, 0 ); + } +}); + +function getNameHtml( name, module ) { + var nameHtml = ""; + + if ( module ) { + nameHtml = "" + escapeText( module ) + ": "; + } + + nameHtml += "" + escapeText( name ) + ""; + + return nameHtml; +} + +QUnit.testStart(function( details ) { + var running, testBlock, bad; + + testBlock = id( "qunit-test-output-" + details.testId ); + if ( testBlock ) { + testBlock.className = "running"; + } else { + + // Report later registered tests + appendTest( details.name, details.testId, details.module ); + } + + running = id( "qunit-testresult" ); + if ( running ) { + bad = QUnit.config.reorder && defined.sessionStorage && + +sessionStorage.getItem( "qunit-test-" + details.module + "-" + details.name ); + + running.innerHTML = ( bad ? + "Rerunning previously failed test:
      " : + "Running:
      " ) + + getNameHtml( details.name, details.module ); + } + +}); + +QUnit.log(function( details ) { + var assertList, assertLi, + message, expected, actual, + testItem = id( "qunit-test-output-" + details.testId ); + + if ( !testItem ) { + return; + } + + message = escapeText( details.message ) || ( details.result ? "okay" : "failed" ); + message = "" + message + ""; + message += "@ " + details.runtime + " ms"; + + // pushFailure doesn't provide details.expected + // when it calls, it's implicit to also not show expected and diff stuff + // Also, we need to check details.expected existence, as it can exist and be undefined + if ( !details.result && hasOwn.call( details, "expected" ) ) { + expected = escapeText( QUnit.dump.parse( details.expected ) ); + actual = escapeText( QUnit.dump.parse( details.actual ) ); + message += ""; + + if ( actual !== expected ) { + message += "" + + ""; + } else { + if ( expected.indexOf( "[object Array]" ) !== -1 || + expected.indexOf( "[object Object]" ) !== -1 ) { + message += ""; + } + } + + if ( details.source ) { + message += ""; + } + + message += "
      Expected:
      " +
      +			expected +
      +			"
      Result:
      " +
      +				actual + "
      Diff:
      " +
      +				QUnit.diff( expected, actual ) + "
      Message: " + + "Diff suppressed as the depth of object is more than current max depth (" + + QUnit.config.maxDepth + ").

      Hint: Use QUnit.dump.maxDepth to " + + " run with a higher max depth or " + + "Rerun without max depth.

      Source:
      " +
      +				escapeText( details.source ) + "
      "; + + // this occours when pushFailure is set and we have an extracted stack trace + } else if ( !details.result && details.source ) { + message += "" + + "" + + "
      Source:
      " +
      +			escapeText( details.source ) + "
      "; + } + + assertList = testItem.getElementsByTagName( "ol" )[ 0 ]; + + assertLi = document.createElement( "li" ); + assertLi.className = details.result ? "pass" : "fail"; + assertLi.innerHTML = message; + assertList.appendChild( assertLi ); +}); + +QUnit.testDone(function( details ) { + var testTitle, time, testItem, assertList, + good, bad, testCounts, skipped, + tests = id( "qunit-tests" ); + + if ( !tests ) { + return; + } + + testItem = id( "qunit-test-output-" + details.testId ); + + assertList = testItem.getElementsByTagName( "ol" )[ 0 ]; + + good = details.passed; + bad = details.failed; + + // store result when possible + if ( config.reorder && defined.sessionStorage ) { + if ( bad ) { + sessionStorage.setItem( "qunit-test-" + details.module + "-" + details.name, bad ); + } else { + sessionStorage.removeItem( "qunit-test-" + details.module + "-" + details.name ); + } + } + + if ( bad === 0 ) { + addClass( assertList, "qunit-collapsed" ); + } + + // testItem.firstChild is the test name + testTitle = testItem.firstChild; + + testCounts = bad ? + "" + bad + ", " + "" + good + ", " : + ""; + + testTitle.innerHTML += " (" + testCounts + + details.assertions.length + ")"; + + if ( details.skipped ) { + testItem.className = "skipped"; + skipped = document.createElement( "em" ); + skipped.className = "qunit-skipped-label"; + skipped.innerHTML = "skipped"; + testItem.insertBefore( skipped, testTitle ); + } else { + addEvent( testTitle, "click", function() { + toggleClass( assertList, "qunit-collapsed" ); + }); + + testItem.className = bad ? "fail" : "pass"; + + time = document.createElement( "span" ); + time.className = "runtime"; + time.innerHTML = details.runtime + " ms"; + testItem.insertBefore( time, assertList ); + } +}); + +if ( defined.document ) { + if ( document.readyState === "complete" ) { + QUnit.load(); + } else { + addEvent( window, "load", QUnit.load ); + } +} else { + config.pageLoaded = true; + config.autorun = true; +} + })(); - -})(this); diff -r d4d36b583f40 -r a4fcee1e9789 devtools/devctl.py --- a/devtools/devctl.py Mon Mar 21 18:08:47 2016 +0100 +++ b/devtools/devctl.py Thu Mar 24 09:43:25 2016 +0100 @@ -73,10 +73,12 @@ return None def init_log(self): pass - def load_configuration(self): + def load_configuration(self, **kw): pass def default_log_file(self): return None + def default_stats_file(self): + return None def cleanup_sys_modules(config): @@ -580,8 +582,8 @@ # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more # details. # -# You should have received a copy of the GNU Lesser General Public License along -# with this program. If not, see . +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . ''', 'GPL': '''\ @@ -592,7 +594,8 @@ # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. # # You should have received a copy of the GNU General Public License along with # this program. If not, see . @@ -834,21 +837,11 @@ p.wait() -class GenerateQUnitHTML(Command): - """Generate a QUnit html file to see test in your browser""" - name = "qunit-html" - arguments = ' [...]' - - def run(self, args): - from cubicweb.devtools.qunit import make_qunit_html - print make_qunit_html(args[0], args[1:]) - for cmdcls in (UpdateCubicWebCatalogCommand, UpdateCubeCatalogCommand, #LiveServerCommand, NewCubeCommand, ExamineLogCommand, GenerateSchema, - GenerateQUnitHTML, ): CWCTL.register(cmdcls) diff -r d4d36b583f40 -r a4fcee1e9789 devtools/fake.py --- a/devtools/fake.py Mon Mar 21 18:08:47 2016 +0100 +++ b/devtools/fake.py Thu Mar 24 09:43:25 2016 +0100 @@ -1,4 +1,4 @@ -# copyright 2003-2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2015 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb. @@ -20,6 +20,8 @@ __docformat__ = "restructuredtext en" +from contextlib import contextmanager + from logilab.database import get_db_helper from cubicweb.req import RequestSessionBase @@ -159,6 +161,10 @@ # for use with enabled_security context manager read_security = write_security = True + @contextmanager + def running_hooks_ops(self): + yield + class FakeRepo(object): querier = None def __init__(self, schema, vreg=None, config=None): @@ -173,7 +179,7 @@ def internal_session(self): return FakeSession(self) - def extid2eid(self, source, extid, etype, session, insert=True): + def extid2eid(self, source, extid, etype, cnx, insert=True): try: return self.extids[extid] except KeyError: @@ -181,10 +187,10 @@ return None self._count += 1 eid = self._count - entity = source.before_entity_insertion(session, extid, etype, eid) + entity = source.before_entity_insertion(cnx, extid, etype, eid) self.extids[extid] = eid self.eids[eid] = extid - source.after_entity_insertion(session, extid, entity) + source.after_entity_insertion(cnx, extid, entity) return eid diff -r d4d36b583f40 -r a4fcee1e9789 devtools/httptest.py --- a/devtools/httptest.py Mon Mar 21 18:08:47 2016 +0100 +++ b/devtools/httptest.py Thu Mar 24 09:43:25 2016 +0100 @@ -1,4 +1,4 @@ -# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb. @@ -78,8 +78,6 @@ self.global_set_option('port', port) # force rewrite here return 'http://127.0.0.1:%d/' % self['port'] - def pyro_enabled(self): - return False class CubicWebServerTC(CubicWebTC): @@ -139,7 +137,6 @@ passwd = self.admpassword if passwd is None: passwd = user - self.login(user) response = self.web_get("login?__login=%s&__password=%s" % (user, passwd)) assert response.status == httplib.SEE_OTHER, response.status diff -r d4d36b583f40 -r a4fcee1e9789 devtools/qunit.py --- a/devtools/qunit.py Mon Mar 21 18:08:47 2016 +0100 +++ b/devtools/qunit.py Thu Mar 24 09:43:25 2016 +0100 @@ -29,7 +29,9 @@ from logilab.common.shellutils import getlogin import cubicweb +from cubicweb.view import View from cubicweb.web.controller import Controller +from cubicweb.web.views.staticcontrollers import StaticFileController, STATIC_CONTROLLERS from cubicweb.devtools.httptest import CubicWebServerTC @@ -66,7 +68,7 @@ self.firefox_cmd = ['firefox', '-no-remote'] if os.name == 'posix': self.firefox_cmd = [osp.join(osp.dirname(__file__), 'data', 'xvfb-run.sh'), - '-a', '-s', '-noreset -screen 0 640x480x8'] + self.firefox_cmd + '-a', '-s', '-noreset -screen 0 800x600x24'] + self.firefox_cmd def start(self, url): self.stop() @@ -102,11 +104,14 @@ test_queue = self.test_queue self._qunit_controller = MyQUnitResultController self.vreg.register(MyQUnitResultController) + self.vreg.register(QUnitView) + self.vreg.register(CWSoftwareRootStaticController) def tearDown(self): super(QUnitTestCase, self).tearDown() self.vreg.unregister(self._qunit_controller) - + self.vreg.unregister(QUnitView) + self.vreg.unregister(CWSoftwareRootStaticController) def abspath(self, path): """use self.__module__ to build absolute path if necessary""" @@ -130,35 +135,21 @@ yield js_test @with_tempdir - def _test_qunit(self, test_file, depends=(), data_files=(), timeout=30): + def _test_qunit(self, test_file, depends=(), data_files=(), timeout=10): assert osp.exists(test_file), test_file for dep in depends: assert osp.exists(dep), dep for data in data_files: assert osp.exists(data), data - # generate html test file - jquery_dir = 'file://' + self.config.locate_resource('jquery.js')[0] - html_test_file = NamedTemporaryFile(suffix='.html', delete=False) - html_test_file.write(make_qunit_html(test_file, depends, - base_url=self.config['base-url'], - web_data_path=jquery_dir)) - html_test_file.flush() - # copying data file - for data in data_files: - copyfile(data, tempfile.tempdir) + QUnitView.test_file = test_file + QUnitView.depends = depends while not self.test_queue.empty(): self.test_queue.get(False) browser = FirefoxHelper() - # start firefox once to let it init the profile (and run system-wide - # add-ons post setup, blegh), and then kill it ... - browser.start('about:blank') - import time; time.sleep(5) - browser.stop() - # ... then actually run the test file - browser.start(html_test_file.name) + browser.start(self.config['base-url'] + "?vid=qunit") test_count = 0 error = False def raise_exception(cls, *data): @@ -220,100 +211,114 @@ def handle_log(self): result = self._cw.form['result'] - message = self._cw.form['message'] - self._log_stack.append('%s: %s' % (result, message)) + message = self._cw.form.get('message', '') + actual = self._cw.form.get('actual') + expected = self._cw.form.get('expected') + source = self._cw.form.get('source') + log = '%s: %s' % (result, message) + if result == 'false' and actual is not None and expected is not None: + log += ' (got: %s, expected: %s)' % (actual, expected) + if source is not None: + log += '\n' + source + self._log_stack.append(log) -def cw_path(*paths): - return file_path(osp.join(cubicweb.CW_SOFTWARE_ROOT, *paths)) - -def file_path(path): - return 'file://' + osp.abspath(path) +class QUnitView(View): + __regid__ = 'qunit' -def build_js_script(host): - return """ - var host = '%s'; + templatable = False - QUnit.moduleStart = function (name) { - jQuery.ajax({ - url: host+'/qunit_result', - data: {"event": "module_start", - "name": name}, - async: false}); - } + depends = None + test_file = None - QUnit.testDone = function (name, failures, total) { - jQuery.ajax({ - url: host+'/qunit_result', - data: {"event": "test_done", - "name": name, - "failures": failures, - "total":total}, - async: false}); - } + def call(self, **kwargs): + w = self.w + req = self._cw + data = { + 'jquery': req.data_url('jquery.js'), + 'web_test': req.build_url('cwsoftwareroot/devtools/data'), + } + w(u''' + + + + + + + + ''' + % data) + w(u'') + w(u'') + w(u'') - html = [''' - - - - - - - - ''' - % data] - if base_url is not None: - html.append('') - html.append('') - html.append('') + prefix = len(cubicweb.CW_SOFTWARE_ROOT) + 1 + for dep in self.depends: + dep = req.build_url('cwsoftwareroot/') + dep[prefix:] + w(u' ' % dep) - for dep in depends: - html.append(' ' % file_path(dep)) + w(u' ') + test_url = req.build_url('cwsoftwareroot/') + self.test_file[prefix:] + w(u' ' % test_url) + w(u''' + +
      +
      + + ''') + - html.append(' ') - html.append(' '% (file_path(test_file),)) - html.append(''' - -
      -
      -

      QUnit example

      -

      -

      -
        - -''') - return u'\n'.join(html) +class CWSoftwareRootStaticController(StaticFileController): + __regid__ = 'cwsoftwareroot' + def publish(self, rset=None): + staticdir = cubicweb.CW_SOFTWARE_ROOT + relpath = self.relpath[len(self.__regid__) + 1:] + return self.static_file(osp.join(staticdir, relpath)) + + +STATIC_CONTROLLERS.append(CWSoftwareRootStaticController) if __name__ == '__main__': diff -r d4d36b583f40 -r a4fcee1e9789 devtools/repotest.py --- a/devtools/repotest.py Mon Mar 21 18:08:47 2016 +0100 +++ b/devtools/repotest.py Thu Mar 24 09:43:25 2016 +0100 @@ -259,12 +259,11 @@ def qexecute(self, rql, args=None, build_descr=True): with self.session.new_cnx() as cnx: - with cnx.ensure_cnx_set: - try: - return self.o.execute(cnx, rql, args, build_descr) - finally: - if rql.startswith(('INSERT', 'DELETE', 'SET')): - cnx.commit() + try: + return self.o.execute(cnx, rql, args, build_descr) + finally: + if rql.startswith(('INSERT', 'DELETE', 'SET')): + cnx.commit() class BasePlannerTC(BaseQuerierTC): diff -r d4d36b583f40 -r a4fcee1e9789 devtools/test/data/cubes/i18ntestcube/views.py --- a/devtools/test/data/cubes/i18ntestcube/views.py Mon Mar 21 18:08:47 2016 +0100 +++ b/devtools/test/data/cubes/i18ntestcube/views.py Thu Mar 24 09:43:25 2016 +0100 @@ -26,9 +26,6 @@ _myafs = MyAFS() -# XXX useless ASA logilab.common.registry is fixed -_myafs.__module__ = "cubes.i18ntestcube.views" - _myafs.tag_object_of(('*', 'in_forum', 'Forum'), 'main', 'inlined') afs.tag_object_of(('*', 'in_forum', 'Forum'), 'main', 'inlined') diff -r d4d36b583f40 -r a4fcee1e9789 devtools/test/data/js_examples/test_simple_failure.js --- a/devtools/test/data/js_examples/test_simple_failure.js Mon Mar 21 18:08:47 2016 +0100 +++ b/devtools/test/data/js_examples/test_simple_failure.js Thu Mar 24 09:43:25 2016 +0100 @@ -1,18 +1,18 @@ $(document).ready(function() { - module("air"); + QUnit.module("air"); - test("test 1", function() { - equals(2, 4); + QUnit.test("test 1", function (assert) { + assert.equal(2, 4); }); - test("test 2", function() { - equals('', '45'); - equals('1024', '32'); + QUnit.test("test 2", function (assert) { + assert.equal('', '45'); + assert.equal('1024', '32'); }); - module("able"); - test("test 3", function() { - same(1, 1); + QUnit.module("able"); + QUnit.test("test 3", function (assert) { + assert.deepEqual(1, 1); }); }); diff -r d4d36b583f40 -r a4fcee1e9789 devtools/test/data/js_examples/test_simple_success.js --- a/devtools/test/data/js_examples/test_simple_success.js Mon Mar 21 18:08:47 2016 +0100 +++ b/devtools/test/data/js_examples/test_simple_success.js Thu Mar 24 09:43:25 2016 +0100 @@ -1,17 +1,17 @@ $(document).ready(function() { - module("air"); + QUnit.module("air"); - test("test 1", function() { - equals(2, 2); + QUnit.test("test 1", function (assert) { + assert.equal(2, 2); }); - test("test 2", function() { - equals('45', '45'); + QUnit.test("test 2", function (assert) { + assert.equal('45', '45'); }); - module("able"); - test("test 3", function() { - same(1, 1); + QUnit.module("able"); + QUnit.test("test 3", function (assert) { + assert.deepEqual(1, 1); }); }); diff -r d4d36b583f40 -r a4fcee1e9789 devtools/test/data/js_examples/test_with_dep.js --- a/devtools/test/data/js_examples/test_with_dep.js Mon Mar 21 18:08:47 2016 +0100 +++ b/devtools/test/data/js_examples/test_with_dep.js Thu Mar 24 09:43:25 2016 +0100 @@ -1,9 +1,9 @@ $(document).ready(function() { - module("air"); + QUnit.module("air"); - test("test 1", function() { - equals(a, 4); + QUnit.test("test 1", function (assert) { + assert.equal(a, 4); }); }); diff -r d4d36b583f40 -r a4fcee1e9789 devtools/test/data/js_examples/test_with_ordered_deps.js --- a/devtools/test/data/js_examples/test_with_ordered_deps.js Mon Mar 21 18:08:47 2016 +0100 +++ b/devtools/test/data/js_examples/test_with_ordered_deps.js Thu Mar 24 09:43:25 2016 +0100 @@ -1,9 +1,9 @@ $(document).ready(function() { - module("air"); + QUnit.module("air"); - test("test 1", function() { - equals(b, 6); + QUnit.test("test 1", function (assert) { + assert.equal(b, 6); }); }); diff -r d4d36b583f40 -r a4fcee1e9789 devtools/test/requirements.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/devtools/test/requirements.txt Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,3 @@ +Twisted +webtest +cubicweb-person diff -r d4d36b583f40 -r a4fcee1e9789 devtools/test/unittest_i18n.py --- a/devtools/test/unittest_i18n.py Mon Mar 21 18:08:47 2016 +0100 +++ b/devtools/test/unittest_i18n.py Thu Mar 24 09:43:25 2016 +0100 @@ -20,8 +20,9 @@ import os, os.path as osp import sys +import subprocess -from logilab.common.testlib import TestCase, unittest_main +from unittest import TestCase, main from cubicweb.cwconfig import CubicWebNoAppConfiguration @@ -52,28 +53,23 @@ class cubePotGeneratorTC(TestCase): """test case for i18n pot file generator""" - def setUp(self): - self._CUBES_PATH = CubicWebNoAppConfiguration.CUBES_PATH[:] - CubicWebNoAppConfiguration.CUBES_PATH.append(osp.join(DATADIR, 'cubes')) - CubicWebNoAppConfiguration.cls_adjust_sys_path() - - def tearDown(self): - CubicWebNoAppConfiguration.CUBES_PATH[:] = self._CUBES_PATH - def test_i18ncube(self): - # MUST import here to make, since the import statement fire - # the cube paths setup (and then must occur after the setUp) - from cubicweb.devtools.devctl import update_cube_catalogs + env = os.environ.copy() + env['CW_CUBES_PATH'] = osp.join(DATADIR, 'cubes') + if 'PYTHONPATH' in env: + env['PYTHONPATH'] += os.pathsep + else: + env['PYTHONPATH'] = '' + env['PYTHONPATH'] += DATADIR + cwctl = osp.abspath(osp.join(osp.dirname(__file__), '../../bin/cubicweb-ctl')) + with open(os.devnull, 'w') as devnull: + subprocess.check_call([sys.executable, cwctl, 'i18ncube', 'i18ntestcube'], + env=env, stdout=devnull) cube = osp.join(DATADIR, 'cubes', 'i18ntestcube') msgs = load_po(osp.join(cube, 'i18n', 'en.po.ref')) - update_cube_catalogs(cube) newmsgs = load_po(osp.join(cube, 'i18n', 'en.po')) self.assertEqual(msgs, newmsgs) + if __name__ == '__main__': - # XXX dirty hack to make this test runnable using python (works - # fine with pytest, but not with python directly if this hack is - # not present) - # XXX to remove ASA logilab.common is fixed - sys.path.append('') - unittest_main() + main() diff -r d4d36b583f40 -r a4fcee1e9789 devtools/test/unittest_testlib.py --- a/devtools/test/unittest_testlib.py Mon Mar 21 18:08:47 2016 +0100 +++ b/devtools/test/unittest_testlib.py Thu Mar 24 09:43:25 2016 +0100 @@ -42,7 +42,7 @@ '__maineid': 0, '__type:0': 'Entity', '_cw_entity_fields:0': '__type,field', - '_cw_fields': 'file,encoding', + '_cw_fields': 'encoding,file', 'eid': [0], 'encoding': u'utf-8', 'field:0': 'value', diff -r d4d36b583f40 -r a4fcee1e9789 devtools/testlib.py --- a/devtools/testlib.py Mon Mar 21 18:08:47 2016 +0100 +++ b/devtools/testlib.py Thu Mar 24 09:43:25 2016 +0100 @@ -156,30 +156,6 @@ cwconfig.SMTP = MockSMTP -class TestCaseConnectionProxy(object): - """thin wrapper around `cubicweb.repoapi.ClientConnection` context-manager - used in CubicWebTC (cf. `cubicweb.devtools.testlib.CubicWebTC.login` method) - - It just proxies to the default connection context manager but - restores the original connection on exit. - """ - def __init__(self, testcase, cnx): - self.testcase = testcase - self.cnx = cnx - - def __getattr__(self, attrname): - return getattr(self.cnx, attrname) - - def __enter__(self): - # already open - return self.cnx - - def __exit__(self, exctype, exc, tb): - try: - return self.cnx.__exit__(exctype, exc, tb) - finally: - self.testcase.restore_connection() - # Repoaccess utility ###############################################3########### class RepoAccess(object): @@ -189,8 +165,7 @@ A repo access can create three type of object: - .. automethod:: cubicweb.testlib.RepoAccess.repo_cnx - .. automethod:: cubicweb.testlib.RepoAccess.client_cnx + .. automethod:: cubicweb.testlib.RepoAccess.cnx .. automethod:: cubicweb.testlib.RepoAccess.web_request The RepoAccess need to be closed to destroy the associated Session. @@ -225,16 +200,13 @@ return session @contextmanager - def repo_cnx(self): + def cnx(self): """Context manager returning a server side connection for the user""" with self._session.new_cnx() as cnx: yield cnx - @contextmanager - def client_cnx(self): - """Context manager returning a client side connection for the user""" - with repoapi.ClientConnection(self._session) as cnx: - yield cnx + # aliases for bw compat + client_cnx = repo_cnx = cnx @contextmanager def web_request(self, url=None, headers={}, method='GET', **kwargs): @@ -247,9 +219,10 @@ """ req = self.requestcls(self._repo.vreg, url=url, headers=headers, method=method, form=kwargs) - clt_cnx = repoapi.ClientConnection(self._session) - req.set_cnx(clt_cnx) - with clt_cnx: + with self._session.new_cnx() as cnx: + if 'ecache' in cnx.transaction_data: + del cnx.transaction_data['ecache'] + req.set_cnx(cnx) yield req def close(self): @@ -261,7 +234,7 @@ @contextmanager def shell(self): from cubicweb.server.migractions import ServerMigrationHelper - with repoapi.ClientConnection(self._session) as cnx: + with self._session.new_cnx() as cnx: mih = ServerMigrationHelper(None, repo=self._repo, cnx=cnx, interactive=False, # hack so it don't try to load fs schema @@ -294,17 +267,12 @@ requestcls = fake.FakeRequest tags = TestCase.tags | Tags('cubicweb', 'cw_repo') test_db_id = DEFAULT_EMPTY_DB_ID - _cnxs = set() # establised connection - # stay on connection for leak detection purpose # anonymous is logged by default in cubicweb test cases anonymous_allowed = True def __init__(self, *args, **kwargs): self._admin_session = None - self._admin_clt_cnx = None - self._current_session = None - self._current_clt_cnx = None self.repo = None self._open_access = set() super(CubicWebTC, self).__init__(*args, **kwargs) @@ -315,6 +283,7 @@ """provide a new RepoAccess object for a given user The access is automatically closed at the end of the test.""" + login = unicode(login) access = RepoAccess(self.repo, login, self.requestcls) self._open_access.add(access) return access @@ -326,92 +295,11 @@ except BadConnectionId: continue # already closed - @deprecated('[3.19] explicitly use RepoAccess object in test instead') - def set_cnx(self, cnx): - assert getattr(cnx, '_session', None) is not None - if cnx is self._admin_clt_cnx: - self._pop_custom_cnx() - else: - self._cnxs.add(cnx) # register the cnx to make sure it is removed - self._current_session = cnx._session - self._current_clt_cnx = cnx - @property - @deprecated('[3.19] explicitly use RepoAccess object in test instead') - def cnx(self): - # XXX we want to deprecate this - clt_cnx = self._current_clt_cnx - if clt_cnx is None: - clt_cnx = self._admin_clt_cnx - return clt_cnx - - def _close_cnx(self): - """ensure that all cnx used by a test have been closed""" - for cnx in list(self._cnxs): - if cnx._open and not cnx._session.closed: - cnx.rollback() - cnx.close() - self._cnxs.remove(cnx) - - @property - @deprecated('[3.19] explicitly use RepoAccess object in test instead') def session(self): - """return current server side session""" - # XXX We want to use a srv_connection instead and deprecate this - # property - session = self._current_session - if session is None: - session = self._admin_session - # bypassing all sanity to use the same repo cnx in the session - # - # we can't call set_cnx as the Connection is not managed by the - # session. - session._Session__threaddata.cnx = self._admin_clt_cnx._cnx - else: - session._Session__threaddata.cnx = self.cnx._cnx - session.set_cnxset() - return session - - @property - @deprecated('[3.19] explicitly use RepoAccess object in test instead') - def websession(self): - return self.session - - @property - @deprecated('[3.19] explicitly use RepoAccess object in test instead') - def adminsession(self): - """return current server side session (using default manager account)""" + """return admin session""" return self._admin_session - @deprecated('[3.19] explicitly use RepoAccess object in test instead') - def login(self, login, **kwargs): - """return a connection for the given login/password""" - __ = kwargs.pop('autoclose', True) # not used anymore - if login == self.admlogin: - # undo any previous login, if we're not used as a context manager - self.restore_connection() - return self.cnx - else: - if not kwargs: - kwargs['password'] = str(login) - clt_cnx = repoapi.connect(self.repo, login, **kwargs) - self.set_cnx(clt_cnx) - clt_cnx.__enter__() - return TestCaseConnectionProxy(self, clt_cnx) - - @deprecated('[3.19] explicitly use RepoAccess object in test instead') - def restore_connection(self): - self._pop_custom_cnx() - - def _pop_custom_cnx(self): - if self._current_clt_cnx is not None: - if self._current_clt_cnx._open: - self._current_clt_cnx.close() - if not self._current_session.closed: - self.repo.close(self._current_session.sessionid) - self._current_clt_cnx = None - self._current_session = None - #XXX this doesn't need to a be classmethod anymore def _init_repo(self): """init the repository and connection to it. @@ -425,62 +313,6 @@ login = unicode(db_handler.config.default_admin_config['login']) self.admin_access = self.new_access(login) self._admin_session = self.admin_access._session - self._admin_clt_cnx = repoapi.ClientConnection(self._admin_session) - self._cnxs.add(self._admin_clt_cnx) - self._admin_clt_cnx.__enter__() - - # db api ################################################################## - - @nocoverage - @deprecated('[3.19] explicitly use RepoAccess object in test instead') - def cursor(self, req=None): - if req is not None: - return req.cnx - else: - return self.cnx - - @nocoverage - @deprecated('[3.19] explicitly use RepoAccess object in test instead') - def execute(self, rql, args=None, req=None): - """executes , builds a resultset, and returns a couple (rset, req) - where req is a FakeRequest - """ - req = req or self.request(rql=rql) - return req.execute(unicode(rql), args) - - @nocoverage - @deprecated('[3.19] explicitly use RepoAccess object in test instead') - def commit(self): - try: - return self.cnx.commit() - finally: - self.session.set_cnxset() # ensure cnxset still set after commit - - @nocoverage - @deprecated('[3.19] explicitly use RepoAccess object in test instead') - def rollback(self): - try: - self.cnx.rollback() - except ProgrammingError: - pass # connection closed - finally: - self.session.set_cnxset() # ensure cnxset still set after commit - - @deprecated('[3.19] explicitly use RepoAccess object in test instead') - def request(self, rollbackfirst=False, url=None, headers={}, **kwargs): - """return a web ui request""" - if rollbackfirst: - self.cnx.rollback() - req = self.requestcls(self.vreg, url=url, headers=headers, form=kwargs) - req.set_cnx(self.cnx) - return req - - # server side db api ####################################################### - - @deprecated('[3.19] explicitly use RepoAccess object in test instead') - def sexecute(self, rql, args=None): - self.session.set_cnxset() - return self.session.execute(rql, args) # config management ######################################################## @@ -548,15 +380,6 @@ """return the application schema""" return self.vreg.schema - @deprecated('[3.19] explicitly use RepoAccess object in test instead') - def shell(self): - """return a shell session object""" - from cubicweb.server.migractions import ServerMigrationHelper - return ServerMigrationHelper(None, repo=self.repo, cnx=self.cnx, - interactive=False, - # hack so it don't try to load fs schema - schema=1) - def set_option(self, optname, value): self.config.global_set_option(optname, value) @@ -577,24 +400,17 @@ self.skipTest('repository is not initialised: %r' % previous_failure) try: self._init_repo() - self.addCleanup(self._close_cnx) except Exception as ex: self.__class__._repo_init_failed = ex raise self.addCleanup(self._close_access) self.setup_database() - self._admin_clt_cnx.commit() MAILBOX[:] = [] # reset mailbox def tearDown(self): # XXX hack until logilab.common.testlib is fixed - if self._admin_clt_cnx is not None: - if self._admin_clt_cnx._open: - self._admin_clt_cnx.close() - self._admin_clt_cnx = None if self._admin_session is not None: - if not self._admin_session.closed: - self.repo.close(self._admin_session.sessionid) + self.repo.close(self._admin_session.sessionid) self._admin_session = None while self._cleanups: cleanup, args, kwargs = self._cleanups.pop(-1) @@ -634,20 +450,11 @@ def create_user(self, req, login=None, groups=('users',), password=None, email=None, commit=True, **kwargs): """create and return a new user entity""" - if isinstance(req, basestring): - warn('[3.12] create_user arguments are now (req, login[, groups, password, commit, **kwargs])', - DeprecationWarning, stacklevel=2) - if not isinstance(groups, (tuple, list)): - password = groups - groups = login - elif isinstance(login, tuple): - groups = login - login = req - assert not isinstance(self, type) - req = self._admin_clt_cnx if password is None: - password = login.encode('utf8') - user = req.create_entity('CWUser', login=unicode(login), + password = login + if login is not None: + login = unicode(login) + user = req.create_entity('CWUser', login=login, upassword=password, **kwargs) req.execute('SET X in_group G WHERE X eid %%(x)s, G name IN(%s)' % ','.join(repr(str(g)) for g in groups), @@ -918,7 +725,7 @@ if entity_fields: form[eid_param('_cw_entity_fields', entity.eid)] = ','.join(entity_fields) if fields: - form['_cw_fields'] = ','.join(fields) + form['_cw_fields'] = ','.join(sorted(fields)) return form @deprecated('[3.19] use .admin_request_from_url instead') @@ -1038,8 +845,8 @@ def assertAuthSuccess(self, req, origsession, nbsessions=1): sh = self.app.session_handler session = self.app.get_session(req) - clt_cnx = repoapi.ClientConnection(session) - req.set_cnx(clt_cnx) + cnx = repoapi.Connection(session) + req.set_cnx(cnx) self.assertEqual(len(self.open_sessions), nbsessions, self.open_sessions) self.assertEqual(session.login, origsession.login) self.assertEqual(session.anonymous_session, False) @@ -1212,7 +1019,8 @@ def assertDocTestFile(self, testfile): # doctest returns tuple (failure_count, test_count) - result = self.shell().process_script(testfile) + with self.admin_access.shell() as mih: + result = mih.process_script(testfile) if result[0] and result[1]: raise self.failureException("doctest file '%s' failed" % testfile) @@ -1325,7 +1133,7 @@ """this method populates the database with `how_many` entities of each possible type. It also inserts random relations between them """ - with self.admin_access.repo_cnx() as cnx: + with self.admin_access.cnx() as cnx: with cnx.security_enabled(read=False, write=False): self._auto_populate(cnx, how_many) cnx.commit() diff -r d4d36b583f40 -r a4fcee1e9789 doc/3.14.rst --- a/doc/3.14.rst Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,164 +0,0 @@ -Whats new in CubicWeb 3.14 -========================== - -First notice CW 3.14 depends on yams 0.34 (which is incompatible with prior -cubicweb releases regarding instance re-creation). - -API changes ------------ - -* `Entity.fetch_rql` `restriction` argument has been deprecated and should be - replaced with a call to the new `Entity.fetch_rqlst` method, get the returned - value (a rql `Select` node) and use the RQL syntax tree API to include the - above-mentionned restrictions. - - Backward compat is kept with proper warning. - -* `Entity.fetch_order` and `Entity.fetch_unrelated_order` class methods have been - replaced by `Entity.cw_fetch_order` and `Entity.cw_fetch_unrelated_order` with - a different prototype: - - - instead of taking (attr, var) as two string argument, they now take (select, - attr, var) where select is the rql syntax tree beinx constructed and var the - variable *node*. - - - instead of returning some string to be inserted in the ORDERBY clause, it has - to modify the syntax tree - - Backward compat is kept with proper warning, BESIDE cases below: - - - custom order method return **something else the a variable name with or - without the sorting order** (e.g. cases where you sort on the value of a - registered procedure as it was done in the tracker for instance). In such - case, an error is logged telling that this sorting is ignored until API - upgrade. - - - client code use direct access to one of those methods on an entity (no code - known to do that). - -* `Entity._rest_attr_info` class method has been renamed to - `Entity.cw_rest_attr_info` - - No backward compat yet since this is a protected method an no code is known to - use it outside cubicweb itself. - -* `AnyEntity.linked_to` has been removed as part of a refactoring of this - functionality (link a entity to another one at creation step). It was replaced - by a `EntityFieldsForm.linked_to` property. - - In the same refactoring, `cubicweb.web.formfield.relvoc_linkedto`, - `cubicweb.web.formfield.relvoc_init` and - `cubicweb.web.formfield.relvoc_unrelated` were removed and replaced by - RelationField methods with the same names, that take a form as a parameter. - - **No backward compatibility yet**. It's still time to cry for it. - Cubes known to be affected: tracker, vcsfile, vcreview. - -* `CWPermission` entity type and its associated require_permission relation type - (abstract) and require_group relation definitions have been moved to a new - `localperms` cube. With this have gone some functions from the - `cubicweb.schemas` package as well as some views. This makes cubicweb itself - smaller while you get all the local permissions stuff into a single, - documented, place. - - Backward compat is kept for existing instances, **though you should have - installed the localperms cubes**. A proper error should be displayed when - trying to migrate to 3.14 an instance the use `CWPermission` without the new - cube installed. For new instances / test, you should add a dependancy on the - new cube in cubes using this feature, along with a dependancy on cubicweb >= - 3.14. - -* jQuery has been updated to 1.6.4 and jquery-tablesorter to 2.0.5. No backward - compat issue known. - -* Table views refactoring : new `RsetTableView` and `EntityTableView`, as well as - rewritten an enhanced version of `PyValTableView` on the same bases, with logic - moved to some column renderers and a layout. Those should be well documented - and deprecates former `TableView`, `EntityAttributesTableView` and `CellView`, - which are however kept for backward compat, with some warnings that may not be - very clear unfortunatly (you may see your own table view subclass name here, - which doesn't make the problem that clear). Notice that `_cw.view('table', - rset, *kwargs)` will be routed to the new `RsetTableView` or to the old - `TableView` depending on given extra arguments. See #1986413. - -* `display_name` don't call .lower() anymore. This may leads to changes in your - user interface. Different msgid for upper/lower cases version of entity type - names, as this is the only proper way to handle this with some languages. - -* `IEditControlAdapter` has been deprecated in favor of `EditController` - overloading, which was made easier by adding dedicated selectors called - `match_edited_type` and `match_form_id`. - -* Pre 3.6 API backward compat has been dropped, though *data* migration - compatibility has been kept. You may have to fix errors due to old API usage - for your instance before to be able to run migration, but then you should be - able to upgrade even a pre 3.6 database. - -* Deprecated `cubicweb.web.views.iprogress` in favor of new `iprogress` cube. - -* Deprecated `cubicweb.web.views.flot` in favor of new `jqplot` cube. - - -Unintrusive API changes ------------------------ - -* Refactored properties forms (eg user preferences and site wide properties) as - well as pagination components to ease overridding. - -* New `cubicweb.web.uihelper` module with high-level helpers for uicfg. - -* New `anonymized_request` decorator to temporary run stuff as an anonymous - user, whatever the currently logged in user. - -* New 'verbatimattr' attribute view. - -* New facet and form widget for Integer used to store binary mask. - -* New `js_href` function to generated proper javascript href. - -* `match_kwargs` and `match_form_params` selectors both accept a new - `once_is_enough` argument. - -* `printable_value` is now a method of request, and may be given dict of - formatters to use. - -* `[Rset]TableView` allows to set None in 'headers', meaning the label should be - fetched from the result set as done by default. - -* Field vocabulary computation on entity creation now takes `__linkto` - information into accounet. - -* Started a `cubicweb.pylintext` pylint plugin to help pylint analyzing cubes. - - -RQL ---- - -* Support for HAVING in 'SET' and 'DELETE' queries. - -* new `AT_TZ` function to get back a timestamp at a given time-zone. - -* new `WEEKDAY` date extraction function - - -User interface changes ----------------------- - -* Datafeed source now present an history of the latest import's log, including - global status and debug/info/warning/error messages issued during - imports. Import logs older than a configurable amount of time are automatically - deleted. - -* Breadcrumbs component is properly kept when creating an entity with '__linkto'. - -* users and groups management now really lead to that (i.e. includes *groups* - management). - -* New 'jsonp' controller with 'jsonexport' and 'ejsonexport' views. - - -Configuration ------------- - -* Added option 'resources-concat' to make javascript/css files concatenation - optional. diff -r d4d36b583f40 -r a4fcee1e9789 doc/3.15.rst --- a/doc/3.15.rst Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ -What's new in CubicWeb 3.15? -============================ - -New functionnalities --------------------- - -* Add Zmq server, based on the cutting edge ZMQ (http://www.zeromq.org/) socket - library. This allows to access distant instance, in a similar way as Pyro. - -* Publish/subscribe mechanism using ZMQ for communication among cubicweb - instances. The new zmq-address-sub and zmq-address-pub configuration variables - define where this communication occurs. As of this release this mechanism is - used for entity cache invalidation. - -* Improved WSGI support. While there is still some caveats, most of the code - which was twisted only is now generic and allows related functionalities to work - with a WSGI front-end. - -* Full undo/transaction support : undo of modification has eventually been - implemented, and the configuration simplified (basically you activate it or not - on an instance basis). - -* Controlling HTTP status code used is not much more easier : - - - `WebRequest` now has a `status_out` attribut to control the response status ; - - - most web-side exceptions take an optional ``status`` argument. - -API changes ------------ - -* The base registry implementation has been moved to a new - `logilab.common.registry` module (see #1916014). This includes code from : - - * `cubicweb.vreg` (the whole things that was in there) - * `cw.appobject` (base selectors and all). - - In the process, some renaming was done: - - * the top level registry is now `RegistryStore` (was `VRegistry`), but that - should not impact cubicweb client code ; - - * former selectors functions are now known as "predicate", though you still use - predicates to build an object'selector ; - - * for consistency, the `objectify_selector` decoraror has hence be renamed to - `objectify_predicate` ; - - * on the CubicWeb side, the `selectors` module has been renamed to - `predicates`. - - Debugging refactoring dropped the more need for the `lltrace` decorator. There - should be full backward compat with proper deprecation warnings. Notice the - `yes` predicate and `objectify_predicate` decorator, as well as the - `traced_selection` function should now be imported from the - `logilab.common.registry` module. - -* All login forms are now submitted to /login. Redirection to requested - page is now handled by the login controller (it was previously handle by the - session manager). - -* `Publisher.publish` has been renamed to `Publisher.handle_request`. This - method now contains generic version of logic previously handled by - Twisted. `Controller.publish` is **not** affected. - -Unintrusive API changes ------------------------ - -* New 'ldapfeed' source type, designed to replace 'ldapuser' source with - data-feed (i.e. copy based) source ideas. - -* New 'zmqrql' source type, similar to 'pyrorql' but using ømq instead of Pyro. - -* A new registry called `services` has appeared, where you can register - server-side `cubicweb.server.Service` child classes. Their `call` method can be - invoked from a web-side AppObject instance using new `self._cw.call_service` - method or a server-side one using `self.session.call_service`. This is a new - way to call server-side methods, much cleaner than monkey patching the - Repository class, which becomes a deprecated way to perform similar tasks. - -* a new `ajax-func` registry now hosts all remote functions (i.e. functions - callable through the `asyncRemoteExec` JS api). A convenience `ajaxfunc` - decorator will let you expose your python function easily without all the - appobject standard boilerplate. Backward compatibility is preserved. - -* the 'json' controller is now deprecated in favor of the 'ajax' one. - -* `WebRequest.build_url` can now take a __secure__ argument. When True cubicweb - try to generate an https url. - - -User interface changes ----------------------- - -A new 'undohistory' view expose the undoable transactions and give access to undo -some of them. diff -r d4d36b583f40 -r a4fcee1e9789 doc/3.16.rst --- a/doc/3.16.rst Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,97 +0,0 @@ -What's new in CubicWeb 3.16? -============================ - -New functionalities --------------------- - -* Add a new dataimport store (`SQLGenObjectStore`). This store enables a fast - import of data (entity creation, link creation) in CubicWeb, by directly - flushing information in SQL. This may only be used with PostgreSQL, as it - requires the 'COPY FROM' command. - - -API changes ------------ - -* Orm: `set_attributes` and `set_relations` are unified (and - deprecated) in favor of `cw_set` that works in all cases. - -* db-api/configuration: all the external repository connection information is - now in an URL (see `#2521848 `_), - allowing to drop specific options of pyro nameserver host, group, etc and fix - broken `ZMQ `_ source. Configuration related changes: - - * Dropped 'pyro-ns-host', 'pyro-instance-id', 'pyro-ns-group' from the client side - configuration, in favor of 'repository-uri'. **NO MIGRATION IS DONE**, - supposing there is no web-only configuration in the wild. - - * Stop discovering the connection method through `repo_method` class attribute - of the configuration, varying according to the configuration class. This is - a first step on the way to a simpler configuration handling. - - DB-API related changes: - - * Stop indicating the connection method using `ConnectionProperties`. - - * Drop `_cnxtype` attribute from `Connection` and `cnxtype` from - `Session`. The former is replaced by a `is_repo_in_memory` property - and the later is totaly useless. - - * Turn `repo_connect` into `_repo_connect` to mark it as a private function. - - * Deprecate `in_memory_cnx` which becomes useless, use `_repo_connect` instead - if necessary. - -* the "tcp://" uri scheme used for `ZMQ `_ - communications (in a way reminiscent of Pyro) is now named - "zmqpickle-tcp://", so as to make room for future zmq-based lightweight - communications (without python objects pickling). - -* Request.base_url gets a `secure=True` optional parameter that yields - an https url if possible, allowing hook-generated content to send - secure urls (e.g. when sending mail notifications) - -* Dataimport ucsvreader gets a new boolean `ignore_errors` - parameter. - - -Unintrusive API changes ------------------------ - -* Drop of `cubicweb.web.uicfg.AutoformSectionRelationTags.bw_tag_map`, - deprecated since 3.6. - - -User interface changes ----------------------- - -* The RQL search bar has now some auto-completion support. It means - relation types or entity types can be suggested while typing. It is - an awesome improvement over the current behaviour ! - -* The `action box` associated with `table` views (from `tableview.py`) - has been transformed into a nice-looking series of small tabs; it - means that the possible actions are immediately visible and need not - be discovered by clicking on an almost invisible icon on the upper - right. - -* The `uicfg` module has moved to web/views/ and ui configuration - objects are now selectable. This will reduce the amount of - subclassing and whole methods replacement usually needed to - customize the ui behaviour in many cases. - -* Remove changelog view, as neither cubicweb nor known - cubes/applications were properly feeding related files. - - -Other changes -------------- - -* 'pyrorql' sources will be automatically updated to use an URL to locate the source - rather than configuration option. 'zmqrql' sources were broken before this change, - so no upgrade is needed... - -* Debugging filters for Hooks and Operations have been added. - -* Some cubicweb-ctl commands used to show the output of `msgcat` and - `msgfmt`; they don't anymore. diff -r d4d36b583f40 -r a4fcee1e9789 doc/3.17.rst --- a/doc/3.17.rst Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -What's new in CubicWeb 3.17? -============================ - -New functionalities --------------------- - -* add a command to compare db schema and file system schema - (see `#464991 `_) - -* Add CubicWebRequestBase.content with the content of the HTTP request (see #2742453) - (see `#2742453 `_) - -* Add directive bookmark to ReST rendering - (see `#2545595 `_) - -* Allow user defined final type - (see `#124342 `_) - - -API changes ------------ - -* drop typed_eid() in favour of int() (see `#2742462 `_) - -* The SIOC views and adapters have been removed from CubicWeb and moved to the - `sioc` cube. - -* The web page embedding views and adapters have been removed from CubicWeb and - moved to the `embed` cube. - -* The email sending views and controllers have been removed from CubicWeb and - moved to the `massmailing` cube. - -* ``RenderAndSendNotificationView`` is deprecated in favor of - ``ActualNotificationOp`` the new operation use the more efficient *data* - idiom. - -* Looping task can now have a interval <= ``0``. Negative interval disable the - looping task entirely. - -* We now serve html instead of xhtml. - (see `#2065651 `_) - - -Deprecation ---------------------- - -* ``ldapuser`` have been deprecated. It'll be fully dropped in the next - version. If you are still using ldapuser switch to ``ldapfeed`` **NOW**! - -* ``hijack_user`` have been deprecated. It will be dropped soon. - -Deprecated Code Drops ----------------------- - -* The progress views and adapters have been removed from CubicWeb. These - classes were deprecated since 3.14.0. They are still available in the - `iprogress` cube. - -* API deprecated since 3.7 have been dropped. diff -r d4d36b583f40 -r a4fcee1e9789 doc/3.18.rst --- a/doc/3.18.rst Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,101 +0,0 @@ -What's new in CubicWeb 3.18? -============================ - -The migration script does not handle sqlite nor mysql instances. - - -New functionalities --------------------- - -* add a security debugging tool - (see `#2920304 `_) - -* introduce an `add` permission on attributes, to be interpreted at - entity creation time only and allow the implementation of complex - `update` rules that don't block entity creation (before that the - `update` attribute permission was interpreted at entity creation and - update time) - -* the primary view display controller (uicfg) now has a - `set_fields_order` method similar to the one available for forms - -* new method `ResultSet.one(col=0)` to retrive a single entity and enforce the - result has only one row (see `#3352314 https://www.cubicweb.org/ticket/3352314`_) - -* new method `RequestSessionBase.find` to look for entities - (see `#3361290 https://www.cubicweb.org/ticket/3361290`_) - -* the embedded jQuery copy has been updated to version 1.10.2, and jQuery UI to - version 1.10.3. - -* initial support for wsgi for the debug mode, available through the new - ``wsgi`` cubicweb-ctl command, which can use either python's builtin - wsgi server or the werkzeug module if present. - -* a ``rql-table`` directive is now available in ReST fields - -* cubicweb-ctl upgrade can now generate the static data resource directory - directly, without a manual call to gen-static-datadir. - -API changes ------------ - -* not really an API change, but the entity permission checks are now - systematically deferred to an operation, instead of a) trying in a - hook and b) if it failed, retrying later in an operation - -* The default value storage for attributes is no longer String, but - Bytes. This opens the road to storing arbitrary python objects, e.g. - numpy arrays, and fixes a bug where default values whose truth value - was False were not properly migrated. - -* `symmetric` relations are no more handled by an rql rewrite but are - now handled with hooks (from the `activeintegrity` category); this - may have some consequences for applications that do low-level database - manipulations or at times disable (some) hooks. - -* `unique together` constraints (multi-columns unicity constraints) - get a `name` attribute that maps the CubicWeb contraint entities to - corresponding backend index. - -* BreadCrumbEntityVComponent's open_breadcrumbs method now includes - the first breadcrumbs separator - -* entities can be compared for equality and hashed - -* the ``on_fire_transition`` predicate accepts a sequence of possible - transition names - -* the GROUP_CONCAT rql aggregate function no longer repeats duplicate - values, on the sqlite and postgresql backends - -Deprecation ---------------------- - -* ``pyrorql`` sources have been deprecated. Multisource will be fully dropped - in the next version. If you are still using pyrorql, switch to ``datafeed`` - **NOW**! - -* the old multi-source system - -* `find_one_entity` and `find_entities` in favor of `find` - (see `#3361290 https://www.cubicweb.org/ticket/3361290`_) - -* the `TmpFileViewMixin` and `TmpPngView` classes (see `#3400448 - https://www.cubicweb.org/ticket/3400448`_) - -Deprecated Code Drops ----------------------- - -* ``ldapuser`` have been dropped; use ``ldapfeed`` now - (see `#2936496 `_) - -* action ``GotRhythm`` was removed, make sure you do not - import it in your cubes (even to unregister it) - (see `#3093362 `_) - -* all 3.8 backward compat is gone - -* all 3.9 backward compat (including the javascript side) is gone - -* the ``twisted`` (web-only) instance type has been removed diff -r d4d36b583f40 -r a4fcee1e9789 doc/3.19.rst --- a/doc/3.19.rst Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,180 +0,0 @@ -What's new in CubicWeb 3.19? -============================ - -New functionalities --------------------- - -* implement Cross Origin Resource Sharing (CORS) - (see `#2491768 `_) - -* system_source.create_eid can get a range of IDs, to reduce overhead of batch - entity creation - -Behaviour Changes ------------------ - -* The anonymous property of Session and Connection are now computed from the - related user login. If it matches the ``anonymous-user`` in the config the - connection is anonymous. Beware that the ``anonymous-user`` config is web - specific. Therefore, no session may be anonymous in a repository only setup. - - -New Repository Access API -------------------------- - -Connection replaces Session -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -A new explicit Connection object replaces Session as the main repository entry -point. Connection holds all the necessary methods to be used server-side -(``execute``, ``commit``, ``rollback``, ``call_service``, ``entity_from_eid``, -etc...). One obtains a new Connection object using ``session.new_cnx()``. -Connection objects need to have an explicit begin and end. Use them as a context -manager to never miss an end:: - - with session.new_cnx() as cnx: - cnx.execute('INSERT Elephant E, E name "Babar"') - cnx.commit() - cnx.execute('INSERT Elephant E, E name "Celeste"') - cnx.commit() - # Once you get out of the "with" clause, the connection is closed. - -Using the same Connection object in multiple threads will give you access to the -same Transaction. However, Connection objects are not thread safe (hence at your -own risks). - -``repository.internal_session`` is deprecated in favor of -``repository.internal_cnx``. Note that internal connections are now `safe` by default, -i.e. the integrity hooks are enabled. - -Backward compatibility is preserved on Session. - - -dbapi vs repoapi -~~~~~~~~~~~~~~~~ - -A new API has been introduced to replace the dbapi. It is called `repoapi`. - -There are three relevant functions for now: - -* ``repoapi.get_repository`` returns a Repository object either from an - URI when used as ``repoapi.get_repository(uri)`` or from a config - when used as ``repoapi.get_repository(config=config)``. - -* ``repoapi.connect(repo, login, **credentials)`` returns a ClientConnection - associated with the user identified by the credentials. The - ClientConnection is associated with its own Session that is closed - when the ClientConnection is closed. A ClientConnection is a - Connection-like object to be used client side. - -* ``repoapi.anonymous_cnx(repo)`` returns a ClientConnection associated - with the anonymous user if described in the config. - - -repoapi.ClientConnection replace dbapi.Connection and company -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -On the client/web side, the Request is now using a ``repoapi.ClientConnection`` -instead of a ``dbapi.connection``. The ``ClientConnection`` has multiple backward -compatible methods to make it look like a ``dbapi.Cursor`` and ``dbapi.Connection``. - -Session used on the Web side are now the same than the one used Server side. -Some backward compatibility methods have been installed on the server side Session -to ease the transition. - -The authentication stack has been altered to use the ``repoapi`` instead of -the ``dbapi``. Cubes adding new element to this stack are likely to break. - -Session data can be accessed using the cnx.data dictionary, while -transaction data is available through cnx.transaction_data. These -replace the [gs]et_shared_data methods with optional txid kwarg. - -New API in tests -~~~~~~~~~~~~~~~~ - -All current methods and attributes used to access the repo on ``CubicWebTC`` are -deprecated. You may now use a ``RepoAccess`` object. A ``RepoAccess`` object is -linked to a new ``Session`` for a specified user. It is able to create -``Connection``, ``ClientConnection`` and web side requests linked to this -session:: - - access = self.new_access('babar') # create a new RepoAccess for user babar - with access.repo_cnx() as cnx: - # some work with server side cnx - cnx.execute(...) - cnx.commit() - cnx.execute(...) - cnx.commit() - - with access.client_cnx() as cnx: - # some work with client side cnx - cnx.execute(...) - cnx.commit() - - with access.web_request(elephant='babar') as req: - # some work with client side cnx - elephant_name = req.form['elephant'] - req.execute(...) - req.cnx.commit() - -By default ``testcase.admin_access`` contains a ``RepoAccess`` object for the -default admin session. - - -API changes ------------ - -* ``RepositorySessionManager.postlogin`` is now called with two arguments, - request and session. And this now happens before the session is linked to the - request. - -* ``SessionManager`` and ``AuthenticationManager`` now take a repo object at - initialization time instead of a vreg. - -* The ``async`` argument of ``_cw.call_service`` has been dropped. All calls are - now synchronous. The zmq notification bus looks like a good replacement for - most async use cases. - -* ``repo.stats()`` is now deprecated. The same information is available through - a service (``_cw.call_service('repo_stats')``). - -* ``repo.gc_stats()`` is now deprecated. The same information is available through - a service (``_cw.call_service('repo_gc_stats')``). - -* ``repo.register_user()`` is now deprecated. The functionality is now - available through a service (``_cw.call_service('register_user')``). - -* ``request.set_session`` no longer takes an optional ``user`` argument. - -* CubicwebTC does not have repo and cnx as class attributes anymore. They are - standard instance attributes. ``set_cnx`` and ``_init_repo`` class methods - become instance methods. - -* ``set_cnxset`` and ``free_cnxset`` are deprecated. cnxset are now - automatically managed. - -* The implementation of cascading deletion when deleting `composite` - entities has changed. There comes a semantic change: merely deleting - a composite relation does not entail any more the deletion of the - component side of the relation. - -* ``_cw.user_callback`` and ``_cw.user_rql_callback`` are deprecated. Users - are encouraged to write an actual controller (e.g. using ``ajaxfunc``) - instead of storing a closure in the session data. - -* A new ``entity.cw_linkable_rql`` method provides the rql to fetch all entities - that are already or may be related to the current entity using the given - relation. - - -Deprecated Code Drops ----------------------- - -* session.hijack_user mechanism has been dropped. - -* EtypeRestrictionComponent has been removed, its functionality has been - replaced by facets a while ago. - -* the old multi-source support has been removed. Only copy-based sources - remain, such as datafeed or ldapfeed. - diff -r d4d36b583f40 -r a4fcee1e9789 doc/3.20.rst --- a/doc/3.20.rst Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -What's new in CubicWeb 3.20 -=========================== - -New features ------------- - -* virtual relations: a new ComputedRelation class can be used in - schema.py; its `rule` attribute is an RQL snippet that defines the new - relation. - -* computed attributes: an attribute can now be defined with a `formula` - argument (also an RQL snippet); it will be read-only, and updated - automatically. - - Both of these features are described in `CWEP-002`_, and the updated - "Data model" chapter of the CubicWeb book. - -* cubicweb-ctl plugins can use the ``cubicweb.utils.admincnx`` function - to get a Connection object from an instance name. - -* new 'tornado' wsgi backend - -* session cookies have the HttpOnly flag, so they're no longer exposed to - javascript - -* rich text fields can be formatted as markdown - -* the edit controller detects concurrent editions, and raises a ValidationError - if an entity was modified between form generation and submission - -* cubicweb can use a postgresql "schema" (namespace) for its tables - -* "cubicweb-ctl configure" can be used to set values of the admin user - credentials in the sources configuration file - -* in debug mode, setting the _cwtracehtml parameter on a request allows tracing - where each bit of output is produced - -.. _CWEP-002: http://hg.logilab.org/review/cwep/file/tip/CWEP-002.rst - - -API Changes ------------ - -* ``ucsvreader()`` and ``ucsvreader_pb()`` from the ``dataimport`` module have - 2 new keyword arguments ``delimiter`` and ``quotechar`` to replace the - ``separator`` and ``quote`` arguments respectively. This makes the API match - that of Python's ``csv.reader()``. The old arguments are still supported - though deprecated. - -* the migration environment's ``remove_cube`` function is now called ``drop_cube``. - -* cubicweb.old.css is now cubicweb.css. The previous "new" - cubicweb.css, along with its cubicweb.reset.css companion, have been - removed. - -* the jquery-treeview plugin was updated to its latest version - - -Deprecated Code Drops ----------------------- - -* most of 3.10 and 3.11 backward compat is gone; this includes: - - CtxComponent.box_action() and CtxComponent.build_link() - - cubicweb.devtools.htmlparser.XMLDemotingValidator - - various methods and properties on Entities, replaced by cw_edited and cw_attr_cache - - 'commit_event' method on hooks, replaced by 'postcommit_event' - - server.hook.set_operation(), replaced by Operation.get_instance(...).add_data() - - View.div_id(), View.div_class() and View.create_url() - - `*VComponent` classes - - in forms, Field.value() and Field.help() must take the form and the field itself as arguments - - form.render() must get `w` as a named argument, and renderer.render() must take `w` as first argument - - in breadcrumbs, the optional `recurs` argument must be a set, not False - - cubicweb.web.views.idownloadable.{download_box,IDownloadableLineView} - - primary views no longer have `render_entity_summary` and `summary` methods - - WFHistoryVComponent's `cell_call` method is replaced by `render_body` - - cubicweb.dataimport.ObjectStore.add(), replaced by create_entity - - ManageView.{folders,display_folders} diff -r d4d36b583f40 -r a4fcee1e9789 doc/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/Makefile Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,88 @@ +SRC=. + +# You can set these sphinx variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +#BUILDDIR = build +BUILDDIR = _build +CWDIR = .. +JSDIR = ${CWDIR}/web/data +JSTORST = tools/pyjsrest.py +BUILDJS = js_api + +# Internal variables for sphinx +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d ${BUILDDIR}/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + + + +.PHONY: help clean html web pickle htmlhelp latex changes linkcheck + +help: + @echo "Please use \`make ' where is one of" + @echo " all to make standalone HTML files, developer manual and API doc" + @echo " html to make standalone HTML files" + @echo "--- " + @echo " pickle to make pickle files (usable by e.g. sphinx-web)" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " changes to make an overview over all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + +clean: + rm -f *.html + -rm -rf ${BUILDDIR}/html ${BUILDDIR}/doctrees + -rm -rf ${BUILDJS} + +all: html + +# run sphinx ### +html: js + mkdir -p ${BUILDDIR}/html ${BUILDDIR}/doctrees + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) ${BUILDDIR}/html + @echo + @echo "Build finished. The HTML pages are in ${BUILDDIR}/html." + +js: + mkdir -p ${BUILDJS} + $(JSTORST) -p ${JSDIR} -o ${BUILDJS} + +pickle: + mkdir -p ${BUILDDIR}/pickle ${BUILDDIR}/doctrees + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) ${BUILDDIR}/pickle + @echo + @echo "Build finished; now you can process the pickle files or run" + @echo " sphinx-web ${BUILDDIR}/pickle" + @echo "to start the sphinx-web server." + +web: pickle + +htmlhelp: + mkdir -p ${BUILDDIR}/htmlhelp ${BUILDDIR}/doctrees + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) ${BUILDDIR}/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in ${BUILDDIR}/htmlhelp." + +latex: + mkdir -p ${BUILDDIR}/latex ${BUILDDIR}/doctrees + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) ${BUILDDIR}/latex + @echo + @echo "Build finished; the LaTeX files are in ${BUILDDIR}/latex." + @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ + "run these through (pdf)latex." + +changes: + mkdir -p ${BUILDDIR}/changes ${BUILDDIR}/doctrees + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) ${BUILDDIR}/changes + @echo + @echo "The overview file is in ${BUILDDIR}/changes." + +linkcheck: + mkdir -p ${BUILDDIR}/linkcheck ${BUILDDIR}/doctrees + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) ${BUILDDIR}/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in ${BUILDDIR}/linkcheck/output.txt." diff -r d4d36b583f40 -r a4fcee1e9789 doc/_static/cubicweb.png Binary file doc/_static/cubicweb.png has changed diff -r d4d36b583f40 -r a4fcee1e9789 doc/_static/logilab.png Binary file doc/_static/logilab.png has changed diff -r d4d36b583f40 -r a4fcee1e9789 doc/_static/sphinx-default.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/_static/sphinx-default.css Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,861 @@ +/** + * Sphinx Doc Design + */ + +html, body { + background: white; +} + +body { + font-family: Verdana, sans-serif; + font-size: 100%; + background-color: white; + color: black; + margin: 0; + padding: 0; +} + +/* :::: LAYOUT :::: */ + +div.logilablogo { + padding: 10px 10px 10px 10px; + height:75; +} + + +div.document { + background-color: white; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +div.body { + background-color: white; + padding: 0 20px 30px 20px; + border-left:solid; + border-left-color:#e2e2e2; + border-left-width:thin; +} + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; +} + +div.clearer { + clear: both; +} + +div.footer { + color: #ff4500; + width: 100%; + padding: 9px 0 9px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: #ff4500; + text-decoration: underline; +} + +div.related { + background-color: #ff7700; + color: white; + width: 100%; + height: 30px; + line-height: 30px; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +div.related a { + color: white; + font-weight:bold; +} + +/* ::: TOC :::: */ + +div.sphinxsidebar { + border-style:solid; + border-color: white; +/* background-color:#e2e2e2;*/ + padding-bottom:5px; +} + +div.sphinxsidebar h3 { + font-family: Verdana, sans-serif; + color: black; + font-size: 1.2em; + font-weight: normal; + margin: 0; + padding: 0; + font-weight:bold; + font-style:italic; +} + +div.sphinxsidebar h4 { + font-family: Verdana, sans-serif; + color: black; + font-size: 1.1em; + font-weight: normal; + margin: 5px 0 0 0; + padding: 0; + font-weight:bold; + font-style:italic; +} + +div.sphinxsidebar p { + color: black; +} + +div.sphinxsidebar p.topless { + margin: 5px 10px 10px 10px; +} + +div.sphinxsidebar ul { + margin: 10px; + padding: 0; + list-style: none; + color: black; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar a { + color: black; + text-decoration: none; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #e2e2e2; + font-family: sans-serif; + font-size: 1em; + padding-bottom: 5px; +} + +/* :::: MODULE CLOUD :::: */ +div.modulecloud { + margin: -5px 10px 5px 10px; + padding: 10px; + line-height: 160%; + border: 1px solid #cbe7e5; + background-color: #f2fbfd; +} + +div.modulecloud a { + padding: 0 5px 0 5px; +} + +/* :::: SEARCH :::: */ +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* :::: COMMON FORM STYLES :::: */ + +div.actions { + padding: 5px 10px 5px 10px; + border-top: 1px solid #cbe7e5; + border-bottom: 1px solid #cbe7e5; + background-color: #e0f6f4; +} + +form dl { + color: #333; +} + +form dt { + clear: both; + float: left; + min-width: 110px; + margin-right: 10px; + padding-top: 2px; +} + +input#homepage { + display: none; +} + +div.error { + margin: 5px 20px 0 0; + padding: 5px; + border: 1px solid #d00; + font-weight: bold; +} + +/* :::: INLINE COMMENTS :::: */ + +div.inlinecomments { + position: absolute; + right: 20px; +} + +div.inlinecomments a.bubble { + display: block; + float: right; + background-image: url(style/comment.png); + background-repeat: no-repeat; + width: 25px; + height: 25px; + text-align: center; + padding-top: 3px; + font-size: 0.9em; + line-height: 14px; + font-weight: bold; + color: black; +} + +div.inlinecomments a.bubble span { + display: none; +} + +div.inlinecomments a.emptybubble { + background-image: url(style/nocomment.png); +} + +div.inlinecomments a.bubble:hover { + background-image: url(style/hovercomment.png); + text-decoration: none; + color: #3ca0a4; +} + +div.inlinecomments div.comments { + float: right; + margin: 25px 5px 0 0; + max-width: 50em; + min-width: 30em; + border: 1px solid #2eabb0; + background-color: #f2fbfd; + z-index: 150; +} + +div#comments { + border: 1px solid #2eabb0; + margin-top: 20px; +} + +div#comments div.nocomments { + padding: 10px; + font-weight: bold; +} + +div.inlinecomments div.comments h3, +div#comments h3 { + margin: 0; + padding: 0; + background-color: #2eabb0; + color: white; + border: none; + padding: 3px; +} + +div.inlinecomments div.comments div.actions { + padding: 4px; + margin: 0; + border-top: none; +} + +div#comments div.comment { + margin: 10px; + border: 1px solid #2eabb0; +} + +div.inlinecomments div.comment h4, +div.commentwindow div.comment h4, +div#comments div.comment h4 { + margin: 10px 0 0 0; + background-color: #2eabb0; + color: white; + border: none; + padding: 1px 4px 1px 4px; +} + +div#comments div.comment h4 { + margin: 0; +} + +div#comments div.comment h4 a { + color: #d5f4f4; +} + +div.inlinecomments div.comment div.text, +div.commentwindow div.comment div.text, +div#comments div.comment div.text { + margin: -5px 0 -5px 0; + padding: 0 10px 0 10px; +} + +div.inlinecomments div.comment div.meta, +div.commentwindow div.comment div.meta, +div#comments div.comment div.meta { + text-align: right; + padding: 2px 10px 2px 0; + font-size: 95%; + color: #538893; + border-top: 1px solid #cbe7e5; + background-color: #e0f6f4; +} + +div.commentwindow { + position: absolute; + width: 500px; + border: 1px solid #cbe7e5; + background-color: #f2fbfd; + display: none; + z-index: 130; +} + +div.commentwindow h3 { + margin: 0; + background-color: #2eabb0; + color: white; + border: none; + padding: 5px; + font-size: 1.5em; + cursor: pointer; +} + +div.commentwindow div.actions { + margin: 10px -10px 0 -10px; + padding: 4px 10px 4px 10px; + color: #538893; +} + +div.commentwindow div.actions input { + border: 1px solid #2eabb0; + background-color: white; + color: #135355; + cursor: pointer; +} + +div.commentwindow div.form { + padding: 0 10px 0 10px; +} + +div.commentwindow div.form input, +div.commentwindow div.form textarea { + border: 1px solid #3c9ea2; + background-color: white; + color: black; +} + +div.commentwindow div.error { + margin: 10px 5px 10px 5px; + background-color: #fbe5dc; + display: none; +} + +div.commentwindow div.form textarea { + width: 99%; +} + +div.commentwindow div.preview { + margin: 10px 0 10px 0; + background-color: #70d0d4; + padding: 0 1px 1px 25px; +} + +div.commentwindow div.preview h4 { + margin: 0 0 -5px -20px; + padding: 4px 0 0 4px; + color: white; + font-size: 1.3em; +} + +div.commentwindow div.preview div.comment { + background-color: #f2fbfd; +} + +div.commentwindow div.preview div.comment h4 { + margin: 10px 0 0 0!important; + padding: 1px 4px 1px 4px!important; + font-size: 1.2em; +} + +/* :::: SUGGEST CHANGES :::: */ +div#suggest-changes-box input, div#suggest-changes-box textarea { + border: 1px solid #ccc; + background-color: white; + color: black; +} + +div#suggest-changes-box textarea { + width: 99%; + height: 400px; +} + + +/* :::: PREVIEW :::: */ +div.preview { + background-image: url(style/preview.png); + padding: 0 20px 20px 20px; + margin-bottom: 30px; +} + + +/* :::: INDEX PAGE :::: */ + +table.contentstable { + width: 90%; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* :::: INDEX STYLES :::: */ + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable dl, table.indextable dd { + margin-top: 0; + margin-bottom: 0; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +form.pfform { + margin: 10px 0 20px 0; +} + +/* :::: GLOBAL STYLES :::: */ + +.docwarning { + background-color: #ffe4e4; + padding: 10px; + margin: 0 -20px 0 -20px; + border-bottom: 1px solid #f66; +} + +p.subhead { + font-weight: bold; + margin-top: 20px; +} + +a { + color: orangered; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Verdana', sans-serif; + background-color: white; + font-weight: bold; + color: black; + border-bottom: 1px solid #ccc; + margin: 20px -20px 10px -20px; + padding: 3px 0 3px 10px; +} + +div.body h1 { margin-top: 10pt; font-size: 150%; } +div.body h2 { font-size: 120%; } +div.body h3 { font-size: 100%; } +div.body h4 { font-size: 80%; } +div.body h5 { font-size: 600%; } +div.body h6 { font-size: 40%; } + +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink { + visibility: visible; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +div.body p, div.body dd, div.body li { + text-align: justify; + line-height: 130%; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +ul.fakelist { + list-style: none; + margin: 10px 0 10px 20px; + padding: 0; +} + +.field-list ul { + padding-left: 1em; +} + +.first { + margin-top: 0 !important; +} + +/* "Footnotes" heading */ +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +/* "Topics" */ + +div.topic { + background-color: #eee; + border: 1px solid #ccc; + padding: 0 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* Admonitions */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dl { + margin-bottom: 0; +} + +div.admonition p { + display: inline; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +table.docutils { + border: 0; +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 0; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.field-list td, table.field-list th { + border: 0 !important; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +dl { + margin-bottom: 15px; + clear: both; +} + +dd p { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.refcount { + color: #060; +} + +dt:target, +.highlight { + background-color: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +th { + text-align: left; + padding-right: 5px; +} + +pre { + padding: 5px; + background-color: #efc; + color: #333; + border: 1px solid #ac9; + border-left: none; + border-right: none; + overflow: auto; +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +tt { + background-color: #ecf0f3; + padding: 0 1px 0 1px; + font-size: 0.95em; +} + +tt.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +tt.descclassname { + background-color: transparent; +} + +tt.xref, a tt { + background-color: transparent; + font-weight: bold; +} + +.footnote:target { background-color: #ffa } + +h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.versionmodified { + font-style: italic; +} + +form.comment { + margin: 0; + padding: 10px 30px 10px 30px; + background-color: #eee; +} + +form.comment h3 { + background-color: #326591; + color: white; + margin: -10px -30px 10px -30px; + padding: 5px; + font-size: 1.4em; +} + +form.comment input, +form.comment textarea { + border: 1px solid #ccc; + padding: 2px; + font-family: sans-serif; + font-size: 100%; +} + +form.comment input[type="text"] { + width: 240px; +} + +form.comment textarea { + width: 100%; + height: 200px; + margin-bottom: 10px; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +/* :::: PRINT :::: */ +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0; + width : 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + div#comments div.new-comment-box, + #top-link { + display: none; + } +} diff -r d4d36b583f40 -r a4fcee1e9789 doc/_templates/layout.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/_templates/layout.html Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,196 @@ +{%- block doctype -%} + +{%- endblock %} +{%- set reldelim1 = reldelim1 is not defined and ' »' or reldelim1 %} +{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %} +{%- macro relbar() %} + +{%- endmacro %} +{%- macro sidebar() %} + {%- if builder != 'htmlhelp' %} +
        +
        + {%- block sidebarlogo %} + {%- if logo %} + + {%- endif %} + {%- endblock %} + {%- block sidebartoc %} + {%- if display_toc %} +

        Table Of Contents

        + {{ toc }} + {%- endif %} + {%- endblock %} + {%- block sidebarrel %} + {%- if prev %} +

        Previous topic

        +

        {{ prev.title }}

        + {%- endif %} + {%- if next %} +

        Next topic

        +

        {{ next.title }}

        + {%- endif %} + {%- endblock %} + {%- if sourcename %} + + {%- endif %} + {%- if customsidebar %} + {{ rendertemplate(customsidebar) }} + {%- endif %} + {%- block sidebarsearch %} + {%- if pagename != "search" %} +

        {{ builder == 'web' and 'Keyword' or 'Quick' }} search

        + + {%- if builder == 'web' %} +

        Enter a module, class or function name.

        + {%- endif %} + {%- endif %} + {%- endblock %} +
        +
        + {%- endif %} +{%- endmacro -%} + + + + + {%- if builder != 'htmlhelp' %} + {%- set titlesuffix = " — " + docstitle %} + {%- endif %} + {{ title|striptags }}{{ titlesuffix }} + {%- if builder == 'web' %} + + {%- for link, type, title in page_links %} + + {%- endfor %} + {%- else %} + + + {%- endif %} + {%- if builder != 'htmlhelp' %} + + + + + + {%- if use_opensearch %} + + {%- endif %} + {%- if favicon %} + + {%- endif %} + {%- endif %} +{%- block rellinks %} + {%- if hasdoc('about') %} + + {%- endif %} + + + + {%- if hasdoc('copyright') %} + + {%- endif %} + + {%- if parents %} + + {%- endif %} + {%- if next %} + + {%- endif %} + {%- if prev %} + + {%- endif %} +{%- endblock %} +{%- block extrahead %}{% endblock %} + + + +{% block logilablogo %} + +{% endblock %} + +{%- block relbar1 %}{{ relbar() }}{% endblock %} + +{%- block sidebar1 %}{# possible location for sidebar #}{% endblock %} + +{%- block document %} +
        +
        + {%- if builder != 'htmlhelp' %} +
        + {%- endif %} +
        + {% block body %}{% endblock %} +
        + {%- if builder != 'htmlhelp' %} +
        + {%- endif %} +
        +{%- endblock %} + +{%- block sidebar2 %}{{ sidebar() }}{% endblock %} +
        +
        + +{%- block relbar2 %}{{ relbar() }}{% endblock %} + +{%- block footer %} + +{%- endblock %} + + diff -r d4d36b583f40 -r a4fcee1e9789 doc/_themes/cubicweb/layout.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/_themes/cubicweb/layout.html Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,61 @@ +{% extends "basic/layout.html" %} + +{%- block extrahead %} + +{%- if theme_favicon %} + +{%- endif %} + +{%- if theme_canonical_url %} + +{%- endif %} +{% endblock %} + +{% block header %} + +{% if theme_in_progress|tobool %} + Documentation in progress +{% endif %} + +{% if theme_outdated|tobool %} + +{% endif %} + +
        + {%- if theme_logo %} + {% set img, ext = theme_logo.split('.', -1) %} +
        + + + +
        + {%- endif %} +
        +{% endblock %} + +{%- macro relbar() %} + +{%- endmacro %} + +{%- block sidebarlogo %}{%- endblock %} +{%- block sidebarsourcelink %}{%- endblock %} diff -r d4d36b583f40 -r a4fcee1e9789 doc/_themes/cubicweb/static/cubicweb.css_t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/_themes/cubicweb/static/cubicweb.css_t Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,33 @@ +/* + * cubicweb.css_t + * ~~~~~~~~~~~~~~ + * + * Sphinx stylesheet -- cubicweb theme. + * + * :copyright: Copyright 2014 by the Cubicweb team, see AUTHORS. + * :license: LGPL, see LICENSE for details. + * + */ + +@import url("pyramid.css"); + +div.header-small { + background-image: linear-gradient(white, #e2e2e2); + border-bottom: 1px solid #bbb; +} + +div.logo-small { + padding: 10px; +} + +img.logo { + width: 150px; +} + +div.related a { + color: #e6820e; +} + +a, a .pre { + color: #e6820e; +} diff -r d4d36b583f40 -r a4fcee1e9789 doc/_themes/cubicweb/static/cubicweb.ico --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/_themes/cubicweb/static/cubicweb.ico Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,1 @@ +../../../../web/data/favicon.ico \ No newline at end of file diff -r d4d36b583f40 -r a4fcee1e9789 doc/_themes/cubicweb/static/logo-cubicweb-small.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/_themes/cubicweb/static/logo-cubicweb-small.svg Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,1 @@ +logo-cubicweb.svg \ No newline at end of file diff -r d4d36b583f40 -r a4fcee1e9789 doc/_themes/cubicweb/static/logo-cubicweb.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/_themes/cubicweb/static/logo-cubicweb.svg Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,1 @@ +../../../../web/data/logo-cubicweb.svg \ No newline at end of file diff -r d4d36b583f40 -r a4fcee1e9789 doc/_themes/cubicweb/theme.conf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/_themes/cubicweb/theme.conf Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,12 @@ +[theme] +inherit = pyramid +pygments_style = sphinx.pygments_styles.PyramidStyle +stylesheet = cubicweb.css + + +[options] +logo = logo-cubicweb.svg +favicon = cubicweb.ico +in_progress = false +outdated = false +canonical_url = diff -r d4d36b583f40 -r a4fcee1e9789 doc/api/__init__.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/api/__init__.rst Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,115 @@ +.. _index_module: + +:mod:`cubicweb` +=============== + +.. automodule:: cubicweb + + Exceptions + ---------- + + Base exceptions + ~~~~~~~~~~~~~~~ + + .. autoexception:: ProgrammingError + :show-inheritance: + + .. autoexception:: CubicWebException + :show-inheritance: + + .. autoexception:: InternalError + :show-inheritance: + + .. autoexception:: SecurityError + :show-inheritance: + + .. autoexception:: RepositoryError + :show-inheritance: + + .. autoexception:: SourceException + :show-inheritance: + + .. autoexception:: CubicWebRuntimeError + :show-inheritance: + + Repository exceptions + ~~~~~~~~~~~~~~~~~~~~~ + + .. autoexception:: ConnectionError + :show-inheritance: + + .. autoexception:: AuthenticationError + :show-inheritance: + + .. autoexception:: BadConnectionId + :show-inheritance: + + .. autoexception:: UnknownEid + :show-inheritance: + + .. autoexception:: UniqueTogetherError + :show-inheritance: + + Security Exceptions + ~~~~~~~~~~~~~~~~~~~ + + .. autoexception:: Unauthorized + :show-inheritance: + + .. autoexception:: Forbidden + :show-inheritance: + + Source exceptions + ~~~~~~~~~~~~~~~~~ + + .. autoexception:: EidNotInSource + :show-inheritance: + + Registry exceptions + ~~~~~~~~~~~~~~~~~~~ + + .. autoexception:: UnknownProperty + :show-inheritance: + + Query exceptions + ~~~~~~~~~~~~~~~~ + + .. autoexception:: QueryError + :show-inheritance: + + .. autoexception:: NotAnEntity + :show-inheritance: + + .. autoexception:: MultipleResultsError + :show-inheritance: + + .. autoexception:: NoResultError + :show-inheritance: + + .. autoexception:: UndoTransactionException + :show-inheritance: + + + Misc + ~~~~ + + .. autoexception:: ConfigurationError + :show-inheritance: + + .. autoexception:: ExecutionError + :show-inheritance: + + .. autoexception:: BadCommandUsage + :show-inheritance: + + .. autoexception:: ValidationError + :show-inheritance: + + + Utilities + --------- + + .. autoclass:: Binary + .. autoclass:: CubicWebEventManager + .. autofunction:: onevent + .. autofunction:: validation_error diff -r d4d36b583f40 -r a4fcee1e9789 doc/api/appobject.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/api/appobject.rst Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,10 @@ +.. _appobject_module: + +:mod:`cubicweb.appobject` +========================= + +.. automodule:: cubicweb.appobject + + .. autoclass:: AppObject + :show-inheritance: + :members: diff -r d4d36b583f40 -r a4fcee1e9789 doc/api/cwvreg.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/api/cwvreg.rst Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,45 @@ +.. _cwvreg_module: + +:mod:`cubicweb.cwvreg` +====================== + +.. automodule:: cubicweb.cwvreg + + .. autoclass:: CWRegistryStore + :show-inheritance: + :members: + :undoc-members: + + .. autoclass:: CWRegistry + :show-inheritance: + :members: schema, poss_visible_objects, select + + .. autoclass:: InstancesRegistry + :show-inheritance: + :members: + + .. autoclass:: ETypeRegistry + :show-inheritance: + :members: + + .. autoclass:: ViewsRegistry + :show-inheritance: + :members: + + .. autoclass:: ActionsRegistry + :show-inheritance: + :members: + + .. autoclass:: CtxComponentsRegistry + :show-inheritance: + :members: + + .. autoclass:: BwCompatCWRegistry + :show-inheritance: + :members: + + +:mod:`logilab.common.registry` +============================== + +.. automodule:: logilab.common.registry diff -r d4d36b583f40 -r a4fcee1e9789 doc/api/dataimport.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/api/dataimport.rst Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,63 @@ +.. _dataimport_module: + +:mod:`cubicweb.dataimport` +========================== + +.. automodule:: cubicweb.dataimport + + Utilities + --------- + + .. autofunction:: count_lines + + .. autofunction:: ucsvreader_pb + + .. autofunction:: ucsvreader + + .. autofunction:: callfunc_every + + .. autofunction:: lazytable + + .. autofunction:: lazydbtable + + .. autofunction:: mk_entity + + Sanitizing/coercing functions + ----------------------------- + + .. autofunction:: optional + .. autofunction:: required + .. autofunction:: todatetime + .. autofunction:: call_transform_method + .. autofunction:: call_check_method + + Integrity functions + ------------------- + + .. autofunction:: check_doubles + .. autofunction:: check_doubles_not_none + + Object Stores + ------------- + + .. autoclass:: ObjectStore + :members: + + .. autoclass:: RQLObjectStore + :show-inheritance: + :members: + + .. autoclass:: NoHookRQLObjectStore + :show-inheritance: + :members: + + .. autoclass:: SQLGenObjectStore + :show-inheritance: + :members: + + Import Controller + ----------------- + + .. autoclass:: CWImportController + :show-inheritance: + :members: diff -r d4d36b583f40 -r a4fcee1e9789 doc/api/predicates.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/api/predicates.rst Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,57 @@ +.. _predicates_module: + +:mod:`cubicweb.predicates` +========================== + +.. automodule:: cubicweb.predicates + + .. autoclass:: cubicweb.appobject.yes + .. autoclass:: cubicweb.predicates.match_kwargs + .. autoclass:: cubicweb.predicates.appobject_selectable + .. autoclass:: cubicweb.predicates.adaptable + .. autoclass:: cubicweb.predicates.configuration_values + + .. autoclass:: cubicweb.predicates.none_rset + .. autoclass:: cubicweb.predicates.any_rset + .. autoclass:: cubicweb.predicates.nonempty_rset + .. autoclass:: cubicweb.predicates.empty_rset + .. autoclass:: cubicweb.predicates.one_line_rset + .. autoclass:: cubicweb.predicates.multi_lines_rset + .. autoclass:: cubicweb.predicates.multi_columns_rset + .. autoclass:: cubicweb.predicates.paginated_rset + .. autoclass:: cubicweb.predicates.sorted_rset + .. autoclass:: cubicweb.predicates.one_etype_rset + .. autoclass:: cubicweb.predicates.multi_etypes_rset + + .. autoclass:: cubicweb.predicates.non_final_entity + .. autoclass:: cubicweb.predicates.is_instance + .. autoclass:: cubicweb.predicates.score_entity + .. autoclass:: cubicweb.predicates.rql_condition + .. autoclass:: cubicweb.predicates.relation_possible + .. autoclass:: cubicweb.predicates.partial_relation_possible + .. autoclass:: cubicweb.predicates.has_related_entities + .. autoclass:: cubicweb.predicates.partial_has_related_entities + .. autoclass:: cubicweb.predicates.has_permission + .. autoclass:: cubicweb.predicates.has_add_permission + .. autoclass:: cubicweb.predicates.has_mimetype + .. autoclass:: cubicweb.predicates.is_in_state + .. autofunction:: cubicweb.predicates.on_fire_transition + + .. autoclass:: cubicweb.predicates.match_user_groups + + .. autoclass:: cubicweb.predicates.no_cnx + .. autoclass:: cubicweb.predicates.anonymous_user + .. autoclass:: cubicweb.predicates.authenticated_user + .. autoclass:: cubicweb.predicates.match_form_params + .. autoclass:: cubicweb.predicates.match_search_state + .. autoclass:: cubicweb.predicates.match_context_prop + .. autoclass:: cubicweb.predicates.match_context + .. autoclass:: cubicweb.predicates.match_view + .. autoclass:: cubicweb.predicates.primary_view + .. autoclass:: cubicweb.predicates.contextual + .. autoclass:: cubicweb.predicates.specified_etype_implements + .. autoclass:: cubicweb.predicates.attribute_edited + .. autoclass:: cubicweb.predicates.match_transition + + .. autoclass:: cubicweb.predicates.match_exception + .. autoclass:: cubicweb.predicates.debug_mode diff -r d4d36b583f40 -r a4fcee1e9789 doc/api/req.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/api/req.rst Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,11 @@ +.. _req_module: + +:mod:`cubicweb.req` +=================== + +.. automodule:: cubicweb.req + + .. autoexception:: FindEntityError + + .. autoclass:: RequestSessionBase + :members: diff -r d4d36b583f40 -r a4fcee1e9789 doc/api/rset.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/api/rset.rst Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,10 @@ +.. _rset_module: + +:mod:`cubicweb.rset` +==================== + +.. automodule:: cubicweb.rset + + .. autoclass:: ResultSet + :members: + diff -r d4d36b583f40 -r a4fcee1e9789 doc/api/urlpublishing.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/api/urlpublishing.rst Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,36 @@ +.. _urlpublishing_module: + +:mod:`cubicweb.web.views.urlpublishing` +======================================= + +.. automodule:: cubicweb.web.views.urlpublishing + + .. autoexception:: PathDontMatch + + .. autoclass:: URLPublisherComponent + :show-inheritance: + :members: + + .. autoclass:: URLPathEvaluator + :show-inheritance: + :members: + + .. autoclass:: RawPathEvaluator + :show-inheritance: + :members: + + .. autoclass:: EidPathEvaluator + :show-inheritance: + :members: + + .. autoclass:: RestPathEvaluator + :show-inheritance: + :members: + + .. autoclass:: URLRewriteEvaluator + :show-inheritance: + :members: + + .. autoclass:: ActionPathEvaluator + :show-inheritance: + :members: diff -r d4d36b583f40 -r a4fcee1e9789 doc/api/urlrewrite.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/api/urlrewrite.rst Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,18 @@ +.. _urlrewrite_module: + +:mod:`cubicweb.web.views.urlrewrite` +======================================= + +.. automodule:: cubicweb.web.views.urlrewrite + + .. autoclass:: URLRewriter + :show-inheritance: + :members: + + .. autoclass:: SimpleReqRewriter + :show-inheritance: + :members: + + .. autoclass:: SchemaBasedRewriter + :show-inheritance: + :members: diff -r d4d36b583f40 -r a4fcee1e9789 doc/api/web.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/api/web.rst Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,21 @@ +.. _web_module: + +:mod:`cubicweb.web` +=================== + +.. automodule:: cubicweb.web + + Exceptions + ---------- + + .. autoexception:: DirectResponse + .. autoexception:: InvalidSession + .. autoexception:: PublishException + .. autoexception:: LogOut + .. autoexception:: Redirect + .. autoexception:: StatusResponse + .. autoexception:: RequestError + .. autoexception:: NothingToEdit + .. autoexception:: ProcessFormError + .. autoexception:: NotFound + .. autoexception:: RemoteCallFailed diff -r d4d36b583f40 -r a4fcee1e9789 doc/book/MERGE_ME-tut-create-app.en.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/book/MERGE_ME-tut-create-app.en.txt Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,386 @@ +.. -*- coding: utf-8 -*- + + +Tutoriel : créer votre première application web pour Google AppEngine +===================================================================== + +[TRANSLATE ME TO FRENCH] + +This tutorial will guide you step by step to build a blog application +and discover the unique features of `LAX`. It assumes that you followed +the :ref:`installation` guidelines and that both the `AppEngine SDK` and the +`LAX` framework are setup on your computer. + +Creating a new application +-------------------------- + +We choosed in this tutorial to develop a blog as an example of web application +and will go through each required steps/actions to have it running with `LAX`. +When you installed `LAX`, you saw a directory named ``skel``. Make a copy of +this directory and call it ``BlogDemo``. + +The location of this directory does not matter. But once decided, make sure your ``PYTHONPATH`` is properly set (:ref:`installation`). + + +Defining a schema +----------------- + +With `LAX`, the schema/datamodel is the core of the application. This is where +you will define the type of content you have to hanlde in your application. + +Let us start with something simple and improve on it iteratively. + +In schema.py, we define two entities: ``Blog`` and ``BlogEntry``. + +:: + + class Blog(EntityType): + title = String(maxsize=50, required=True) + description = String() + + class BlogEntry(EntityType): + title = String(maxsize=100, required=True) + publish_date = Date(default='TODAY') + text = String(fulltextindexed=True) + category = String(vocabulary=('important','business')) + entry_of = SubjectRelation('Blog', cardinality='?*') + +A Blog has a title and a description. The title is a string that is +required by the class EntityType and must be less than 50 characters. +The description is a string that is not constrained. + +A BlogEntry has a title, a publish_date and a text. The title is a +string that is required and must be less than 100 characters. The +publish_date is a Date with a default value of TODAY, meaning that +when a BlogEntry is created, its publish_date will be the current day +unless it is modified. The text is a string that will be indexed in +the full-text index and has no constraint. + +A BlogEntry also has a relationship ``entry_of`` that link it to a +Blog. The cardinality ``?*`` means that a BlogEntry can be part of +zero or one Blog (``?`` means `zero or one`) and that a Blog can +have any number of BlogEntry (``*`` means `any number including +zero`). For completeness, remember that ``+`` means `one or more`. + +Running the application +----------------------- + +Defining this simple schema is enough to get us started. Make sure you +followed the setup steps described in detail in the installation +chapter (especially visiting http://localhost:8080/_load as an +administrator), then launch the application with the command:: + + python dev_appserver.py BlogDemo + +and point your browser at http://localhost:8080/ (if it is easier for +you, use the on-line demo at http://lax.appspot.com/). + +.. image:: images/lax-book.00-login.en.png + :alt: login screen + +After you log in, you will see the home page of your application. It +lists the entity types: Blog and BlogEntry. If these links read +``blog_plural`` and ``blogentry_plural`` it is because +internationalization (i18n) is not working for you yet. Please ignore +this for now. + +.. image:: images/lax-book.01-start.en.png + :alt: home page + +Creating system entities +------------------------ +You can only create new users if you decided not to use google authentication. + + +[WRITE ME : create users manages permissions etc] + + + +Creating application entites +---------------------------- + +Create a Blog +~~~~~~~~~~~~~ + +Let us create a few of these entities. Click on the [+] at the right +of the link Blog. Call this new Blog ``Tech-blog`` and type in +``everything about technology`` as the description, then validate the +form by clicking on ``Validate``. + +.. image:: images/lax-book.02-create-blog.en.png + :alt: from to create blog + +Click on the logo at top left to get back to the home page, then +follow the Blog link that will list for you all the existing Blog. +You should be seeing a list with a single item ``Tech-blog`` you +just created. + +.. image:: images/lax-book.03-list-one-blog.en.png + :alt: displaying a list of a single blog + +Clicking on this item will get you to its detailed description except +that in this case, there is not much to display besides the name and +the phrase ``everything about technology``. + +.. image:: images/lax-book.04-detail-one-blog.en.png + :alt: displaying the detailed view of a blog + +Now get back to the home page by clicking on the top-left logo, then +create a new Blog called ``MyLife`` and get back to the home page +again to follow the Blog link for the second time. The list now +has two items. + +.. image:: images/lax-book.05-list-two-blog.en.png + :alt: displaying a list of two blogs + + +Create a BlogEntry +~~~~~~~~~~~~~~~~~~ + +Get back to the home page and click on [+] at the right of the link +BlogEntry. Call this new entry ``Hello World`` and type in some text +before clicking on ``Validate``. You added a new blog entry without +saying to what blog it belongs. There is a box on the left entitled +``actions``, click on the menu item ``modify``. You are back to the form +to edit the blog entry you just created, except that the form now has +another section with a combobox titled ``add relation``. Chose +``entry_of`` in this menu and a second combobox appears where you pick +``MyLife``. + +You could also have, at the time you started to fill the form for a +new entity BlogEntry, hit ``Apply`` instead of ``Validate`` and the +combobox titled ``add relation`` would have showed up. + +.. image:: images/lax-book.06-add-relation-entryof.en.png + :alt: editing a blog entry to add a relation to a blog + +Validate the changes by clicking ``Validate``. The entity BlogEntry +that is displayed now includes a link to the entity Blog named +``MyLife``. + +.. image:: images/lax-book.07-detail-one-blogentry.en.png + :alt: displaying the detailed view of a blogentry + +Remember that all of this was handled by the framework and that the +only input that was provided so far is the schema. To get a graphical +view of the schema, run the ``laxctl genschema BlogDemo`` command as +explained in the installation section and point your browser to the +URL http://localhost:8080/schema + +.. image:: images/lax-book.08-schema.en.png + :alt: graphical view of the schema (aka data-model) + +Site configuration +------------------ + +.. image:: images/lax-book.03-site-config-panel.en.png + +This panel allows you to configure the appearance of your application site. +Six menus are available and we will go through each of them to explain how +to use them. + +Navigation +~~~~~~~~~~ +This menu provides you a way to adjust some navigation options depending on +your needs, such as the number of entities to display by page of results. +Follows the detailled list of available options: + +* navigation.combobox-limit: maximum number of entities to display in related + combo box (sample format: 23) +* navigation.page-size: maximum number of objects displayed by page of results + (sample format: 23) +* navigation.related-limit: maximum number of related entities to display in + the primary view (sample format: 23) +* navigation.short-line-size: maximum number of characters in short description + (sample format: 23) + +UI +~~ +This menu provides you a way to customize the user interface settings such as +date format or encoding in the produced html. +Follows the detailled list of available options: + +* ui.date-format : how to format date in the ui ("man strftime" for format description) +* ui.datetime-format : how to format date and time in the ui ("man strftime" for format + description) +* ui.default-text-format : default text format for rich text fields. +* ui.encoding : user interface encoding +* ui.fckeditor : should html fields being edited using fckeditor (a HTML WYSIWYG editor). + You should also select text/html as default text format to actually get fckeditor. +* ui.float-format : how to format float numbers in the ui +* ui.language : language of the user interface +* ui.main-template : id of main template used to render pages +* ui.site-title : site title, which is displayed right next to the logo in the header +* ui.time-format : how to format time in the ui ("man strftime" for format description) + + +Actions +~~~~~~~ +This menu provides a way to configure the context in which you expect the actions +to be displayed to the user and if you want the action to be visible or not. +You must have notice that when you view a list of entities, an action box is +available on the left column which display some actions as well as a drop-down +menu for more actions. + +The context available are: + +* mainactions : actions listed in the left box +* moreactions : actions listed in the `more` menu of the left box +* addrelated : add actions listed in the left box +* useractions : actions listed in the first section of drop-down menu + accessible from the right corner user login link +* siteactions : actions listed in the second section of drop-down menu + accessible from the right corner user login link +* hidden : select this to hide the specific action + +Boxes +~~~~~ +The application has already a pre-defined set of boxes you can use right away. +This configuration section allows you to place those boxes where you want in the +application interface to customize it. + +The available boxes are: + +* actions box : box listing the applicable actions on the displayed data + +* boxes_blog_archives_box : box listing the blog archives + +* possible views box : box listing the possible views for the displayed data + +* rss box : RSS icon to get displayed data as a RSS thread + +* search box : search box + +* startup views box : box listing the configuration options available for + the application site, such as `Preferences` and `Site Configuration` + +Components +~~~~~~~~~~ +[WRITE ME] + +Contextual components +~~~~~~~~~~~~~~~~~~~~~ +[WRITE ME] + +Set-up a workflow +----------------- + +Before starting, make sure you refresh your mind by reading [link to +definition_workflow chapter]. + +We want to create a workflow to control the quality of the BlogEntry +submitted on your application. When a BlogEntry is created by a user +its state should be `submitted`. To be visible to all, it needs to +be in the state `published`. To move from `submitted` to `published` +we need a transition that we can name `approve_blogentry`. + +We do not want every user to be allowed to change the state of a +BlogEntry. We need to define a group of user, `moderators`, and +this group will have appropriate permissions to approve BlogEntry +to be published and visible to all. + +There are two ways to create a workflow, form the user interface, +and also by defining it in ``migration/postcreate.py``. This script +is executed each time a new ``./bin/laxctl db-init`` is done. +If you create the states and transitions through the user interface +this means that next time you will need to initialize the database +you will have to re-create all the entities. +We strongly recommand you create the workflow in ``migration\postcreate.py`` +and we will now show you how. +The user interface would only be a reference for you to view the states +and transitions but is not the appropriate interface to define your +application workflow. + +Update the schema +~~~~~~~~~~~~~~~~~ +To enable a BlogEntry to have a State, we have to define a relation +``in_state`` in the schema of BlogEntry. Please do as follows, add +the line ``in_state (...)``:: + + class BlogEntry(EntityType): + title = String(maxsize=100, required=True) + publish_date = Date(default='TODAY') + text_format = String(meta=True, internationalizable=True, maxsize=50, + default='text/rest', constraints=[format_constraint]) + text = String(fulltextindexed=True) + category = String(vocabulary=('important','business')) + entry_of = SubjectRelation('Blog', cardinality='?*') + in_state = SubjectRelation('State', cardinality='1*') + +As you updated the schema, you will have re-execute ``./bin/laxctl db-init`` +to initialize the database and migrate your existing entities. +[WRITE ABOUT MIGRATION] + +Create states, transitions and group permissions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +At the time the ``postcreate.py`` script is executed, several methods +can be used. They are all defined in the ``class ServerMigrationHelper``. +We will only discuss the method we use to create a wrokflow here. + +To define our workflow for BlogDemo, please add the following lines +to ``migration/postcreate.py``:: + + _ = unicode + + moderators = add_entity('CWGroup', name=u"moderators") + + submitted = add_state(_('submitted'), 'BlogEntry', initial=True) + published = add_state(_('published'), 'BlogEntry') + + add_transition(_('approve_blogentry'), 'BlogEntry', (submitted,), published, ('moderators', 'managers'),) + + checkpoint() + +``add_entity`` is used here to define the new group of users that we +need to define the transitions, `moderators`. +If this group required by the transition is not defined before the +transition is created, it will not create the relation `transition +require the group moderator`. + +``add_state`` expects as the first argument the name of the state you are +willing to create, then the entity type on which the state can be applied, +and an optionnal argument to set if the state is the initial state +of the entity type or not. + +``add_transition`` expects as the first argument the name of the +transition, then the entity type on which we can apply the transition, +then the list of possible initial states from which the transition +can be applied, the target state of the transition, and the permissions +(e.g. list of the groups of users who can apply the transition). + +.. image:: images/lax-book.03-transitions-view.en.png + +You can now notice that in the actions box of a BlogEntry, the state +is now listed as well as the possible transitions from this state +defined by the workflow. This transition, as defined in the workflow, +will only being displayed for the users belonging to the group +moderators of managers. + +Change view permission +~~~~~~~~~~~~~~~~~~~~~~ + + + +Conclusion +---------- + +Exercise +~~~~~~~~ + +Create new blog entries in ``Tech-blog``. + +What we learned +~~~~~~~~~~~~~~~ + +Creating a simple schema was enough to set up a new application that +can store blogs and blog entries. + +What is next ? +~~~~~~~~~~~~~~ + +Although the application is fully functionnal, its look is very +basic. In the following section we will learn to create views to +customize how data is displayed. + + diff -r d4d36b583f40 -r a4fcee1e9789 doc/book/MERGE_ME-tut-create-gae-app.en.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/book/MERGE_ME-tut-create-gae-app.en.txt Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,218 @@ +.. -*- coding: utf-8 -*- + +.. _tutorielGAE: + +Tutoriel : créer votre première application web pour Google AppEngine +===================================================================== + +Ce tutoriel va vous guider pas à pas a construire une apllication web +de gestion de Blog afin de vous faire découvrir les fonctionnalités de +*CubicWeb*. + +Nous supposons que vous avec déjà suivi le guide :ref:`installationGAE`. + + +Créez une nouvelle application +------------------------------ + +Nous choisissons dans ce tutoriel de développer un blog comme un exemple +d'application web et nous allons expliciter toutes les étapes nécessaires +à sa réalisation. + +:: + + cubicweb-ctl newgapp blogdemo + +`newgapp` est la commande permettant de créer une instance *CubicWeb* pour +le datastore. + +Assurez-vous que votre variable d'environnement ``PYTHONPATH`` est correctement +initialisée (:ref:`installationGAE`) + +Définissez un schéma +-------------------- + +Le modèle de données ou schéma est au coeur d'une application *CubicWeb*. +C'est là où vous allez devoir définir le type de contenu que votre application +devra gérer. + +Commençons par un schéma simple que nous améliorerons progressivemment. + +Une fois votre instance ``blogdemo`` crée, vous trouverez un fichier ``schema.py`` +contenant la définition des entités suivantes : ``Blog`` and ``BlogEntry``. + +:: + + class Blog(EntityType): + title = String(maxsize=50, required=True) + description = String() + + class BlogEntry(EntityType): + title = String(maxsize=100, required=True) + publish_date = Date(default='TODAY') + text = String(fulltextindexed=True) + category = String(vocabulary=('important','business')) + entry_of = SubjectRelation('Blog', cardinality='?*') + + +Un ``Blog`` a un titre et une description. Le titre est une chaîne +de caractères requise par la classe parente EntityType and ne doit +pas excéder 50 caractères. La description est une chaîne de +caractères sans contraintes. + +Une ``BlogEntry`` a un titre, une date de publication et du texte +étant son contenu. Le titre est une chaîne de caractères qui ne +doit pas excéder 100 caractères. La date de publication est de type Date et a +pour valeur par défaut TODAY, ce qui signifie que lorsqu'une +``BlogEntry`` sera créée, sa date de publication sera la date +courante a moins de modifier ce champ. Le texte est une chaîne de +caractères qui sera indexée en plein texte et sans contraintes. + +Une ``BlogEntry`` a aussi une relation nommée ``entry_of`` qui la +relie à un ``Blog``. La cardinalité ``?*`` signifie que BlogEntry +peut faire partie de zero a un Blog (``?`` signifie `zero ou un`) et +qu'un Blog peut avoir une infinité de BlogEntry (``*`` signifie +`n'importe quel nombre incluant zero`). +Par soucis de complétude, nous rappellerons que ``+`` signifie +`un ou plus`. + +Lancez l'application +-------------------- + +Définir ce simple schéma est suffisant pour commencer. Assurez-vous +que vous avez suivi les étapes décrites dans la section installation +(en particulier visitez http://localhost:8080/_load en tant qu'administrateur +afin d'initialiser le datastore), puis lancez votre application avec la commande :: + + python dev_appserver.py BlogDemo + +puis dirigez vous vers http://localhost:8080/ (ou si c'est plus facile +vous pouvez utiliser la démo en ligne http://lax.appspot.com/). +[FIXME] -- changer la demo en ligne en quelque chose qui marche (!) + +.. image:: images/lax-book.00-login.en.png + :alt: login screen + +Après vous être authentifié, vous arrivez sur la page d'accueil de votre +application. Cette page liste les types d'entités accessibles dans votre +application, en l'occurrence : Blog et Articles. Si vous lisez ``blog_plural`` +et ``blogentry_plural`` cela signifie que l'internationalisation (i18n) +n'a pas encore fonctionné. Ignorez cela pour le moment. + +.. image:: images/lax-book.01-start.en.png + :alt: home page + +Créez des entités système +------------------------- + +Vous ne pourrez créer de nouveaux utilisateurs que dans le cas où vous +avez choisi de ne pas utiliser l'authentification Google. + + +[WRITE ME : create users manages permissions etc] + + + +Créez des entités applicatives +------------------------------ + +Créez un Blog +~~~~~~~~~~~~~ + +Créons à présent quelques entités. Cliquez sur `[+]` sur la +droite du lien Blog. Appelez cette nouvelle entité Blog ``Tech-Blog`` +et tapez pour la description ``everything about technology``, +puis validez le formulaire d'édition en cliquant sur le bouton +``Validate``. + + +.. image:: images/lax-book.02-create-blog.en.png + :alt: from to create blog + +En cliquant sur le logo situé dans le coin gauche de la fenêtre, +vous allez être redirigé vers la page d'accueil. Ensuite, si vous allez +sur le lien Blog, vous devriez voir la liste des entités Blog, en particulier +celui que vous venez juste de créer ``Tech-Blog``. + +.. image:: images/lax-book.03-list-one-blog.en.png + :alt: displaying a list of a single blog + +Si vous cliquez sur ``Tech-Blog`` vous devriez obtenir une description +détaillée, ce qui dans notre cas, n'est rien de plus que le titre +et la phrase ``everything about technology`` + + +.. image:: images/lax-book.04-detail-one-blog.en.png + :alt: displaying the detailed view of a blog + +Maintenant retournons sur la page d'accueil et créons un nouveau +Blog ``MyLife`` et retournons sur la page d'accueil, puis suivons +le lien Blog et nous constatons qu'à présent deux blogs sont listés. + +.. image:: images/lax-book.05-list-two-blog.en.png + :alt: displaying a list of two blogs + +Créons un article +~~~~~~~~~~~~~~~~~ + +Revenons sur la page d'accueil et cliquons sur `[+]` à droite du lien +`articles`. Appellons cette nouvelle entité ``Hello World`` et introduisons +un peut de texte avant de ``Valider``. Vous venez d'ajouter un article +sans avoir précisé à quel Blog il appartenait. Dans la colonne de gauche +se trouve une boite intitulé ``actions``, cliquez sur le menu ``modifier``. +Vous êtes de retour sur le formulaire d'édition de l'article que vous +venez de créer, à ceci près que ce formulaire a maintenant une nouvelle +section intitulée ``ajouter relation``. Choisissez ``entry_of`` dans ce menu, +cela va faire apparaitre une deuxième menu déroulant dans lequel vous +allez pouvoir séléctionner le Blog ``MyLife``. + +Vous auriez pu aussi, au moment où vous avez crée votre article, sélectionner +``appliquer`` au lieu de ``valider`` et le menu ``ajouter relation`` serait apparu. + +.. image:: images/lax-book.06-add-relation-entryof.en.png + :alt: editing a blog entry to add a relation to a blog + +Validez vos modifications en cliquant sur ``Valider``. L'entité article +qui est listée contient maintenant un lien vers le Blog auquel il +appartient, ``MyLife``. + +.. image:: images/lax-book.07-detail-one-blogentry.en.png + :alt: displaying the detailed view of a blogentry + +Rappelez-vous que pour le moment, tout a été géré par la plate-forme +*CubicWeb* et que la seule chose qui a été fournie est le schéma de +données. D'ailleurs pour obtenir une vue graphique du schéma, exécutez +la commande ``laxctl genschema blogdemo`` et vous pourrez visualiser +votre schéma a l'URL suivante : http://localhost:8080/schema + +.. image:: images/lax-book.08-schema.en.png + :alt: graphical view of the schema (aka data-model) + + +Change view permission +~~~~~~~~~~~~~~~~~~~~~~ + + + +Conclusion +---------- + +Exercise +~~~~~~~~ + +Create new blog entries in ``Tech-blog``. + +What we learned +~~~~~~~~~~~~~~~ + +Creating a simple schema was enough to set up a new application that +can store blogs and blog entries. + +What is next ? +~~~~~~~~~~~~~~ + +Although the application is fully functionnal, its look is very +basic. In the following section we will learn to create views to +customize how data is displayed. + + diff -r d4d36b583f40 -r a4fcee1e9789 doc/book/README --- a/doc/book/README Mon Mar 21 18:08:47 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -==== -Book -==== - ----- -Part ----- - -Chapter -======= - -.. _Level1AnchorForLaterReference: - -Level 1 section ---------------- - -Level 2 section -~~~~~~~~~~~~~~~ - -Level 3 section -``````````````` - - - -*CubicWeb* - - -inline directives: - :file:`directory/file` - :envvar:`AN_ENV_VARIABLE` - :command:`command --option arguments` - - :ref:, :mod: - - -.. sourcecode:: python - - class SomePythonCode: - ... - -.. XXX a comment, wont be rendered - - -a [foot note]_ - -.. [foot note] the foot note content - - -Boxes -===== - -- warning box: - .. warning:: - - Warning content -- note box: - .. note:: - - Note content - - - -Cross references -================ - -To arbitrary section --------------------- - -:ref:`identifier` ou :ref:`label ` - -Label required of referencing node which as no title, else the node's title will be used. - - -To API objects --------------- -See the autodoc sphinx extension documentation. Quick overview: - -* ref to a class: :class:`cubicweb.devtools.testlib.AutomaticWebTest` - -* if you can to see only the class name in the generated documentation, add a ~: - :class:`~cubicweb.devtools.testlib.AutomaticWebTest` - -* you can also use :mod: (module), :exc: (exception), :func: (function), :meth: (method)... - -* syntax explained above to specify label explicitly may also be used diff -r d4d36b583f40 -r a4fcee1e9789 doc/book/additionnal_services/index.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/book/additionnal_services/index.rst Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,14 @@ +Additional services +=================== + +In this chapter, we introduce services crossing the *web - +repository - administration* organisation of the first parts of the +CubicWeb book. Those services can be either proper services (like the +undo functionality) or mere *topical cross-sections* across CubicWeb. + +.. toctree:: + :maxdepth: 2 + + undo + + diff -r d4d36b583f40 -r a4fcee1e9789 doc/book/additionnal_services/undo.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/book/additionnal_services/undo.rst Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,337 @@ +Undoing changes in CubicWeb +--------------------------- + +Many desktop applications offer the possibility for the user to +undo its last changes : this *undo feature* has now been +integrated into the CubicWeb framework. This document will +introduce you to the *undo feature* both from the end-user and the +application developer point of view. + +But because a semantic web application and a common desktop +application are not the same thing at all, especially as far as +undoing is concerned, we will first introduce *what* is the *undo +feature* for now. + +What's *undoing* in a CubicWeb application +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +What is an *undo feature* is quite intuitive in the context of a +desktop application. But it is a bit subtler in the context of a +Semantic Web application. This section introduces some of the main +differences between a classical desktop and a Semantic Web +applications to keep in mind in order to state precisely *what we +want*. + +The notion transactions +``````````````````````` + +A CubicWeb application acts upon an *Entity-Relationship* model, +described by a schema. This allows to ensure some data integrity +properties. It also implies that changes are made by all-or-none +groups called *transactions*, such that the data integrity is +preserved whether the transaction is completely applied *or* none +of it is applied. + +A transaction can thus include more actions than just those +directly required by the main purpose of the user. For example, +when a user *just* writes a new blog entry, the underlying +*transaction* holds several *actions* as illustrated below : + +* By admin on 2012/02/17 15:18 - Created Blog entry : Torototo + + #. Created Blog entry : Torototo + #. Added relation : Torototo owned by admin + #. Added relation : Torototo blog entry of Undo Blog + #. Added relation : Torototo in state draft (draft) + #. Added relation : Torototo created by admin + +Because of the very nature (all-or-none) of the transactions, the +"undoable stuff" are the transactions and not the actions ! + +Public and private actions within a transaction +``````````````````````````````````````````````` + +Actually, within the *transaction* "Created Blog entry : +Torototo", two of those *actions* are said to be *public* and +the others are said to be *private*. *Public* here means that the +public actions (1 and 3) were directly requested by the end user ; +whereas *private* means that the other actions (2, 4, 5) were +triggered "under the hood" to fulfill various requirements for the +user operation (ensuring integrity, security, ... ). + +And because quite a lot of actions can be triggered by a "simple" +end-user request, most of which the end-user is not (and does not +need or wish to be) aware, only the so-called public actions will +appear [1]_ in the description of the an undoable transaction. + +* By admin on 2012/02/17 15:18 - Created Blog entry : Torototo + + #. Created Blog entry : Torototo + #. Added relation : Torototo blog entry of Undo Blog + +But note that both public and private actions will be undone +together when the transaction is undone. + +(In)dependent transactions : the simple case +```````````````````````````````````````````` + +A CubicWeb application can be used *simultaneously* by different users +(whereas a single user works on an given office document at a +given time), so that there is not always a single history +time-line in the CubicWeb case. Moreover CubicWeb provides +security through the mechanism of *permissions* granted to each +user. This can lead to some transactions *not* being undoable in +some contexts. + +In the simple case two (unprivileged) users Alice and Bob make +relatively independent changes : then both Alice and Bob can undo +their changes. But in some case there is a clean dependency +between Alice's and Bob's actions or between actions of one of +them. For example let's suppose that : + +- Alice has created a blog, +- then has published a first post inside, +- then Bob has published a second post in the same blog, +- and finally Alice has updated its post contents. + +Then it is clear that Alice can undo her contents changes and Bob +can undo his post creation independently. But Alice can not undo +her post creation while she has not first undone her changes. +It is also clear that Bob should *not* have the +permissions to undo any of Alice's transactions. + + +More complex dependencies between transactions +`````````````````````````````````````````````` + +But more surprising things can quickly happen. Going back to the +previous example, Alice *can* undo the creation of the blog after +Bob has published its post in it ! But this is possible only +because the schema does not *require* for a post to be in a +blog. Would the *blog entry of* relation have been mandatory, then +Alice could not have undone the blog creation because it would +have broken integrity constraint for Bob's post. + +When a user attempts to undo a transaction the system will check +whether a later transaction has explicit dependency on the +would-be-undone transaction. In this case the system will not even +attempt the undo operation and inform the user. + +If no such dependency is detected the system will attempt the undo +operation but it can fail, typically because of integrity +constraint violations. In such a case the undo operation is +completely [3]_ rollbacked. + + +The *undo feature* for CubicWeb end-users +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The exposition of the undo feature to the end-user through a Web +interface is still quite basic and will be improved toward a +greater usability. But it is already fully functional. For now +there are two ways to access the *undo feature* as long as the it +has been activated in the instance configuration file with the +option *undo-support=yes*. + +Immediately after having done the change to be canceled through +the **undo** link in the message. This allows to undo an +hastily action immediately. For example, just after having +validated the creation of the blog entry *A second blog entry* we +get the following message, allowing to undo the creation. + +.. image:: /images/undo_mesage_w600.png + :width: 600px + :alt: Screenshot of the undo link in the message + :align: center + +At any time we can access the **undo-history view** accessible from the +start-up page. + +.. image:: /images/undo_startup-link_w600.png + :width: 600px + :alt: Screenshot of the startup menu with access to the history view + :align: center + +This view will provide inspection of the transaction and their (public) +actions. Each transaction provides its own **undo** link. Only the +transactions the user has permissions to see and undo will be shown. + +.. image:: /images/undo_history-view_w600.png + :width: 600px + :alt: Screenshot of the undo history main view + :align: center + +If the user attempts to undo a transaction which can't be undone or +whose undoing fails, then a message will explain the situation and +no partial undoing will be left behind. + +This is all for the end-user side of the undo mechanism : this is +quite simple indeed ! Now, in the following section, we are going +to introduce the developer side of the undo mechanism. + +The *undo feature* for CubicWeb application developers +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A word of warning : this section is intended for developers, +already having some knowledge of what's under CubicWeb's hood. If +it is not *yet* the case, please refer to CubicWeb documentation +http://docs.cubicweb.org/ . + +Overview +```````` + +The core of the undo mechanisms is at work in the *native source*, +beyond the RQL. This does mean that *transactions* and *actions* +are *no entities*. Instead they are represented at the SQL level +and exposed through the *DB-API* supported by the repository +*Connection* objects. + +Once the *undo feature* has been activated in the instance +configuration file with the option *undo-support=yes*, each +mutating operation (cf. [2]_) will be recorded in some special SQL +table along with its associated transaction. Transaction are +identified by a *txuuid* through which the functions of the +*DB-API* handle them. + +On the web side the last commited transaction *txuuid* is +remembered in the request's data to allow for imediate undoing +whereas the *undo-history view* relies upon the *DB-API* to list +the accessible transactions. The actual undoing is performed by +the *UndoController* accessible at URL of the form +`www.my.host/my/instance/undo?txuuid=...` + +The repository side +``````````````````` + +Please refer to the file `cubicweb/server/sources/native.py` and +`cubicweb/transaction.py` for the details. + +The undoing information is mainly stored in three SQL tables: + +`transactions` + Stores the txuuid, the user eid and the date-and-time of + the transaction. This table is referenced by the two others. + +`tx_entity_actions` + Stores the undo information for actions on entities. + +`tx_relation_actions` + Stores the undo information for the actions on relations. + +When the undo support is activated, entries are added to those +tables for each mutating operation on the data repository, and are +deleted on each transaction undoing. + +Those table are accessible through the following methods of the +repository `Connection` object : + +`undoable_transactions` + Returns a list of `Transaction` objects accessible to the user + and according to the specified filter(s) if any. + +`tx_info` + Returns a `Transaction` object from a `txuuid` + +`undo_transaction` + Returns the list of `Action` object for the given `txuuid`. + + NB: By default it only return *public* actions. + +The web side +```````````` + +The exposure of the *undo feature* to the end-user through the Web +interface relies on the *DB-API* introduced above. This implies +that the *transactions* and *actions* are not *entities* linked by +*relations* on which the usual views can be applied directly. + +That's why the file `cubicweb/web/views/undohistory.py` defines +some dedicated views to access the undo information : + +`UndoHistoryView` + This is a *StartupView*, the one accessible from the home + page of the instance which list all transactions. + +`UndoableTransactionView` + This view handles the display of a single `Transaction` object. + +`UndoableActionBaseView` + This (abstract) base class provides private methods to build + the display of actions whatever their nature. + +`Undoable[Add|Remove|Create|Delete|Update]ActionView` + Those views all inherit from `UndoableActionBaseView` and + each handles a specific kind of action. + +`UndoableActionPredicate` + This predicate is used as a *selector* to pick the appropriate + view for actions. + +Apart from this main *undo-history view* a `txuuid` is stored in +the request's data `last_undoable_transaction` in order to allow +immediate undoing of a hastily validated operation. This is +handled in `cubicweb/web/application.py` in the `main_publish` and +`add_undo_link_to_msg` methods for the storing and displaying +respectively. + +Once the undo information is accessible, typically through a +`txuuid` in an *undo* URL, the actual undo operation can be +performed by the `UndoController` defined in +`cubicweb/web/views/basecontrollers.py`. This controller basically +extracts the `txuuid` and performs a call to `undo_transaction` and +in case of an undo-specific error, lets the top level publisher +handle it as a validation error. + + +Conclusion +~~~~~~~~~~ + +The undo mechanism relies upon a low level recording of the +mutating operation on the repository. Those records are accessible +through some method added to the *DB-API* and exposed to the +end-user either through a whole history view of through an +immediate undoing link in the message box. + +The undo feature is functional but the interface and configuration +options are still quite reduced. One major improvement would be to +be able to filter with a finer grain which transactions or actions +one wants to see in the *undo-history view*. Another critical +improvement would be to enable the undo feature on a part only of +the entity-relationship schema to avoid storing too much useless +data and reduce the underlying overhead. + +But both functionality are related to the strong design choice not +to represent transactions and actions as entities and +relations. This has huge benefits in terms of safety and conceptual +simplicity but prevents from using lots of convenient CubicWeb +features such as *facets* to access undo information. + +Before developing further the undo feature or eventually revising +this design choice, it appears that some return of experience is +strongly needed. So don't hesitate to try the undo feature in your +application and send us some feedback. + + +Notes +~~~~~ + +.. [1] The end-user Web interface could be improved to enable + user to choose whether he wishes to see private actions. + +.. [2] There is only five kind of elementary actions (beyond + merely accessing data for reading): + + * **C** : creating an entity + * **D** : deleting an entity + * **U** : updating an entity attributes + * **A** : adding a relation + * **R** : removing a relation + +.. [3] Meaning none of the actions in the transaction is + undone. Depending upon the application, it might make sense + to enable *partial* undo. That is to say undo in which some + actions could not be undo without preventing to undo the + others actions in the transaction (as long as it does not + break schema integrity). This is not forbidden by the + back-end but is deliberately not supported by the front-end + (for now at least). diff -r d4d36b583f40 -r a4fcee1e9789 doc/book/admin/additional-tips.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/book/admin/additional-tips.rst Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,64 @@ + +.. _Additional Tips: + +Backups (mostly with postgresql) +-------------------------------- + +It is always a good idea to backup. If your system does not do that, +you should set it up. Note that whenever you do an upgrade, +`cubicweb-ctl` offers you to backup your database. There are a number +of ways for doing backups. + +Using postgresql (and only that) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Before you +go ahead, make sure the following permissions are correct :: + + # chgrp postgres /var/lib/cubicweb/backup + # chmod g+ws /var/lib/cubicweb/backup + # chgrp postgres /etc/cubicweb.d/**/sources + # chmod g+r /etc/cubicweb.d/**/sources + +Simply use the pg_dump in a cron installed for `postgres` user on the database server:: + + # m h dom mon dow command + 0 2 * * * pg_dump -Fc --username=cubicweb --no-owner > /var/backups/-$(date '+%Y-%m-%d_%H:%M:%S').dump + +Using :command:`cubicweb-ctl db-dump` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The CubicWeb way is to use the :command:`db-dump` command. For that, +you have to put your passwords in a user-only-readable file at the +home directory of root user. The file is `.pgpass` (`chmod 0600`), in +this case for a socket run connection to PostgreSQL :: + + /var/run/postgresql:5432::: + +The postgres documentation for the `.pgpass` format can be found `here`_ + +Then add the following command to the crontab of the user (`crontab -e`):: + + # m h dom mon dow command + 0 2 * * * cubicweb-ctl db-dump + + +Backup ninja +~~~~~~~~~~~~ + +You can use a combination `backup-ninja`_ (which has a postgres script in the +example directory), `backuppc`)_ (for versionning). + +Please note that in the *CubicWeb way* it adds a second location for your +password which is error-prone. + +.. _`here` : http://www.postgresql.org/docs/current/static/libpq-pgpass.html +.. _`backup-ninja` : https://labs.riseup.net/code/projects/show/backupninja/ +.. _`backuppc` : http://backuppc.sourceforge.net/ + +.. warning:: + + Remember that these indications will fail you whenever you use + another database backend than postgres. Also it does properly handle + externally managed data such as files (using the Bytes File System + Storage). diff -r d4d36b583f40 -r a4fcee1e9789 doc/book/admin/config.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/book/admin/config.rst Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,229 @@ +.. -*- coding: utf-8 -*- + +.. _ConfigEnv: + +Set-up of a *CubicWeb* environment +================================== + +You can `configure the database`_ system of your choice: + + - `PostgreSQL configuration`_ + - `MySql configuration`_ + - `SQLServer configuration`_ + - `SQLite configuration`_ + +For advanced features, have a look to: + + - `Cubicweb resources configuration`_ + +.. _`configure the database`: DatabaseInstallation_ +.. _`PostgreSQL configuration`: PostgresqlConfiguration_ +.. _`MySql configuration`: MySqlConfiguration_ +.. _`SQLServer configuration`: SQLServerConfiguration_ +.. _`SQLite configuration`: SQLiteConfiguration_ +.. _`Cubicweb resources configuration`: RessourcesConfiguration_ + + + +.. _RessourcesConfiguration: + +Cubicweb resources configuration +-------------------------------- + +.. autodocstring:: cubicweb.cwconfig + + +.. _DatabaseInstallation: + +Databases configuration +----------------------- + +Each instance can be configured with its own database connection information, +that will be stored in the instance's :file:`sources` file. The database to use +will be chosen when creating the instance. CubicWeb is known to run with +Postgresql (recommended), SQLServer and SQLite, and may run with MySQL. + +Other possible sources of data include CubicWeb, Subversion, LDAP and Mercurial, +but at least one relational database is required for CubicWeb to work. You do +not need to install a backend that you do not intend to use for one of your +instances. SQLite is not fit for production use, but it works well for testing +and ships with Python, which saves installation time when you want to get +started quickly. + +.. _PostgresqlConfiguration: + +PostgreSQL +~~~~~~~~~~ + +Many Linux distributions ship with the appropriate PostgreSQL packages. +Basically, you need to install the following packages: + +* `postgresql` and `postgresql-client`, which will pull the respective + versioned packages (e.g. `postgresql-9.1` and `postgresql-client-9.1`) and, + optionally, +* a `postgresql-plpython-X.Y` package with a version corresponding to that of + the aforementioned packages (e.g. `postgresql-plpython-9.1`). + +If you run postgres version prior to 8.3, you'll also need the +`postgresql-contrib-8.X` package for full-text search extension. + +If you run postgres on another host than the |cubicweb| repository, you should +install the `postgresql-client` package on the |cubicweb| host, and others on the +database host. + +For extra details concerning installation, please refer to the `PostgreSQL +project online documentation`_. + +.. _`PostgreSQL project online documentation`: http://www.postgresql.org/docs + + +Database cluster +++++++++++++++++ + +If you already have an existing cluster and PostgreSQL server running, you do +not need to execute the initilization step of your PostgreSQL database unless +you want a specific cluster for |cubicweb| databases or if your existing +cluster doesn't use the UTF8 encoding (see note below). + +To initialize a PostgreSQL cluster, use the command ``initdb``:: + + $ initdb -E UTF8 -D /path/to/pgsql + +Notice the encoding specification. This is necessary since |cubicweb| usually +want UTF8 encoded database. If you use a cluster with the wrong encoding, you'll +get error like:: + + new encoding (UTF8) is incompatible with the encoding of the template database (SQL_ASCII) + HINT: Use the same encoding as in the template database, or use template0 as template. + +Once initialized, start the database server PostgreSQL with the command:: + + $ postgres -D /path/to/psql + +If you cannot execute this command due to permission issues, please make sure +that your username has write access on the database. :: + + $ chown username /path/to/pgsql + +Database authentication ++++++++++++++++++++++++ + +The database authentication is configured in `pg_hba.conf`. It can be either set +to `ident sameuser` or `md5`. If set to `md5`, make sure to use an existing +user of your database. If set to `ident sameuser`, make sure that your client's +operating system user name has a matching user in the database. If not, please +do as follow to create a user:: + + $ su + $ su - postgres + $ createuser -s -P username + +The option `-P` (for password prompt), will encrypt the password with the +method set in the configuration file :file:`pg_hba.conf`. If you do not use this +option `-P`, then the default value will be null and you will need to set it +with:: + + $ su postgres -c "echo ALTER USER username WITH PASSWORD 'userpasswd' | psql" + +The above login/password will be requested when you will create an instance with +`cubicweb-ctl create` to initialize the database of your instance. + +Notice that the `cubicweb-ctl db-create` does database initialization that +may requires a postgres superuser. That's why a login/password is explicitly asked +at this step, so you can use there a superuser without using this user when running +the instance. Things that require special privileges at this step: + +* database creation, require the 'create database' permission +* install the plpython extension language (require superuser) +* install the tsearch extension for postgres version prior to 8.3 (require superuser) + +To avoid using a super user each time you create an install, a nice trick is to +install plpython (and tsearch when needed) on the special `template1` database, +so they will be installed automatically when cubicweb databases are created +without even with needs for special access rights. To do so, run :: + + # Installation of plpythonu language by default :: + $ createlang -U pgadmin plpythonu template1 + $ psql -U pgadmin template1 + template1=# update pg_language set lanpltrusted=TRUE where lanname='plpythonu'; + +Where `pgadmin` is a postgres superuser. The last command is necessary since by +default plpython is an 'untrusted' language and as such can't be used by non +superuser. This update fix that problem by making it trusted. + +To install the tsearch plain-text index extension on postgres prior to 8.3, run:: + + cat /usr/share/postgresql/8.X/contrib/tsearch2.sql | psql -U username template1 + + +.. _MySqlConfiguration: + +MySql +~~~~~ +.. warning:: + CubicWeb's MySQL support is not commonly used, so things may or may not work properly. + +You must add the following lines in ``/etc/mysql/my.cnf`` file:: + + transaction-isolation=READ-COMMITTED + default-storage-engine=INNODB + default-character-set=utf8 + max_allowed_packet = 128M + +.. Note:: + It is unclear whether mysql supports indexed string of arbitrary length or + not. + + +.. _SQLServerConfiguration: + +SQLServer +~~~~~~~~~ + +As of this writing, support for SQLServer 2005 is functional but incomplete. You +should be able to connect, create a database and go quite far, but some of the +SQL generated from RQL queries is still currently not accepted by the +backend. Porting to SQLServer 2008 is also an item on the backlog. + +The `source` configuration file may look like this (specific parts only are +shown):: + + [system] + db-driver=sqlserver2005 + db-user=someuser + # database password not needed + #db-password=toto123 + #db-create/init may ask for a pwd: just say anything + db-extra-arguments=Trusted_Connection + db-encoding=utf8 + + +You need to change the default settings on the database by running:: + + ALTER DATABASE SET READ_COMMITTED_SNAPSHOT ON; + +The ALTER DATABASE command above requires some permissions that your +user may not have. In that case you will have to ask your local DBA to +run the query for you. + +You can check that the setting is correct by running the following +query which must return '1':: + + SELECT is_read_committed_snapshot_on + FROM sys.databases WHERE name=''; + + + +.. _SQLiteConfiguration: + +SQLite +~~~~~~ + +SQLite has the great advantage of requiring almost no configuration. Simply +use 'sqlite' as db-driver, and set path to the dabase as db-name. Don't specify +anything for db-user and db-password, they will be ignore anyway. + +.. Note:: + SQLite is great for testing and to play with cubicweb but is not suited for + production environments. + diff -r d4d36b583f40 -r a4fcee1e9789 doc/book/admin/create-instance.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/book/admin/create-instance.rst Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,100 @@ +.. -*- coding: utf-8 -*- + +Creation of your first instance +=============================== + +Instance creation +----------------- + +Now that we created a cube, we can create an instance and access it via a web +browser. We will use a `all-in-one` configuration to simplify things :: + + cubicweb-ctl create -c all-in-one mycube myinstance + +.. note:: + Please note that we created a new cube for a demo purposes but + you could have used an existing cube available in our standard library + such as blog or person for example. + +A series of questions will be prompted to you, the default answer is usually +sufficient. You can anyway modify the configuration later on by editing +configuration files. When a login/password are requested to access the database +please use the credentials you created at the time you configured the database +(:ref:`PostgresqlConfiguration`). + +It is important to distinguish here the user used to access the database and the +user used to login to the cubicweb instance. When an instance starts, it uses +the login/password for the database to get the schema and handle low level +transaction. But, when :command:`cubicweb-ctl create` asks for a manager +login/psswd of *CubicWeb*, it refers to the user you will use during the +development to administrate your web instance. It will be possible, later on, +to use this user to create other users for your final web instance. + + +Instance administration +----------------------- + +start / stop +~~~~~~~~~~~~ + +When this command is completed, the definition of your instance is +located in :file:`~/etc/cubicweb.d/myinstance/*`. To launch it, you +just type :: + + cubicweb-ctl start -D myinstance + +The option `-D` specifies the *debug mode* : the instance is not +running in server mode and does not disconnect from the terminal, +which simplifies debugging in case the instance is not properly +launched. You can see how it looks by visiting the URL +`http://localhost:8080` (the port number depends of your +configuration). To login, please use the cubicweb administrator +login/password you defined when you created the instance. + +To shutdown the instance, Crtl-C in the terminal window is enough. +If you did not use the option `-D`, then type :: + + cubicweb-ctl stop myinstance + +This is it! All is settled down to start developping your data model... + +.. note:: + + The output of `cubicweb-ctl start -D myinstance` can be + overwhelming. It is possible to reduce the log level with the + `--loglevel` parameter as in `cubicweb-ctl start -D myinstance -l + info` to filter out all logs under `info` gravity. + +upgrade +~~~~~~~ + +A manual upgrade step is necessary whenever a new version of CubicWeb or +a cube is installed, in order to synchronise the instance's +configuration and schema with the new code. The command is:: + + cubicweb-ctl upgrade myinstance + +A series of questions will be asked. It always starts with a proposal +to make a backup of your sources (where it applies). Unless you know +exactly what you are doing (i.e. typically fiddling in debug mode, but +definitely NOT migrating a production instance), you should answer YES +to that. + +The remaining questions concern the migration steps of |cubicweb|, +then of the cubes that form the whole application, in reverse +dependency order. + +In principle, if the migration scripts have been properly written and +tested, you should answer YES to all questions. + +Somtimes, typically while debugging a migration script, something goes +wrong and the migration fails. Unfortunately the databse may be in an +incoherent state. You have two options here: + +* fix the bug, restore the database and restart the migration process + from scratch (quite recommended in a production environement) + +* try to replay the migration up to the last successful commit, that + is answering NO to all questions up to the step that failed, and + finish by answering YES to the remaining questions. + diff -r d4d36b583f40 -r a4fcee1e9789 doc/book/admin/cubicweb-ctl.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/book/admin/cubicweb-ctl.rst Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,111 @@ +.. -*- coding: utf-8 -*- + +.. _cubicweb-ctl: + +``cubicweb-ctl`` tool +===================== + +`cubicweb-ctl` is the swiss knife to manage *CubicWeb* instances. +The general syntax is :: + + cubicweb-ctl [options command] + +To view available commands :: + + cubicweb-ctl + cubicweb-ctl --help + +Please note that the commands available depends on the *CubicWeb* packages +and cubes that have been installed. + +To view the help menu on specific command :: + + cubicweb-ctl --help + +Listing available cubes and instance +------------------------------------- + +* ``list``, provides a list of the available configuration, cubes + and instances. + + +Creation of a new cube +----------------------- + +Create your new cube cube :: + + cubicweb-ctl newcube + +This will create a new cube in +``/path/to/grshell-cubicweb/cubes/`` for a Mercurial +installation, or in ``/usr/share/cubicweb/cubes`` for a debian +packages installation. + +Create an instance +------------------- + +You must ensure `~/etc/cubicweb.d/` exists prior to this. On windows, the +'~' part will probably expand to 'Documents and Settings/user'. + +To create an instance from an existing cube, execute the following +command :: + + cubicweb-ctl create + +This command will create the configuration files of an instance in +``~/etc/cubicweb.d/``. + +The tool ``cubicweb-ctl`` executes the command ``db-create`` and +``db-init`` when you run ``create`` so that you can complete an +instance creation in a single command. But of course it is possible +to issue these separate commands separately, at a later stage. + +Command to create/initialize an instance database +------------------------------------------------- + +* ``db-create``, creates the system database of an instance (tables and + extensions only) +* ``db-init``, initializes the system database of an instance + (schema, groups, users, workflows...) + +Commands to control instances +----------------------------- + +* ``start``, starts one or more or all instances + +of special interest:: + + start -D + +will start in debug mode (under windows, starting without -D will not +work; you need instead to setup your instance as a service). + +* ``stop``, stops one or more or all instances +* ``restart``, restarts one or more or all instances +* ``status``, returns the status of the instance(s) + +Commands to maintain instances +------------------------------ + +* ``upgrade``, launches the existing instances migration when a new version + of *CubicWeb* or the cubes installed is available +* ``shell``, opens a (Python based) migration shell for manual maintenance of the instance +* ``db-dump``, creates a dump of the system database +* ``db-restore``, restores a dump of the system database +* ``db-check``, checks data integrity of an instance. If the automatic correction + is activated, it is recommanded to create a dump before this operation. +* ``schema-sync``, synchronizes the persistent schema of an instance with + the instance schema. It is recommanded to create a dump before this operation. + +Commands to maintain i18n catalogs +---------------------------------- +* ``i18ncubicweb``, regenerates messages catalogs of the *CubicWeb* library +* ``i18ncube``, regenerates the messages catalogs of a cube +* ``i18ninstance``, recompiles the messages catalogs of an instance. + This is automatically done while upgrading. + +See also chapter :ref:`internationalization`. + +Other commands +-------------- +* ``delete``, deletes an instance (configuration files and database) diff -r d4d36b583f40 -r a4fcee1e9789 doc/book/admin/index.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/book/admin/index.rst Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,28 @@ +.. -*- coding: utf-8 -*- + +.. _Part3: + +-------------- +Administration +-------------- + +This part is for installation and administration of the *CubicWeb* framework and +instances based on that framework. + +.. toctree:: + :maxdepth: 1 + :numbered: + + setup + setup-windows + config + cubicweb-ctl + create-instance + instance-config + site-config + multisources + ldap + migration + additional-tips + rql-logs + diff -r d4d36b583f40 -r a4fcee1e9789 doc/book/admin/instance-config.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/book/admin/instance-config.rst Thu Mar 24 09:43:25 2016 +0100 @@ -0,0 +1,200 @@ +.. -*- coding: utf-8 -*- + + +Configure an instance +===================== + +While creating an instance, a configuration file is generated in:: + + $ (CW_INSTANCES_DIR) / / .conf + +For example:: + + /etc/cubicweb.d/myblog/all-in-one.conf + +It is a simple text file in the INI format +(http://en.wikipedia.org/wiki/INI_file). In the following description, +each option name is prefixed with its own section and followed by its +default value if necessary, e.g. "`
        .